[vue] 组件相互传值的几种思路

思路一:利用props

父组件→子组件 :通过v-bind将数据传给子组件,子组件使用porps接收到值

<!--父组件.vue-->

<template>
    <div>
        <zizujian :fatherValue="myValue"/>
    </div>
</template>

<script>
import zizujian from "xxx"
export default{
    template:{zizujian},
    data(){
        return{
            fatherValue:'i am u father'
        }
    }
}
</script>
<!--子组件.vue-->

<template>
    <div>
        <h1>我收到了父组件的数据{{ fatherValue }}</h1>
    </div>
</template>

<script>
export default{
    props:['fatherValue']
}
</script>

子组件→父组件:父组件通过v-bind传给子组件一个函数函数接收一个参数。子组件props接收到函数,在合适的时候调用该函数并传值,以此来给父组件传值 

<!--父组件.vue-->
提前准备一个函数,留给子组件用

<template>
    <div>
        <zizujian :faterListen="faterListen"/>
    </div>
</template>

<script>
import zizujian from "xxx"
export default{
    template:{zizujian},
    methods:{
        faterListen(sonValue){
            console.log('我是父组件,我收到了子组件的数据:',sonValue)
        }
    }
}
</script>
<!--子组件.vue-->

<template>
    <div>
        <button @click="fatherListen(sonValue)">点击给父组件传值</button>
    </div>
</template>

<script>
export default{
    props:['fatherListen'],
    data(){
        sonValue:'你好啊,我是子组件'
    }
}
</script>

 --------------------------------------分界线--------------------------------------

思路二:全局事件总线(优)

安装事件总线:在main.js里创建vm的时候,增加一个生命周期钩子beforeCreate,在钩子中把VM绑定到Vue原型上,这样VUE原型上,就有VM了,就可以在项目的任意位置使用这个$bus,通过给$bus绑定事件、触发事件,就可以实现传值了

安装事件总线
<!--main.js--> 

.....

new Vue({
    el:'#app',
    render: h => h(App),
    beforeCreate(){
        Vue.prototype.$bus = this
    }
})

使用全局事件总线

<!--app.vue-->
....

绑定方式
export default{
    methods:{
        something(value){
            console.log('我收到了某组件的值',value)
        }
    },
    // APP在初始化的时候,给$bus上绑定了一个事件
    // 所以所有组件都可以触发它
    // 等事件被触发的时候,就会执行对应的方法
    mounted(){ 
        this.$bus.$on('emitSomething',this.someting)
    }
}


触发方式
this.$bus.$emit('emitSomething',value1,value2...)

--------------------------------------分界线--------------------------------------

思路三:消息订阅与发布

使用第三方库 pubsub-js 实现

安装:npm i pubsub-js

引入:import pubsub from 'pubsub-js'

订阅、发布、关闭订阅

订阅
....
import pubsub from 'pubsub-js'
export default{
    mounted(){
        this.pid = pubsub.subscribe('hello',(name,msg1,msg2)=>{
            // 回调函数:订阅了一个名字叫“hello”的消息,当有消息发给hello的时候,这里就会执行
            // 要注意:接收的第一参数是【订阅消息名】,也就是“hello”,后面的参数才是接收的数据
            // 使用this.pid接收一个订阅的id,这个id是用来关闭订阅的
        })
    },
    beforeDestroy(){
        //关闭订阅
        pubsub.unsubscribe(this.pid)
    }
}

发布
....
import pubsub from 'pubsub-js'
export default{
    methods:{
        sendMsg(){
            pubsub.publish('hello','我是消息')
        }
    }
}

--------------------------------------分界线--------------------------------------

分析:

props方式

  • 优点:子、父传递简单,不需要引入任何库,容易理解、方便
  • 缺点:缺点很明显,在组件多层嵌套的时候,这种就变得及其麻烦
  • 比如 “祖爷爷”给“孙子”传点数据,就得经过这样一个过程 :祖爷爷→爷爷→父亲→孙子

全局事件总线

  • 优点:不需要任何的第三方库,事件总线可以直接与任意组件可以直接通讯,因为$bus在原型上,这是一种非常巧妙的思路,一个字:妙
  • 缺点:在非常简单的结构上,就不如props来的简单方便了,比props复杂
  • 注:事件总线大家都用$bus这个名称,其实可以自定义的,但约定俗成就都用$bus命名。这个名字很贴切

消息订阅&发布

  • 实验发现,并没有很便捷,只是概念相对于事件总线,更容易理解。
  • 但要引入第三方库,仅凭这一点,个人就觉得不如事件总线
  • 总的来说:优点不多,缺点明显,就不在这个上面浪费时间了
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值