• 六:Vue之父子组件间的三种通信方式


    (注:本文适用于有一定Vue基础或开发经验的读者,文章就知识点的讲解不一定全面,但却是开发过程中很实用的)

      组件是Vue的核心功能之一,也是我们在开发过程中经常要用到的。各个独立的组件之间如何进行数据的交互,下面介绍三种个人在开发过程中用过的方法~

    1、props与$emit

      父组件通过props的方式向子组件传递数据;子组件通过$emit,在父组件中以v-on的方式接收回传的数据。接下来请看下面一个实例,

      定义父组件parent.vue,添加如下代码:

    <template>
      <div id="demo">
        <child :message="message" @getInputValue="getInputValue"></child>
      </div>
    </template>
    
    <script>
    import child  from '@/components/common/child.vue';
    export default {
      name: 'demo',
      components: {
        child
      },
      data() {
        return {
          message: 'hello'
        }
      },
      methods: {
        getInputValue(val) {
          this.message = val
          console.log(this.message)
        }
      }
    }
    </script>

     

      定义子组件child.vue,添加如下代码:

    <template>
      <div id="child">
        <el-input v-model="message" clearable placeholder="" @change="handleChangeInput"></el-input>
      </div>
    </template>
    
    <script>
    export default {
      name: 'child',
      props: {
        message: String
      },
      methods: {
        handleChangeInput(val) {
          this.$emit('getInputValue', val)
        }
      }
    }
    </script>

     

      假如子组件要访问在父组件中定义的数据message,首先要在父组件引用的子组件标签中绑定该数据,然后以props的方式传递到子组件;子组件对message做了修改之后以$emit的方式回传给父组件,父组件以方法getInputValue接收并重新赋值给message。

     

    2、在子组件中定义get与set方法

      先看如下的两段代码,定义父组件parent.vue,添加如下代码:

    <template>
      <div id="demo">
        <child ref="childComponent"></child><br>
        <el-button type="primary" @click="clickSet">set</el-button>
        <el-button type="primary" @click="clickGet">get</el-button>
      </div>
    </template>
    
    <script>
    import child  from '@/components/common/child.vue';
    export default {
      name: 'demo',
      components: {
        child
      },
      methods: {
        clickSet() {
          this.$refs.childComponent.setMessage('hello world');
        },
        clickGet() {
          let msg = this.$refs.childComponent.getMessage();
          console.log(msg);
        }
      }
    }
    </script>

     

      定义子组件child.vue,添加如下代码:

    <template>
      <div id="child">
        <span>{{message}}</span>
      </div>
    </template>
    
    <script>
    export default {
      name: 'child',
      data() {
        return {
          message: 'hello'
        }
      },
      methods: {
        getMessage() {
          return this.message;
        },
        setMessage(val) {
          this.message = val;
        }
      }
    }
    </script>

     

      假如父组件要访问在子组件中定义的数据message,可以通过$refs的方式访问子组件中定义的getMessage和setMessage方法。

     

    3、Vuex

      vuex状态管理用于全局存储数据状态,具体的应用请查阅前文《应用四:Vue之VUEX状态管理》,在此就不再详细说明。

    原创出自:https://www.cnblogs.com/fengyuexuan/p/10975338.html

  • 相关阅读:
    在openSUSE11.1上安装和配置LAMP(Apache/MySQL/PHP)
    正则表达式的性能?!
    RealPlayer11 for linux 64位 下载
    未能加载视图状态。
    双边贸易网 YouMeTrade.com 上线了, 欢迎大家推荐网站优化技术,也发一些我的心得.
    Sql2000分页效率之我见。
    Linq查询绑定给GridView,提示 数据源不支持服务器端的数据分页.
    控件开发笔记,鄙视写 LinkButton 那个傻蛋.
    有关SQLSERVER 中DATEDIFF函数分析
    使用SHTML更好的维护门户网站(转)
  • 原文地址:https://www.cnblogs.com/liaochangqiang/p/11543840.html
Copyright © 2020-2023  润新知