1、使用场景
当我需要对一个 prop 进行“双向绑定的时候,通常用在封装弹窗组件的时候来进行使用,当然也会有其他的使用场景,只要涉及到父子组件之间需要传参的都可以使用,尽量不要使用watch监听来进行修改值,也不要尝试直接修改props传过来的参数,可以参考官网单向数据流的方式处理。
2、.sync使用方式
- 以下是element封装的dialog弹窗组件,就是使用了.sync修饰符来进行控制是否弹出,我们要在项目中对dialog组件进行一个二次封装,也使用.sync的方式来实现。
- 子组件代码部分
1、props接收dialogVisible,并赋值给el-dialog组件;
2、通过点击事件出发emit事件;
3、通过为 this.$emit(‘update:dialogVisible’,false),update是固定的,后面的是你需要改变的值,要和你props传过来的值保持一致;
4、修改后的值会更新到父组件;
// 子组件
<template>
<div class="hello">
<el-dialog title="提示" :visible.sync="dialogVisible" width="30%" :before-close="handleClose">
<span>这是一段信息</span>
<span slot="footer" class="dialog-footer">
<el-button @click="handleClose">取 消</el-button>
<el-button type="primary" @click="handleConfrim">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
export default {
props: {
dialogVisible: {
type: Boolean,
default: false
},
},
methods: {
handleClose(done) {
this.$emit('update:dialogVisible',false)
},
handleConfrim() {
this.$emit('update:dialogVisible',false)
},
change(e) {
this.$emit('input', e.data)
}
}
};
</script>
- 父组件代码部分
1、初始化一个默认的值,我这里初始化的值为isShow;
2、:dialogVisible.sync=“isShow” 向子组件传入dialogVisible,.sync修饰符一定要加上,这样子组的emit的update才会起作用;
3、然后就可以动态修改父组件的值了;
// 父组件
<template>
<div id="app">
<!-- <img alt="Vue logo" src="./assets/logo.png"> -->
<el-button type="primary" @click="isShow = true">{{ '展示弹窗' }}</el-button>
<HelloWorld :dialogVisible.sync="isShow"/>
</div>
</template>
<script>
import HelloWorld from './components/HelloWorld.vue'
export default {
name: 'App',
components: {
HelloWorld
},
data() {
return {
isShow: false
}
}
}
</script>