Vue组件通信方式全面详解 (2)

$attrs:包含了父作用域中不被 prop 所识别 (且获取) 的特性绑定 (class 和 style 除外)。当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定属性 (class和 style 除外),并且可以通过 v-bind="$attrs" 传入内部组件。

$listeners:包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on="$listeners" 传入内部组件。

provide和inject

在父组件中通过 provider 来提供属性,然后在子组件中通过 inject 来注入变量。不论子组件有多深,只要调用了 inject 那么就可以注入在 provider 中提供的数据,而不是局限于只能从当前父组件的 prop 属性来获取数据,只要在父组件的生命周期内,子组件都可以调用。这和 React 中的 Context API 有没有很相似!

Vue.component('A', { template: ` <div> <p>我是A组件</p> <B></B> </div> `, provide:{ a:"祖先A的数据" }, data() { return { msg: 'hello 小马哥' } }, }) Vue.component('B', { template: ` <div> <p>我是B组件</p> <C></C> </div> `, data() { return { } } }) Vue.component('C', { template: ` <div> <p>我是C组件</p> <h3>{{a}}</h3> </div> `, inject:['a'], data() { return { } } }) let vm = new Vue({ el: '#app', template: ` <div> <A></A> </div> `, })

在 parent 组件中,通过 provide 属性,以对象的形式向子孙组件暴露了一些属性

在 child 组件中,通过 inject 属性注入了 parent 组件提供的数据,实际这些通过 inject 注入的属性是挂载到 Vue 实例上的,所以在组件内部可以通过 this 来访问

⚠️ 注意:官网文档提及 provide 和 inject 主要为高阶插件/组件库提供用例,并不推荐直接用于应用程序代码中。

$parent和$children

这里要说的这种方式就比较直观了,直接操作父子组件的实例。$parent 就是父组件的实例对象,而 $children 就是当前实例的直接子组件实例了,不过这个属性值是数组类型的,且并不保证顺序,也不是响应式的。

Vue.component('Parent', { template: ` <div> <p>我是父组件</p> {{msg}} <hr/> <Child></Child> </div> `, mounted () { //读取子组件数据,注意$children并不保证顺序,也不是响应式的 console.log(this.$children[0].a) }, data() { return { msg: 'hello 小马哥' } }, }) Vue.component('Child', { template: ` <div> <p>我是孩子组件</p> <input type="text" @input='changeValue'/> <h2>{{myMsg}}</h2> </div> `, methods: { changeValue() { this.$parent.msg = '子组件中的数据' } }, data() { return { myMsg:this.$parent.msg, a:"小马哥" } } }) let vm = new Vue({ el: '#app', template: ` <div> <Parent></Parent> </div> `, }) Vuex状态管理

Vuex 是状态管理工具,实现了项目状态的集中式管理。工具的实现借鉴了 Flux、Redux、和 The Elm Architecture 的模式和概念。当然与其他模式不同的是,Vuex 是专门为 Vue.js 设计的状态管理库,以利用 Vue.js 的细粒度数据响应机制来进行高效的状态更新。详细的关于 Vuex 的介绍,你既可以去查看官网文档,也可以查看本专栏关于 Vuex 一系列的介绍。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzgdj.html