vue中用computed简单实现数据的双向绑定(getter 和 setter)

vue是号称实现了数据双向绑定的框架,但事实上在日常开发中我们用的最多的就是 v-model 将data(vue实例中)里面的是数据和view 相关联,实现 data 更新,view自动刷新的效果。但是,在移动成都上来说,这种数据双向绑定的效果并不是特别的明显。

今天,我用输入框和 computed 配置来实现一个比较明显的数据双向绑定的效果:

先来看一下最终的效果:

主要实现的效果:

1. 改变 姓、名 两个输入框的内容时,姓-名、姓-名(双向绑定)这两个输入框内的值将会更新;

2. 改变 姓-名 这个输入框中的内容时,姓、名输入框的内容不会更新;

3. 改变 姓-名(双向绑定)这个输入框中的内容时,姓、名输入框的内容会同步更新(实现了数据的双向绑定,至于 姓-名 这个输入框中的内容改变了,那是因为 姓、名 这两个输入框导致的)。

 

主要核心代码:(双向绑定)

注意:

         1. getter 和 setter 只是一个概念,并不是两个实际的方法,

         2. getter对应的是get方法,即 获取对应的值 时候调用的回调函数

         3. setter对应的是set方法,即 监听对应的值的改变 时候调用的回调函数(注意:不是设置,不是设置,不是设置!!!);并且 set 接受一个参数,即改变后的值。

         4. 计算属性(在使用get和set的时候)使用了箭头函数,则this不会指向这个组件的实例;如果你必须使用箭头函数,只有将其实例作为函数的第一个参数来访问 即: vm => vm.a * 2

             

 

完整代码:

<template>
    <!-- computed 实现双向绑定 -->
    <div class="twoWayBind">
        <!-- 姓 -->
        <p>
            <span class="title">姓:</span>
            <input type="text" class="firstName" v-model="firstName">            
        </p>

        <!-- 名 -->
        <p>
            <span class="title">名:</span>
            <input type="text" class="lastName" v-model="lastName">
        </p>       

        <!-- 显示“姓-名”; 修改后姓、名输入框的内容不会更新 -->
        <p>            
            <span class="title">姓-名:</span>
            <input type="text" class="fullName" v-model="fullName">
            <span class="promptCon">显示“姓-名”; 修改后姓、名输入框的内容不会更新</span>
        </p>

        <!-- 显示“姓-名”; 修改后姓、名输入框的内容会同步更新 -->
        <p>
            <span class="title">姓-名(双向绑定):</span>
            <input type="text" class="fullName2" v-model="fullName2">
            <span class="promptCon">显示“姓-名”; 修改后姓、名输入框的内容会同步更新</span>
        </p>
    </div>
</template>

<script>
export default {
    name: 'TwoWayBind',
    data(){
        return{
            firstName: 'A',
            lastName: 'B',
        }
    },
    computed: {
        fullName() {
            return this.firstName + "-" + this.lastName;
        },
        fullName2: {
            // 注意这里不能使用箭头函数,官网解释:计算属性使用了箭头函数,则this不会指向这个组件的实例,
            //                      不过你仍然可以将其实例作为函数的第一个参数来访问  即: vm => vm.a * 2
            get: function () {     
                return this.firstName + "-" + this.lastName;
            },
            set: function (value){      //value为用户修改fullName2后的值
                const names = value.split('-');
                this.firstName = names[0];      //注意:这样修改了firstName和lastName的值,会导致fullName也跟着变化
                this.lastName = names[1];
            }
        }
    }
}
</script>

<style lang="scss" scoped>
.twoWayBind{
    p{
        margin: 10px 0px;
        display: flex;
        flex-direction: flex-start;
        .title{
            display: inline-block;
            width: 150px;
            text-align: center;
        }        
        input{
            padding: 0px 6px;
        }
        .promptCon{
            color: #aaa;
            margin-left: 10px;
        }
    }
}

</style>

          

文章仅为本人学习过程的一个记录,仅供参考,如有问题,欢迎指出!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值