vue2非父子传值

该文章演示了如何在Vue.js中使用事件总线(Bus)进行非父子组件间的通信。通过创建一个全局Vue实例作为总线,组件1使用$emit发送数据,而组件2在创建后使用$on监听并接收数据。强调了$on必须在$emit之前执行以确保事件能被正确触发。
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script src='https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js'></script>
    <div id="myApp">
        <my-com1></my-com1>
        <hr>
        <my-com2></my-com2>

    </div>
    <!-- 组件模板 -->
    <template id='myTem1'>
        <div>
            组件1发数据: <button @click="change">{{count1}}</button>
        </div>
    </template>
    <template id='myTem2'>
        <div>
            组件2接数据:{{count2}}
        </div>
    </template>
    <script>

        // 第一步:在全部范围内,创建一个vue空对象,取名为bus总线
        var bus = new Vue()

        Vue.component('myCom1', {
            template: '#myTem1',
            data() {
                return {
                    count1: 0

                }
            },
            methods: {
                change() {
                    this.count1++;
                    console.log("1数据发送", this.count1);
                    // 第二步:需要发送数据的时候,使用bus总线调用$emit()发送,而不是this
                    bus.$emit("myevent", this.count1)

                }
            }
        })
        Vue.component('myCom2', {
            template: '#myTem2',
            data() {
                return {
                    count2: 0
                }
            },
            created() {
                // 第三步:在目标组件的初始化函数中,使用bus总线监听自定义事件,获取数据
                bus.$on("myevent", data => {
                    console.log("2数据接收", data);
                    this.count2 = data;
                })


                // 假设初始化的时候 组件2没有创建 10秒之后组组件2才创建出来,用计时器模拟
                setTimeout(() => {
                    console.log("模拟组件2延迟初始化,开始监听事件");
                    // $on监听事件可以重复监听,事件处理函数都会执行
                    bus.$on("myevent", data => {
                        console.log("3数据接收", data);
                        this.count2 = data;
                    })

                }, 10000);

                // 结论:10秒内:组件2还没有初始化,组件1发射事件,就接收不到,因为事件必须先on绑定,在emit发射,才能正常触发事件
            },

        })
        new Vue({
            el: '#myApp',
            data: {

            },
            methods: {

            },
        })

        // 总结:非父子组件(兄弟组件)传值的步骤
        // 1.全局范围内创建一个vue空对象,取名为bus总线
        // 2.使用bus总线调用$emit发送
        // 3.在目标组件的初始化函数中,使用bus总线监听自定义事件,获取数据
        // 注意事项:
        // 1.使用bue总线接收数据的时候,事件处理函数要使用箭头函数来写,保证this指向为当前组件对象
        // 2.bus.$on 监听必须在bus.$emit发送之前执行,才能触发事件,接收数据
    </script>
</body>

</html>

Vue2父子组件主要有父子和子父两种情况: ### 父子 父组件向子组件时,子组件通过`props`属性接收父组件过来的,名字要和父组件对应。 示例代码如下: 父组件: ```vue <template> <div> <!-- 向子组件递sonInfo --> <Son :sonInfo="sonInfo"/> </div> </template> <script> import Son from './Son.vue' export default { components: { Son }, data() { return { sonInfo: { sonName: '小明', sonAge: 12 } } } } </script> ``` 子组件: ```vue <template> <div class="son"> 这里是子组件,我们会在这里展示子的信息 {{ sonInfo.sonName }} {{ sonInfo.sonAge }} </div> </template> <script> export default { name: "son", props: ["sonInfo"] } </script> <style scoped> .son { margin: 10px; border: 1px solid red; } </style> ``` 此示例中,父组件将`sonInfo`对象递给子组件,子组件通过`props`接收并展示信息 [^4]。 ### 子父 子组件向父组件是通过`this.$emit`触发自定义事件,父组件监听该事件来接收数据。 示例代码如下: 父组件: ```vue <template> <div> <div>父组件</div> <!-- 监听子组件emit --> <Student @sendMsg="sendMsg"/> <div>父组件接收消息:{{studentMsg}}</div> </div> </template> <script> // 引入组件 import Student from '../components/Student' export default { components: { Student }, data() { return { studentMsg: null } }, methods: { // 父组件接收子组件消息的方法 sendMsg(name, age) { this.studentMsg = name + age } } } </script> ``` 子组件: ```vue <template> <div> <div>子组件</div> <!-- 通过点击按钮向父组件 --> <button @click="sendMsg(name, age)">子组件向父组件</button> </div> </template> <script> export default { data() { return { name: '张三', age: 18 } }, methods: { sendMsg(name, age) { // 向父组件的方法(多个用逗号隔开) this.$emit('sendMsg', name, age); } } } </script> ``` 该示例中,子组件通过点击按钮触发`sendMsg`方法,使用`this.$emit`触发自定义事件`sendMsg`并递`name`和`age`,父组件监听该事件并接收数据 [^3]。 ### 父子同步(`.sync`修饰符) 父组件使用`v-model:xxx`或`.sync`来指定向子组件并实现双向绑定。 示例代码如下: 父组件: ```vue <template> <div> <BaseComp7 v-model:customModelValue="msg"/> {{msg}} </div> </template> <script> import BaseComp7 from "./BaseComp7.vue" export default { name: "index", components: { BaseComp7 }, data() { return { msg: "父组件msg" } } } </script> ``` 子组件: ```vue <template> <div> <!-- 子组件可以修改customModelValue --> <input v-model="customModelValue" @input="$emit('update:customModelValue', $event.target.value)"> </div> </template> <script> export default { props: ['customModelValue'], methods: { // 子组件触发更新事件 updateValue(newValue) { this.$emit('update:customModelValue', newValue) } } } </script> ``` 此示例中,父组件使用`v-model:customModelValue`向子组件递`msg`,子组件可以修改`customModelValue`并通过`$emit`触发更新事件,实现父子组件数据的同步 [^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值