美文网首页
$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