vue组件之间的通信方式

545 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

一、props/$emit

父组件给子组件传值

父组件给子组件传值

//父组件
//引入的add-child组件
// 冒号为v-bind 的缩写
<add-child :msg="msg" /> //这里必须要用 - 代替驼峰
data(){
    return {
        msg: [1,2,3]
    };
}

子组件通过props来接收数据:

//方式1:
props: ['msg']
//方式2 :
props: {
    msg: Array //这样可以指定传入的类型,如果类型不对,会警告
}
//方式3:
props: {
    msg: {
        type: Array, //指定传入的类型
        //type 也可以是一个自定义构造器函数,使用 instanceof 检测。
        default: [0,0,0] //这样可以指定默认的值
    }
}

子组件给父组件传值

配合事件名$emit使用。

Vue.component('welcome-button', { 
    template: ` 
    <button v-on:click="$emit('welcome')"> 
        Click me to be welcomed 
    </button> ` 
})
<div id="emit-example-simple"> 
    <welcome-button v-on:welcome="sayHi"></welcome-button> </div>
new Vue({ 
    el: '#emit-example-simple', 
    methods: { 
        sayHi: function () { alert('Hi!') } 
    } 
})

二、$emit/$on

$emit见上面子组件给父组件传值

三、vuex

Vuex 可以帮助我们管理共享状态,并附带了更多的概念和框架。这需要对短期和长期效益进行权衡。

如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。确实是如此——如果您的应用够简单,您最好不要使用 Vuex。一个简单的 store 模式就足够您所需了。但是,如果您需要构建一个中大型单页应用,您很可能会考虑如何更好地在组件外部管理状态,Vuex 将会成为自然而然的选择。引用 Redux 的作者 Dan Abramov 的话说就是:

Flux 架构就像眼镜:您自会知道什么时候需要它。

四、$attrs / $listeners

  • $attrs是在vue的2.40版本以上添加的。
  • 项目中有多层组件传参可以使用$attrs,可以使代码更加美观,更加简洁,维护代码的时候更方便。如果使用普通的父子组件传参prop和emitemit,on会很繁琐;如果使用vuex会大材小用,只是在这几个组件中使用,没必要使用vuex;使用事件总线eventBus,使用不恰当的话,有可能会出现事件多次执行。

五、provide/inject

provide 和 inject 主要为高阶插件/组件库提供用例。并不推荐直接用于应用程序代码中。是2.2.0版本 新增的。

使用场景:由于vue有$parent属性可以让子组件访问父组件。但孙组件想要访问祖先组件就比较困难。通过provide/inject可以轻松实现跨级访问祖先组件的数据

六、$parent  /  $children 与  ref

  • $parent / $children:访问父/子实例,需要注意的是:这两种都是直接得到组件实例,使用后可以直接调用组件的方法或者访问数据。
  • ref:如果在普通的DOM元素上使用,引用指向的就是DOM元素;如果用在子组件上,引用的就是组件实例。