vue2 父子组件通信

vue2父子组件通信一般有3种方式
1、props+自定义事件
2、props+sync修饰符
3、props+v-model
因为第一种方式,还需要在父组件methods中声明方法去改变值,显得比较麻烦。
所以推荐使用第二种或者第三种方式。
如果是改变多个值就使用第二种方法,如果只是改变一个值那么就使用第三种方法。

方法一:props+自定义事件

父组件 Demo

  <div id="demo">
      <input type="text" v-model="name">
        <!--子组件传递过来的参数由自定义事件绑定的方法接收-->
      <demo-child :nameFather="name" @newData="newName"></demo-child>
  </div>
import DemoChild from '@/components/DemoChild'
export default {
    data(){
        return {
            name:'nihao'
        }
    },
    components:{
        DemoChild
    },
    methods:{
       //因此参数value是  '这是子组件传递过来的数据'
        newName(value){
            this.name=value
        }
    }
}

子组件 DemoChild

<template>
    <div id="demo_child">
        <p @click="change">DemoChild组件:{{nameFather}}</p>
    </div>
</template>
export default {
    //接收属性nameFather
    props:{
        nameFather: String
    },
    methods:{
        change(){
            //触发父组件中的自定义事件newData ,  this.$emit('需要触发的自定义事件' [,'需要传递的参数'])
            this.$emit('newData','这是子组件传递过来的数据')
        }
    }
}

方法二:props+sync修饰符

父组件 Demo

  <div id="demo">
      <input type="text" v-model="name">
      <demo-child :nameFather.sync="name"></demo-child>  
  </div>
import DemoChild from '@/components/DemoChild'
export default {
    data(){
        return {
            name:'nihao'
        }
    },
    components:{
        DemoChild
    }
}

是子组件 DemoChild

    <div id="demo_child">
        <p @click="change">DemoChild组件:{{nameFather}}</p>
    </div>
export default {
    props:{
        nameFather: String
    },
    methods:{
        change(){
            //触发父组件自定义属性nameFather的更新,this.$emit('update:父组件需要更新的自定义属性','更新后的属性值')
            this.$emit('update:nameFather','这是子组件传递过来的数据')
        }
    }
}

方法三:props + v-model

父组件 Demo

  <div id="demo">
      <input type="text" v-model="name">
      <demo-child v-model="name"></demo-child>
      
  </div>
import DemoChild from '@/components/DemoChild'
export default {
    data(){
        return {
            name:'nihao'
        }
    },
    components:{
        DemoChild
    }
}

子组件 DemoChild

    <div id="demo_child">
        <p @click="change"> DemoChild组件  {{nameFather}}</p>
    </div>
export default {
    //声明model
    model:{
        prop:'nameFather',   //这个prop的值就是自定义的props属性,所以这里是'nameFather'
        event:'modelChange'  //model绑定的事件名,自己随意取
    },

    props:{
        nameFather: String   //自定义props属性,nameFather  
    },

    methods:{
        change(){
            //这里的第一个参数是model里的event,所以这里是'modelChange'  第二个参数是传递过去的值
            this.$emit('modelChange','这是子组件传递过去的数据')
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容