在开发组件的时候,一定会遇到组件的通信,比如点击一个图标出现弹窗和蒙层,这三个分别是不同的组件。管理他们之间的状态就成了问题。
<强>道具双向绑定强>
通过同步双向绑定,属性变化会同步到所有组件,这也是最简单的实现方式,缺点是属性会比较多。实现方式如下
应用程序。vue文件
& lt; template> & lt; div id=坝τ谩北? & lt;面具:hide-mask.sync=" hideMask "祝辞& lt;/mask> & lt;对话框:hide-dialog。同步=" hideDialog ": hide-mask.sync=癶ideMask祝辞& lt;/dialog> & lt; dialog-icon: hide-dialog。同步=" hideDialog ": hide-mask.sync=癶ideMask祝辞& lt;/dialog-icon> & lt;/div> & lt;/template> & lt; script> 从“进口面具。/组件/面罩/指数” 从’。/组件/导入对话框对话框/指数” 从“进口dialogIcon。/组件/dialog-icon/指数” 出口默认{ 组件:{ 面具, 对话框中, dialogIcon }, 数据(){ 返回{ hideMask:没错, hideDialog:真 } } } & lt;/script> >之前组件/对话框/索引。vue文件
& lt; template> & lt;部分类=岸曰翱颉?class="{“隐藏”:hideDialog}”在 & lt; div类=" dialog-close " @click=()“隐藏”在& lt;/div> & lt;/section> & lt;/template> & lt; script> 出口默认{ 道具:“hideDialog”、“hideMask”, 方法:{ 隐藏(){ 这一点。hideDialog=! this.hideDialog 这一点。hideMask=! this.hideMask } } } & lt;/script> >之前组件/dialog-icon/索引。vue文件
& lt; template> & lt;部分类=癲ialog-icon @click”=跋允?)”在点击出现弹窗& lt;/section> & lt;/template> & lt; script> 出口默认{ 道具:“hideDialog”、“hideMask”, 方法:{ 显示(){ 这一点。hideDialog=! this.hideDialog 这一点。hideMask=! this.hideMask } } } & lt;/script> >之前组件/面罩/索引。vue文件
& lt; template> & lt; div类=懊婢摺?class="{“隐藏”:hideMask}”祝辞& lt;/div> & lt;/template> & lt; script> 出口默认{ 道具(“hideMask”): } & lt;/script> >之前<>强自定义事件强>
子组件$调度()派发事件传递给父组件,父组件广播()美元广播事件传递给子组件,这种方式虽然减少了道具的使用,但是需要额外定义几个事件,状态多了就会变得很复杂,实现方法如下
应用程序。vue文件
& lt; template> & lt; div id=坝τ谩北? & lt; mask> & lt;/mask> & lt; dialog> & lt;/dialog> & lt; dialog-icon> & lt;/dialog-icon> & lt;/template> & lt; script> 从“进口面具。/组件/面罩/指数” 从’。/组件/导入对话框对话框/指数” 从“进口dialogIcon。/组件/dialog-icon/指数” 出口默认{ 组件:{ 面具, 对话框中, dialogIcon }, 数据(){ 返回{ hideMask:没错, hideDialog:真 } }, 事件:{ “dialog-dispatch”() { 这一点。hidedialog=! this.hidedialog 美元。广播(“dialog-broadcast”) }, “mask-dispatch”() { 这一点。hideMask=! this.hideMask 美元。广播(“mask-broadcast”) } } } & lt;/script> >之前组件/dialog-icon/索引。vue文件
& lt; template> & lt;部分类=癲ialog-icon @click”=跋允?)”在点击出现弹窗& lt;/section> & lt;/template> & lt; script> 出口默认{ 方法:{ 显示(){ 美元。调度(“dialog-dispatch”) 美元。调度(“mask-dispatch”) } }, 事件:{ “dialog-broadcast”() { 这一点。hideDialog=! this.hideDialog } }, 数据(){ 返回{ hideDialog:这。parent.hideDialog美元, hideMask: parent.hideMask美元 } } } & lt;/script> >之前组件/对话框/索引。vue文件
详解vue跨组件通信的几种方法