父组件,以visible属性为例
<RawDataUploadDialog :visible.sync="visibleUpload" :industry="filterConfig.industry" @refresh="queryApi"></RawDataUploadDialog>
子组件,监听父组件visible变化,并做操作
以dialog为例,此处visible不能直接用父组件传进来的visible属性
<el-dialog
:visible.sync="show"
父组件的属性这里需要接收,声明type值
props: {
visible: {
type: Boolean,
default: false,
}
},
data里声明show属性,初始值设置为父组件visible属性
data() {
return {
show: this.visible,
};
}
在watch里监听父组件visible变化,当visible发生改变时更改子组件中show的值,watch中的show监听的是子组件的show属性,当show发生改变时,通过$emit方法触发父组件visible的更新,父组件声明visible属性时sync代表同步的意思,代表此属性是需要父子组件同步更新的
watch: {
show(v) {
this.$emit('update:visible', v);
},
visible(v) {
this.show = v;
if (v) this.queryApi();
},
},
immediate属性
使用watch时有一个特点,就是当值第一次绑定的时候,不会执行监听函数,只有值发生改变才会执行。如果我们需要在最初绑定值的时候也执行函数,则就需要用到immediate属性。
immediate:true代表如果在 wacth 里声明了 visible 之后,就会立即先去执行里面的handler方法,如果为 false就跟我们以前的效果一样,不会在绑定的时候就执行。
'visible': {
handler(v) {
if (!v) {
this.show = false;
this.$emit('refresh');
}
},
immediate:true //此时会直接执行handler方法
}