<child @hook:updated="childUpdateHandle" />
这种写法常常用于给第三方组件的生命周期添加方法,比如第三方的table组件没有loading效果,我们可以给第三方组件添加mounted事件等。
vm.$on('hooks:created', cb) vm.$on('hooks:created', cb)
这种写法使得代码的可读性增加,如遇到以下场景,我们需要在组件挂载完成的时候添加一个监听事件,等组件销毁等时候要删除该监听等事件。
export default { mounted() { // 监听窗口发生变化,resize组件 window.addEventListener('resize', this.resizeHandle) // 通过hook监听组件销毁钩子函数,并取消监听事件 this.$once('hook:beforeDestroy', () => { window.removeEventListener('resize', this.resizeHandle) }) }, updated() {}, created() {}, methods: { resizeHandle() { // ... } } }
有时候我们需要封装自己等输入框组件,那么v-model是必须的,在理解v-model之前我们需要了解平时所在原生input上使用v-model的原理。
<input v-model="searchText">
等价于
<input v-bind:value="searchText" v-on:input="searchText = $event.target.value" >
当用在组件上时,v-model 则会这样:
<custom-input v-bind:value="searchText" v-on:input="searchText = $event" ></custom-input>
为了让它正常工作,这个组件内的 input 必须:
现在 v-model 就应该可以在这个组件上完美地工作起来了:
<custom-input v-model="searchText"></custom-input>
由于数据嵌套过深,数据改变了,但是视图没有更新,可以使用
vm.$forceUpdate()
迫使 Vue 实例重新渲染。注意它仅仅影响实例本身和插入插槽内容的子组件,而不是所有子组件
在实例创建之后添加新的属性到实例上,它不会触发视图更新。
受现代 JavaScript 的限制 (以及废弃 Object.observe),Vue 不能检测到对象属性的添加或删除。由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让它是响应的。
向响应式对象中添加一个 property,并确保这个新 property 同样是响应式的,且触发视图更新。它必须用于向响应式对象上添加新 property,因为 Vue 无法探测普通的新增 property (比如 this.myObject.newProperty = 'hi')
this.$set(this.obj,'newPro','value')
对一个组件进行包装,我们要继承组件对属性与事件,那么**v-bind="listeners"**将使封装变得简单。
<template> <childComponent v-bind="$attrs" /> </template>
而不是
<template> <childComponent :prop1="prop1" :prop2="prop2" :prop="prop3" ... /> </template>
<template> <childComponentv-on="$listeners" /> </template>
如果你引入第三方组件中的页面使用scoped属性,那么想修改第三方组件的样式可以使用深层选择器 >>> /deep/ ::v-deep
<style scoped> >>> .vant-class { color: gray; } /deep/ .vant-class { color: gray; } ::v-deep .vant-class { color: gray; } </style>