exercises.md 4.0 KB
Newer Older
Z
zhaoss 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 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 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
# 非父子组件通讯

 <div style="color: pink;">几何小常识:</div>
<br>

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

const bus =new Vue()

**核心逻辑:**<br>
>组件A给组件B传值: 
>1. 组件A给bus注册一个事件,监听事件的处理程序 
>2. 组件B触发bus上对应的事件,把 值当成参数来传递
>3. 组件A通过事件处理程序获取数据
>
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200403124524548.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0pIWExf,size_16,color_FFFFFF,t_70)
**最终点击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>

关闭状态:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200403125323123.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0pIWExf,size_16,color_FFFFFF,t_70)
开启状态:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200403125354722.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0pIWExf,size_16,color_FFFFFF,t_70)
**代码如下**

```
<!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>

 <div style="color: pink;">心凉小测试:</div >




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

## 答案

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

## 选项

### A

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

### B

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

### C

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