美文网首页
$emit 和$event 组件通信的一些理解

$emit 和$event 组件通信的一些理解

作者: kittysinri | 来源:发表于2020-02-07 23:15 被阅读0次

今天还在学习Vue。对于父子组件之间的通信还有一些地方没有弄清楚。父子组件间通信可使用props, emit,ref这几个知识点进行通信。

  1. 关于props
    子组件的props选项可接收来自父组件的数据;
  子组件:
  <template>
    <h3>{{message}}</h3>
  </template>
  <script>
    export default{
          props:['message']         //声明一个自定义属性
      }
  </script>

  父组件(示例静态传递):
     <template>
        <div>
            <h2>我是父组件!</h2>
             <child message="我是父组件传递的信息!"></child>
        </div>
      </template>
      <script>
            import child from './child.vue'     //引入组件
          export default{
              components:{ child},         //注册子组件
            }
        </script>

2.关于$emit

首先我们从官方文档里面可以知道,子组件可以使用props 选项接收父组件的数据;

prop是单向数据流,从父组件流向子组件,子组件要是想更改父组件中的数据,可以使用 $emit 触发父组件的自定义事件:

    vm.$emit(event, arg)    //$emit绑定一个自定义事件event ,当该语句被执行到的时候,会将参数arg抛出传递给父组件,父组件通过@event监听并接收参数,然后可通过$event访问到子组件抛出的arg参数;

   **假如在父组件中事件处理函数是一个方法,则arg代表的值会作为第一个参数传入这个方法:**(见下面例子)
  

    vm.$on(event, fn)         //监听event事件后运行fn;

举个栗子->子组件:

  <template>
      <div  class="train-city">
          <h3>父组件传给子组件的toCity:{{sendData}}</h3>
  <br/><button v-on:click="select('山东')">点击此处将“山东”发送给父组件</button>
      </div>
  </template>
<script>
    export default{
          name: 'trainCity',
          props: ['sendData'],        //用来接收父组件传给子组件的 数据
          methods:{
                  select(val){
                        let data={
                              cityname: val
                            };
                        this.$emit("showCityName",  data);    //select事件触发以后,自动触发showCityName事件
                      }
                  }
            }
</script>```

父组件:

<template>
  <div>
    <div>父组件的toCity{{toCity}}</div>
    <train-city v-on:showCityName="updateCity"  v-bind:sendData="toCity"></train-city>   //使用子组件    prop动态传递数据   事件处理函数是一个方法,自动接收子组件传过来的arg并传给函数作为第一个参数,虽然没有用$event接收子组件传过来的值
  </div>
</template>

<script>
  import  trainCity from "./train-city";
  export default{
    name: "index",
    components:{trainCity},
    data(){
            return{
                toCity: 'beijing'
            }
        },
    methods:{
        updateCity(){        //触发子组件
              this.toCity = data.cityname;     //改变了父组件的值
            console.log("toCity:"  + this.toCity)
            }
    }
}
</script>
  1. $ref
    在父级组件中想要直接访问一个子组件的时候,可通过ref属性给子组件赋予一个ID引用。
    在父组件中:
      <base-input ref="usernameInput"></base-input>
    
可以使用 this.$refs.usernameInput 访问<base-input>组件实例。

相关文章

网友评论

      本文标题:$emit 和$event 组件通信的一些理解

      本文链接:https://www.haomeiwen.com/subject/mzbmxhtx.html