首页 > 其他分享 >组件通信补充 | Vue

组件通信补充 | Vue

时间:2022-10-04 11:34:00浏览次数:57  
标签:... Vue name parent 通信 callbacks vue 组件

  • 常用通信方式
    props $emit/$on event bus vuex

      - event bus
          > 事件总线
          > main.js
          ```javascript
          class Bus {
              constructor() {
                  this.callbacks = {}
              }
              $on(name, fn) {
                  this.callbacks[name] = this.callbacks[name] || []
                  this.callbacks[name].push(fn)
              }
              $emit(name, args) {
                  if (this.callbacks[name]) {
                      this.callbacks[name].forEach(cb => cb(args))
                  }
              }
          }
          Vue.prototype.$bus = new Bus() // 也可以直接用Vue来代替Bus
          ```
    
          > 两个子组件的通信
          > child1.vue
          ```html
          <script>
          ...
          methods: {
              handle: function() {
                  // 触发的事件方法
              }
          },
          mounted() {
              this.$bus.$on('foo', this.handle)
          }
          ...
          </script>
          ```
          > child2.vue
          ```html
          <script>
              ...
              this.$bus.$emit('foo')
              ...
          </script>
          ```
    
    • 边界情况

      $parent
      $children
      $root // 以上不推荐使用,避免高耦合
      $refs
      provide/inject
      非Prop特性
          $attrs
          $listeners
      
      • $parent/$root

        事件的派发与监听可以是共同的父组件或者根组件

        // 使用$parents代替上面的$bus
        this.$parent.$on('foo', this.handle)
        
        this.$parent.$emit('foo')
        
      • $children

        调用自定义组件
        不能保证子元素的顺序,比如异步组件的存在时

        <script>
            ...
            this.$children[1].handle()
            ...
        </script>            
        
      • $refs

        调用自定义组件与普通dom元素

        <script>
            ...
            this.$refs.child.handle()
            ...
        </script>            
        
      • $attrs/$listeners

        没有props声明, 非props特性
        child1.vue

        <template>
            <child1 msg="信息"></child1>
        </template>
        

        parent.vue

        <template>
            <p>{{ $attrs.msg }}</p>
        </template>
        
        <script>
            // 没有props声明
        </script>
        
        • 参数一代代组件传递下去

          grandpa.vue

          <template>
              <parent msg="信息"></parent>
          </template>
          

          parent.vue

          <template>
              <!-- 属性按键值对的方式直接展开 -->
              <child1 v-bind="$attrs"></child1>
          </template>
          

          child1.vue

          <template>
              <div>
                  <p>{{ $attrs.msg }}</p>
              </div>
          </template>
          
        • 事件的隔代转发

          grandpa.vue

          <template>
              <parent msg="信息" @foo="onFoo"></parent>
          </template>
          <script>
              ...
              methods: {
                  onFoo() {
                      console.log('msg from child1');
                  }
              }
              ...
          </script>
          

          parent.vue

          <template>
              <!-- 属性按键值对的方式直接展开 -->
              <child1 v-bind="$attrs" v-on="$listeners"></child1>
          </template>
          

          child1.vue

          <template>
              <script>
                  ...
                  this.$emit('foo')
                  ...
              </script>
          </template>
          
      • provide/inject

        层级超过2层,直接从爷爷传到孙子辈
        跨层传参
        grandpa.vue

        <script>
            export default {
                provide() {
                    return {
                        'bar': 123
                    }
                }
            }
        </script>
        

        son.vue

        <template>
            <div>
                <p>{{ bar1 }}</p>
            </div>
        </template>
        <script>
            export default {
                // inject: ['bar'], // 类似于props
                // 1.避免重名,起别名
                inject: {
                    bar1: 'bar'
                }
                // 2.设置默认值
                // inject: {
                //     bar1: {
                //         from: 'bar',
                //         default: '000',
                //     }
                // }
            }
        </script>
        

标签:...,Vue,name,parent,通信,callbacks,vue,组件
From: https://www.cnblogs.com/miaokela/p/16753488.html

相关文章

  • 【Vue.js入门到实战教程】15-ES 2015 新特性一览
    ​技术栈选择前面我们介绍了从Laravel8开始,自带的前端UI脚手架扩展包Jetstream不再基于Vue作为默认的组件开发技术栈,以便降低后端新手入门前端组件开发的学习成本......
  • GO语言开发高性能网络通信服务
     前言轻松的几行代码就可以实现tcp/IP的高性能的网络通信,今天就来介绍一下,使用boot4go-fastnet来实现一个简单的网络通信的例子。昨天的文章,介绍了boot4go-fastnet的实现的......
  • vue为什么v-for的优先级比v-if的高?
    前言有时候有些面试中经常会问到v-for与v-if谁的优先级高,这里就通过分析源码去解答一下这个问题。下面的内容是在当我们谈及v-model,我们在讨论什么?的基础上分析的,所以阅......
  • vue面试之Composition-API响应式包装对象原理
    本文主要分以下两个部分对CompositionAPI的原理进行解读:reactiveAPI原理refAPI原理reactiveAPI原理打开源码可以找到reactive的入口,在composition-api/src/r......
  • Vue.$nextTick的原理是什么-vue面试进阶
    原理性的东西就会文字较多,请耐下心来,细细品味Vue中DOM更新机制当你气势汹汹地使用Vue大展宏图的时候,突然发现,咦,我明明对这个数据进行更改了,但是当我获取它的时候怎么是上......
  • vue脚手架配置及安装
    npmconfigsetregistryhttp://registry.npm.taobao.org全局安装@vue/cli  npminstall-g@vue/cli切换到创建项目的目录,使用命令创建项目 vue create xxx......
  • Vue.$nextTick的原理是什么-vue面试进阶
    原理性的东西就会文字较多,请耐下心来,细细品味Vue中DOM更新机制当你气势汹汹地使用Vue大展宏图的时候,突然发现,咦,我明明对这个数据进行更改了,但是当我获取它的时候怎么是上......
  • vue为什么v-for的优先级比v-if的高?
    前言有时候有些面试中经常会问到v-for与v-if谁的优先级高,这里就通过分析源码去解答一下这个问题。下面的内容是在当我们谈及v-model,我们在讨论什么?的基础上分析的,所以......
  • Vue Quill富文本自定义上传音频/视频
    有时候项目中可能需要在富文本中上传音频,所以...环境Asp.NetCore文件上传服务(本文不提供/框架很多)Vue2.0功能自定义图片上传自定义视频上传自定义......
  • vue实现表格中添加标签,标签是多个需要循环-render函数 for循环返回
    vue实现表格中添加标签,标签是多个需要循环--实现:render函数for循环返回多个divfields_columns:[{type:'index',width:60,align:'center'},{title:......