这是我参与更文挑战的第7天,活动详情查看:更文挑战
1、$nextTick: 用于延迟执行一段代码,当你需要操作dom时,将dom操作的js放在this.nextTick()的回调函数中。
// $refs
this.$nextTick(() => {
this.$refs['form'].resetFields()
})
2、watch 监听
watch: {
currentCode(val, oldVal){//普通的watch监听-一般用于字符串、数值、布尔
console.log("currentCode: "+val, oldVal);
},
// 深度监听,可监听到对象、数组的变化
formData: {
// 即监听到变化时应该执行的函数。
handler(val, oldVal) {
console.log("formData: "+val.c, oldVal.c);
},
immediate: true, // 确认是否以当前的初始值执行handler的函数
deep: true // 确认是否深入监听
}
}
对于immediate和deep,我有以下理解:
- immediate设为true后,则监听的这个对象会立即输出,也就是说一刷新页面就会在控制台输出,当然此时页面上的数据我们还没来得及手动让其发生变化,所以在控制台输出的newValue为我们在代码中默认设置的值,oldValue输出为“undefined”。
- 如果不设置immediate,或者将immediate设为false的话,则刷新页面后不会立即监听此对象,也就是控制台不会有输出,必须要监听的对象有值改变时控制台才会有输出。
- 需要监听复杂数据(对象)内部属性的变化时,设置deep属性。Vue会递归的侦听数据和属性的变化(性能消耗较大)。也就是给所有数据和属性添加handler执行函数。
总结:
watch监听只有在数据变化时才会执行监听函数。父组件向子组件动态传值时,子组件props首次获取到父组件传来的默认值时,此时也需要执行watch监听函数。则需设置immediate:true.
需要深度监听,设置deep:true
3、常用的修饰符
v-model修饰符
加上.lazy后相当于 双向数据绑定不起作用了,当输入框失去焦点后触发change事件后更新,慎用!
<input type="text" v-model:lazy="value"/>
输入框过滤收尾的空格:
<input type="text" v-model:trim="value">
强制转换为Number类型,(如果原值的转换结果为NaN, 则返回原值)
<input type="text" v-model:number="value">
在输入值 在输出的时候会被转换为string类型
<input type="number" v-model='order'>
阻止事件冒泡,相当于调用了event.stopPropagation()方法:
<button @click.stop="test"></button>
阻止默认行为,相当于调用了event.preventDefault()方法,比如表单的提交、a标签的跳转就是默认事件:
<button @click.prevent="test"></button>
只有点击元素本身才会触发:
<button @click.self="test"></button>
事件只能用一次,无论点击几次,执行一次之后都不会再执行:
<button @click.once="test"></button>
对prop进行双向绑定:
.sync