exercises.md 4.0 KB
Newer Older
Z
zhaoss 已提交
1 2
# 非父子组件通讯

Z
zhaoss 已提交
3
 <div style="color: pink;font-size:24px">小常识:</div>
Z
zhaoss 已提交
4 5 6 7 8 9 10 11 12 13 14 15 16
<br>

**原理:**<br>
> 通过一个Vue实例来传递数据

const bus =new Vue()

**核心逻辑:**<br>
>组件A给组件B传值: 
>1. 组件A给bus注册一个事件,监听事件的处理程序 
>2. 组件B触发bus上对应的事件,把 值当成参数来传递
>3. 组件A通过事件处理程序获取数据
>
Z
zhaoss 已提交
17
<br/>![在这里插入图片描述](https://img-blog.csdnimg.cn/20200403124524548.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0pIWExf,size_16,color_FFFFFF,t_70)
Z
测试  
zhaoss 已提交
18
<br/>
Z
zhaoss 已提交
19 20 21 22 23 24 25 26 27 28 29
**最终点击h2控制台会输出2**<br>
1. 创建1和2两个非父子组件以及vue实例bus
2. 在1组件中 钩子函数created中通过**bus.$on**为bus自定义一个事件aa 
3. 在2组件中 当点击h2元素时触发dian函数 并且将值出过去
4. 在2组件的dian函数中通过**bus.$emit**方触发1中的aa事件 并传参过去 
5. 当1中的aa事件被触发时会执行其中的函数并获取参数


**通过非父子组件 实现开关灯案例**<br>

关闭状态:
Z
zhaoss 已提交
30
<br/>![在这里插入图片描述](https://img-blog.csdnimg.cn/20200403125323123.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0pIWExf,size_16,color_FFFFFF,t_70)
Z
测试  
zhaoss 已提交
31
<br/>
Z
zhaoss 已提交
32
开启状态:
Z
zhaoss 已提交
33
<br/>![在这里插入图片描述](https://img-blog.csdnimg.cn/20200403125354722.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0pIWExf,size_16,color_FFFFFF,t_70)
Z
测试  
zhaoss 已提交
34
<br/>
Z
zhaoss 已提交
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
**代码如下**

```
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #app {
            width: 500px;
            height: 500px;
            margin: 100px auto;
        }

        .box {
            height: 200px;
            width: 200px;
            margin: 0 auto;
            background-color: black;
            border-radius: 50%;
        }

        .below {
            height: 200px;
            width: 400px;
            margin: 50px auto;
        }

        button {
            margin-left: 66px;
            width: 100px;
            height: 40px;
        }

        .on {
            background-color: rgb(160, 184, 25);
        }
    </style>
</head>

<body>
    <div id="app">
        <zss></zss>
        <sgy></sgy>
    </div>
    <script src="./node_modules/vue/dist/vue.js"></script>
    <script>
        const bus = new Vue()
        Vue.component('zss', {
            data() {
                return {
                    attribute: "on",
                    state: false
                }
            },
            created() {
                bus.$on('lamp', result => {
                    this.state = result
                })
            },
            template: `<div class="box" :class="state?attribute:''"></div>`
        })
        Vue.component('sgy', {
            template: `<div class="below">
                        <button @click="on">开灯</button>
                        <button @click="off">关闭</button>
                      </div>`,
            methods: {
                on() {
                    bus.$emit('lamp', true)
                },
                off() {
                    bus.$emit('lamp', false)
                }
            }
        })
        const app = new Vue({
            el: '#app',
            data: {

            }
        })
    </script>
</body>

</html>
```

**非父子组件不仅这一种通讯方式,其他方式同学们可以去博文中查看**

<br>

Z
zhaoss 已提交
130
 <div style="color: pink;">小测试:</div >
Z
zhaoss 已提交
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153




下列关于非父子组件通讯描述正确的是?<br/><br/>

## 答案

eventBus其实就是当触发事件时,发送一个通知出去,在需要响应的地方接收这个通知,响应事件。

## 选项

### A

eventBus是非父子组件通讯唯一方式。

### B

非父子组件之间进行通讯会造成内存泄漏。

### C

VueX并不能解决非父子通讯问题。