父子通信

1、父传子

传递:当子组件在父组中做标签使用的时候,通过给子组件绑定一个自定义属性,值为要传递的数据。

父组件中;eg:<One :val="message"/>

接收:在子组件内部通过props进行接收,props接收的方式有两种。

 

数组接收: props:["val"]
对象接收: props:{
              val:String, //接收数据的数据类型  
},


或是 props:{
             val:{
                   type:String,
                   defaule:"##"  //默认值
             }
       }

 

2、子传父

传递:当子组件给父组件传递数据的时候,通过调用父组件给子组件绑定的自定义事件,然后将值传递过去。

接收:父组件通过自定义事件的函数来接收子组件传递过来的数据(注:这个自定义方法在绑定的时候不需要加())

父组件给子组件绑定一个自定义方法;<One @handleTo="handleMessage">
子组件通过this.$emit触发这个方法;
methods:{
       handleSend(){
              this.$emit("handleTo",需要传递的值)
       }
}
父组件接收,通过自定义方法后面的函数接收
methods:{
       handleMessage(val){
           
       }
}

还可以通过自定义插槽完成子向父传值

给子组件内部的slot绑定一个自定义属性

 

<slot :icon="icon"></slot>

 

在父组件中,子组件标签的内部书写一个template标签,通过scope来接收子组件传递过来的数据

 

<Movie>
        <template  scope="props"> //scope接收到的数据是一个对象
                <p>{{props.icon}}</p> 
        </template>
</Movie>    

 

  非父子

1、在Vue的原型身上添加一个公共的Vue实例,组件之间调用这个公共的实例$emit传递数据,$on接收数据

在入口文件main.js中  Vue.prototype.Observer = new Vue();

传值:methods:{
           handleSend(){
                 this.Observer.$emit("handle",要传递的值)
           }
      }
接收:created(){
         this.Observer.$on("handle",(val)=>{接收到传递过来的值val})
     }

2、上面的方法太耗费性能,我们可以直接手动封装$on、$emit、$off方法,在main.js 中引入  import  Observer  from  '   '  ;传递和接收的方法与上面一样。

3、Event Bus  4、Vuex