前言
多级组件嵌套需要传递数据时,通常使用的方法是通过vuex。如果仅仅是传递数据,而不做中间处理,使用vuex处理,未免有点杀鸡用牛刀.Vue 2.4版本提供了另一种方法,使用v-bind=" $ attrs ",将父组件中不被认为道具特性绑定的属性传入子组件中,通常配合interitAttrs选项一起使用。之所以要提到这两个属性,是因为两者的出现使得组件之间跨组件的通信在不依赖vuex和事件总线的情况下变得简洁,业务清晰。
<强>首先分析以下应用场景:强>
一组件与B组件之间的通信:(父子组件)
如上图所示,A, B, C三个组件依次嵌套,按照Vue的开发习惯,父子组件通信可以通过以下方式实现:
-
<李> A到B通过道具的方式向子组件传递,B,通过在B组件中释放美元,一组件中v的方式实现李>
<李>通过设置全局Vuex共享状态,通过计算计算属性和提交突变的方式实现数据的获取和更新,以达到父子组件通信的目的。李>
<李> Vue事件总线,使用Vue的实例,实现事件的监听和发布,实现组件之间的传递。李>
往往数据在不需要全局的情况而仅仅是父子组件通信时,使用第一种方式即可满足。
一组件与C组件之间的通信:(跨多级的组件嵌套关系)
如上图,一个组件与C组件之间属于跨多级的组件嵌套关系,以往两者之间如需实现通信,往往通过以下方式实现:
-
<李>借助B组件的中转,从上到下道具依次传递,从下至上,美元发出事件的传递,达到跨级组件通信的效果李>
<李>借助Vuex的全局状态共享李>
<李> Vue事件总线,使用Vue的实例,实现事件的监听和发布,实现组件之间的传递。李>
很显然,第一种通过道具和美元发出的方式,使得组件之间的业务逻辑臃肿不堪,B组件在其中仅仅充当的是一个中转站的作用,如使用第二种Vuex的方式,某些情况下似乎又有点大材小用的意味,(仅仅是想实现组件之间的一个数据传递,并非数据共享的概念)。第三种情况的使用在实际的项目操作中发现,如不能实现很好的事件监听与发布的管理,往往容易导致数据流的混乱,在多人协作的项目中,不利于项目的维护。
$ attrs以美元及听众的出现解决的就是第一种情况的问题,B组件在其中传递道具以及事件的过程中,不必在写多余的代码,仅仅是将$ attrs以美元及听众向上或者向下传递即可。
示例代码
如下所示:
一组件(App.vue)
& lt; template> & lt; div id=坝τ谩北? & lt; child1 " child1 ": p-child1=:p-child2=" child2” v: test1=" onTest1 "//此处监听了两个事件,可以在B组件或者C组件中直接触发 v: test2=皁nTest2”比; & lt;/child1> & lt;/div> & lt;/template> & lt; script> 从“进口Child1。/Child1.vue '; 出口默认{ 数据(){ 返回{}; }, 组件:{Child1}, 方法:{> & lt; template> & lt; div类=癱hild-1”比; & lt; p> child1: & lt;/p> & lt; p>道具:{{pChild1}} & lt;/p> & lt; p> $ attrs: {{$ attrs}} & lt;/p> & lt; hr> & lt; !——C组件中能直接触发测试的原因在于B组件调用C组件时使用v绑定了美元听众属性——比; & lt; !——通过v-bind绑定$ attrs属性,C组件可以直接获取到一个组件中传递下来的道具(除了B组件中道具声明的)——比; & lt; child2 v-bind=" $ attrs " v=" $听众"祝辞& lt;/child2> & lt;/div> & lt;/template> & lt; script> 从“进口Child2。/Child2.vue '; 出口默认{ 道具:[' pChild1 '), 数据(){ 返回{}; }, inheritAttrs:假的, 组件:{Child2}, 安装(){ 美元。排放(test1); } }; & lt;/script>
结果: 在child1
:
道具:v_child1
$ attrs: {“p-child2”:“v_child2”}
C组件(Child2.vue)
& lt; template> & lt; div类=癱hild-2”比; & lt; p> child2: & lt;/p> & lt; p>道具:{{pChild2}} & lt;/p> & lt; p> $ attrs: {{$ attrs}} & lt;/p> & lt; hr> & lt;/div> & lt;/template> & lt; script> 出口默认{ 道具:[' pChild2 '), 数据(){ 返回{}; }, inheritAttrs:假的, 安装(){ 美元。排放(test2); } }; & lt;/script>Vue v2.4中新增的attrs及听众美元属性使用教程