zoukankan      html  css  js  c++  java
  • vue组件间通信的6中方式(全)

    方式一、 props / $emit

      父组件铜鼓偶 props 向子组件传递数据,子组件通过 $emit 向父组件传递数据,在父组件中通过 v-on 接受。

      不详细说明了,比较简单

    方式二、$emit $on 中央事件总线

      这种方法通过一个空的 vue 实例作为中央事件总线,用它来触发事件和监听事件,可以实现任何组件间的通信,包括父子,兄弟,跨级。

        (个人觉得不如直接使用vuex)

      1.具体实现方式

          this.$emit('fun', data)
          this.$on('fun', data => {})

      首先建立一个空的 Vue 实例,将通信事件挂载到该实例上

      // ab.js
      import Vue from 'vue'
      export default new Vue()

      兄弟组件a

      import ab from './ab'
      export default {
        name: "A",
        data() {
          return {
            name: 'zhangningA'
          }
        },
        mounted() {
          ab.$emit('aname', this.name)
        }
      }

      兄弟组件b

    import ab from "./ab";
    export default {
      name: "B",
      data() {
        return {
          name: 'zhangningB',
          getaname: ''
        }
      },
      mounted() {
        ab.$on('aname', data => {
          this.getaname = data
        })
    
      }
    }

      注:不推荐这种组件间传值的实现方式

    方式三、vuex

      参考另一篇博客  https://www.cnblogs.com/zhangning187/p/fendouzailushang2.html

    方式四、provide / inject

      在 vue 2.2.0 之后的版本中添加了 provide 和 inject 。他们成对出现,用于组件中传递数据。主要解决了跨级组件间的通信问题。

    Root
      └─ List
          ├─ Item
          └─ Footer
              ├─ Button
              └─ Statistics

      当这种深层次的结构,需要将 root 组件中的数据传递给 statistics 组件的时候,如果仍然使用 prop 沿着组件逐级传递下去可能会很麻烦。这个时候我们可以使用 provide 和 inject 进行传递数据。无论层次结构多深,父组件都可以作为其所有子组件的依赖者。父组件通过 provide 提供数据,子组件通过 inject 接收数据.

    // root组件
    export default {
      name: 'root',
      components: {
        List: () => import('./list')
      },
      data(){
        return {
          name: '我是tname'
        }
      },
      /*provide:{
        // 这里访问不到实例中的 property ,需要将 provide 转换为返回对象的函数
        tname: this.name
      }*/
      provide(){// 向子组件发送数据
        return {
          rootName: this.name
        }
      }
    }    
    // statistics组件
    export default {
      name: 'statistics',
     // 接收父组件通过 provide 传递过来的数据
     inject:['rootName']
    }

      注:父组件不需要知道哪些子组件使用了它的 provide 的 property

        子组件也不需要知道 inject 的 property 来自哪个父组件

      解决响应式问题

        将一个函数赋值给 provide 的一个值,这个函数返回父组件的动态数据,然后在子孙组件里面调用这个函数。

        实际上这个函数存储了父组件实例的引用,所以每次子组件都能获取到最新的数据。

    // 父组件
    export default {
      name: 'index',
      components: {
        Aco: () => import('./a')
      },
      data() {
        return {
          name: '我是tname'
        }
      },
      provide() {// 向子组件发送数据
        return {
          // 传递组件的实例 this
          rootName: this,
        getParentName: () => this.name
      }
     }
    }

     

    // 子组件
    export default {
      name: 'b',
      inject: ['name', 'getParentName'],
      computed: {
        // 接收数据
        parentName() {
          return this.getParentName()
        }
      }
    }

    方式五、$parent / $children ref

      ref:如果在普通的 dom 上使用,引用指向的就是 dom 元素,在子组件上使用,引用的就是组件实例

      $parent / $children :访问父子组件实例

        这两种都是直接得到组件的实例,使用后可以直接调用组件中的方法或者数据。但是无法在跨级或兄弟组件间通信。理论上用的不太多

    方式六、$attrs / $listeners

       多级组件嵌套需要传递数据时,通常使用vuex,但是如果仅仅时数据的传递,而不做中间的处理,有点大材小用了。vue 2.4 提供了另一种方法 $attrs / $ listeners

      $attrs:存放的是负组件中绑定的非 props 属性

      $listeners:存放的是负组件中绑定的非原生事件

      详情查看这篇博客 :https://www.cnblogs.com/zhangning187/p/vueapixxzj.html

     
  • 相关阅读:
    识别验证码
    Jquery利用ajax调用asp.net webservice的各种数据类型(总结篇)
    Intellij IDEA新建maven项目和配置tomcat
    Intellij IDEA 14使用maven3.3.3 问题
    使用Xshell连接Ubuntu
    IntelliJ IDEA 12 详细开发教程(二)Tomcat服务配置与Jrebel热部署
    git使用
    e.keycode详解
    jquery插件制作教程 txtHover(转载)
    深入理解JavaScript系列(转载)
  • 原文地址:https://www.cnblogs.com/zhangning187/p/vuezjtx6fsq.html
Copyright © 2011-2022 走看看