如果使用了.sync就说明子组件想要通过某种方式修改父组件的数据的值,比如element-ui中的Dialog弹框中有使用到
如果不将这个弹框单独封装一个组件的情况下这个是很友好的,就不用书写@close事件来关闭弹框了,代码量很大的情况下就需要将这个弹框单独封装成一个子组件
弹框的显示是由子组件里面的:visible来控制的,false隐藏,true显示,但是:visible是由showDialog来控制的,showDialog是由父组件传递过来的,归根结底,弹框的显示与隐藏还是由父组件控制的,子组件使用prop接收父组件传递过来的showDialog,但是由于props是单项数据流,弹框打开后想要关闭,需要将:visible设置为false,可是:visible是由父组件传递过来的变量控制的,子组件不能直接修改父组件传递过来的值,需要使用$emit事件传值让父组件自己修改,然而:visible使用.sync修饰的会自动在子组件中将showDialog设置为fasle就会报错
这个报错的大概意思就是在Vue2中组件props中的数据只能单向流动,即只能从父组件通过组件的DOM属性attribute传递props给子组件,子组件只能被动接收父组件传递过来的数据,并且在子组件中,不能修改由父组件传来的props数据
正确做法是删掉:visible的.sync然后使用$emit来配合update事件来完成,固定写法是
this.$emit('update:showDialog', false)
其中的showDialog是props中的父组件传递过来的变量,false是将showDialog修改为false
父组件
说白了封装组件后就是谁的数据谁修改,但是.sync会自动让子组件修改父组件的值,这点要注意