zoukankan      html  css  js  c++  java
  • vue 组件间 8 大通讯方式 之一 props / $emit $children / $parent

    一、props / $emit (最常用)

    1.父传子 props

    // section父组件
    <template>
      <div class="section">
        <com-article :articles="articleList"></com-article>
      </div>
    </template>
    
    <script>
    import comArticle from './test/article.vue'
    export default {
      name: 'HelloWorld',
      components: { comArticle },
      data() {
        return {
          articleList: ['红楼梦', '西游记', '三国演义']
        }
      }
    }
    </script>
    // 子组件 article.vue
    <template>
      <div>
        <span v-for="(item, index) in articles" :key="index">{{item}}</span>
      </div>
    </template>
    
    <script>
    export default {
      props: ['articles']
    }
    </script>

    注意:prop 只可以从上一级组件传递到下一级组件(父子组件),即所谓的单向数据流。而且 prop 只读,不可被修改,所有修改都会失效并警告。

    2.子传父 $emit

    对于$emit 我自己的理解是这样的: $emit绑定一个自定义事件, 当这个语句被执行时, 就会将参数arg传递给父组件,父组件通过v-on监听并接收参数。 

    // 父组件中
    <template>
      <div class="section">
        <com-article :articles="articleList" @onEmitIndex="onEmitIndex"></com-article>
        <p>{{currentIndex}}</p>
      </div>
    </template>
    
    <script>
    import comArticle from './test/article.vue'
    export default {
      name: 'HelloWorld',
      components: { comArticle },
      data() {
        return {
          currentIndex: -1,
          articleList: ['红楼梦', '西游记', '三国演义']
        }
      },
      methods: {
        onEmitIndex(idx) {
          this.currentIndex = idx
        }
      }
    }
    </script>
    //子组件
    <template> <div> <div v-for="(item, index) in articles" :key="index" @click="emitIndex(index)">{{item}}</div> </div> </template> <script> export default { props: ['articles'], methods: { emitIndex(index) { this.$emit('onEmitIndex', index) } } } </script>

    二、 $children / $parent

    在父子组件中,可以通过this.$parent 或者 this.$children 访问父子实例,拿到实例代表什么?代表可以访问此组件的所有方法和data。 但是官方说尽量节省使用此方法,推荐通过props 和 $emit 去实现通讯

    // 父组件中
    <template>
      <div class="hello_world">
        <div>{{msg}}</div>
        <com-a></com-a>
        <button @click="changeA">点击改变子组件值</button>
      </div>
    </template>
    
    <script>
    import ComA from './test/comA.vue'
    export default {
      name: 'HelloWorld',
      components: { ComA },
      data() {
        return {
          msg: 'Welcome'
        }
      },
    
      methods: {
        changeA() {
          // 获取到子组件A
          this.$children[0].messageA = 'this is new value'
        }
      }
    }
    </script>
    // 子组件中
    <template>
      <div class="com_a">
        <span>{{messageA}}</span>
        <p>获取父组件的值为:  {{parentVal}}</p>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          messageA: 'this is old'
        }
      },
      computed:{
        parentVal(){
          return this.$parent.msg;
        }
      }
    }
    </script>

    注意边界情况,如在#app上拿$parent得到的是new Vue()的实例,在这实例上再拿$parent得到的是undefined,而在最底层的子组件拿$children是个空数组。也要注意得到$parent$children的值不一样,$children 的值是数组,而$parent是个对象

    小结

    上面两种方式用于父子组件之间的通信, 而使用props进行父子组件通信更加普遍; 二者皆不能用于非父子组件之间的通信。

  • 相关阅读:
    js中==与===区别
    Initialization failure 0x0000000c
    Spring通过@Value注解注入属性的几种方式
    java中读取配置文件中数据的具体方法
    spring整合hibernate
    url上参数解析笔记
    编号的生成(日期+序列号)
    application.xml & -servlet.xml
    webApplicationContext 与servletContext
    Http协议整理
  • 原文地址:https://www.cnblogs.com/benbonben/p/14957905.html
Copyright © 2011-2022 走看看