首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

你绝对疏忽的 vue 技巧-一

1. 内部监听生命周期函数

export?default?{

mounted()?{

this.chart?=?echarts.init(this.$el)

//?请求数据,赋值数据?等等一系列操作...

//?监听窗口发生变化,resize组件

window.addEventListener('resize',?this.$_handleResizeChart)

},

updated()?{

//?干了一堆活

},

created()?{

//?干了一堆活

},

beforeDestroy()?{

//?组件销毁时,销毁监听事件

window.removeEventListener('resize',?this.$_handleResizeChart)

},

methods:?{

$_handleResizeChart()?{

this.chart.resize()

},

//?其他一堆方法

}

}

功能写完开开心心的提测了,测试没啥问题,产品经理表示做的很棒。然而code review时候,技术大佬说了,这样有问题。大佬:这样写不是很好,应该将监听resize事件与销毁resize事件放到一起,现在两段代码分开而且相隔几百行代码,可读性比较差

我:那我把两个生命周期钩子函数位置换一下,放到一起?

大佬:hook听过没?

我:Vue3.0才有啊,咋,咱要升级Vue?

export?default?{

mounted()?{

this.chart?=?echarts.init(this.$el)

//?请求数据,赋值数据?等等一系列操作...

//?监听窗口发生变化,resize组件

window.addEventListener('resize',?this.$_handleResizeChart)

//?通过hook监听组件销毁钩子函数,并取消监听事件

this.$once('hook:beforeDestroy',?()?=>?{

window.removeEventListener('resize',?this.$_handleResizeChart)

})

},

updated()?{},

created()?{},

methods:?{

$_handleResizeChart()?{

//?this.chart.resize()

}

}

}

看完代码,恍然大悟,大佬不愧是大佬,原来Vue还可以这样监听生命周期函数。在Vue组件中,可以用过

once去监听所有的生命周期钩子函数,如监听组件的updated钩子函数可以写成 this.$on('hook:updated', () => {})

2. 外部监听生命周期函数

今天同事在公司群里问,想在外部监听组件的生命周期函数,有没有办法啊?为什么会有这样的需求呢,原来同事用了一个第三方组件,需要监听第三方组件数据的变化,但是组件又没有提供change事件,同事也没办法了,才想出来要去在外部监听组件的updated钩子函数。查看了一番资料,发现Vue支持在外部监听组件的生命周期钩子函数。

import?CustomSelect?from?'../components/custom-select'

export?default?{

components:?{

CustomSelect

},

methods:?{

$_handleSelectUpdated()?{

console.log('custom-select组件的updated钩子函数被触发')

}

}

}

小项目还用Vuex?用Vue.observable手写一个状态管理吧

import?Vue?from?'vue'

//?通过Vue.observable创建一个可响应的对象

export?const?store?=?Vue.observable({

userInfo:?{},

roleIds:?[]

})

//?定义?mutations,?修改属性

export?const?mutations?=?{

setUserInfo(userInfo)?{

store.userInfo?=?userInfo

},

setRoleIds(roleIds)?{

store.roleIds?=?roleIds

}

}

在组件中引用

{{?userInfo.name?}}

import?{?store,?mutations?}?from?'../store'

export?default?{

computed:?{

userInfo()?{

return?store.userInfo

}

},

created()?{

mutations.setUserInfo({

name:?'子君'

})

}

}

开发全局组件,你可能需要了解一下Vue.extendVue.extend是一个全局Api,平时我们在开发业务的时候很少会用到它,但有时候我们希望可以开发一些全局组件比如Loading,Notify,Message等组件时,这时候就可以使用Vue.extend。同学们在使用element-ui的loading时,在代码中可能会这样写

//?显示loading

const?loading?=?this.$loading()

//?关闭loading

loading.close()

这样写可能没什么特别的,但是如果你这样写

const?loading?=?this.$loading()

const?loading1?=?this.$loading()

setTimeout(()?=>?{

loading.close()

},?1000?*?3)

这时候你会发现,我调用了两次loading,但是只出现了一个,而且我只关闭了loading,但是loading1也被关闭了。这是怎么实现的呢?我们现在就是用Vue.extend + 单例模式去实现一个loading

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200630A0T6ED00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com