vue之组件之间双向数据绑定

简介

组件之间实现双向绑定有很多种方法,如

  • 绑定对象,利用是引用关系,但是,这样会容易造成数据混乱,而且违背了props单项数据流的概念,所以不建议使用。
  • 父子组件事件通讯
  • v-model
  • sync修饰符

下面就详细介绍下后三种方法。

父子组件事件监听

<template>
    <div>
       {{value}}
       <input-model @changeData="getValue" :value="value"></input-model>
    </div>
</template>
<script>
import inputModel from "./input.vue"
export default {
    data(){
        return{
            value:"hty"
        }
    },
    components:{
        inputModel,
    },
    methods: {
        getValue(value){
            this.value=value
        }
    },
}
</script>
//input.vue
<template>
    <div>
        <input type="text" @input="changes" :value="value1">
    </div>
</template>
<script>
export default {
    props:['value'],
    data(){
        return{

        }
    },
    methods: {
        changes(e){
            this.$emit("changeData",e.target.value)
        }
    }
}
</script>

v-model

<template>
    <div>
       {{value}}
       <input-model v-model="value"></input-model>
    </div>
</template>
<script>
import inputModel from "./input.vue"
export default {
    data(){
        return{
            value:"hty"
        }
    },
    components:{
        inputModel,
    },
    methods: {
        getValue(value){
            this.value=value
        }
    },
}
</script>
//input.vue
<template>
    <div>
        <input type="text" @input="changes" :value="value">
    </div>
</template>
<script>
export default {
    props:['value'],
    data(){
        return{

        }
    },
    methods: {
        changes(e){
            this.$emit("input",e.target.value)
        }
    }
}
</script>

这里需要注意的是:
一个组件上的v-model 默认会利用名为 value 的 prop 和名为 input 的事件,但是像单选框、复选框等类型的输入控件可能会将 value 特性用于不同的目的。
所以这里我需要用model选择来避免这样的冲突。
这里将子组件做出以下改变:

<template>
    <div>
        <input type="text" @input="changes" :value="value1">
    </div>
</template>
<script>
export default {
	//model自定义props和emit事件
    model:{
        prop: 'value1',  
        event:"changeData"
    },
    props:['value1'],
    data(){
        return{

        }
    },
    methods: {
        changes(e){
            this.$emit("changeData",e.target.value)
        }
    }
}
</script>

sync修饰符

<template>
    <div>
       {{value}}
       <input-model @update="getValue" :value="value"></input-model>
       <!--简写-->
       <!--<input-model  :value.sync="value"></input-model>-->
    </div>
</template>
<script>
import inputModel from "./input.vue"
export default {
    data(){
        return{
            value:"hty"
        }
    },
    components:{
        inputModel,
    },
    methods: {
        getValue(value){
            this.value=value
        }
    },
}
</script>
//input.vue
<template>
    <div>
        <input type="text" @input="changes" :value="value">
    </div>
</template>
<script>
export default {
    props:['value'],
    data(){
        return{

        }
    },
    methods: {
        changes(e){
            this.$emit("update:value",e.target.value)
        }
    }
}
</script>
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值