Vue 的响应式原则与双向数据绑定

  发布时间:2025-11-05 08:39:44   作者:玩站小弟   我要评论
反应性原则它是 Vue.js 的核心特性之一,一个数据驱动的视图,我们修改数据视图来响应更新,非常优雅。Vue2.x 使用 Object.defineProperty() 实现,而 Vue3.x 使用 。

反应性原则

它是的定 Vue.js 的核心特性之一,一个数据驱动的响应向数视图,我们修改数据视图来响应更新,式原非常优雅。则双

Vue2.x 使用 Object.defineProperty() 实现,据绑而 Vue3.x 使用 Proxy 实现。的定 我们先来看看2.x的响应向数实现。

Object.defineProperty(obj,式原 key, {

enumerable: true,

configurable: true,

get: function getter () {

return obj[key];

},

set: function setter (newVal) {

...

}

})

我们通过Object.defineProperty给对象obj添加属性,可以设置对象属性的则双getter和setter函数。  

之后,据绑我们每通过点语法获取一个属性,的定就会执行这里的响应向数getter函数。 在这个函数中,式原我们会将调用这个属性的则双依赖收集到一个集合中; 当我们给属性赋值时,这个定义就会被触发。据绑 setter函数,在辅助函数中,会通知集合中的依赖更新,让数据变化驱动视图变化。

3.x的核心思想和2.x一样,只是IT技术网在数据劫持上使用了Proxy而不是Object.defineProperty,但是在处理数组和响应式处理新属性时Proxy比Object.defineProperty更方便 .

let nObj=new Proxy(obj,{

get: function (target, propKey, receiver) {

console.log(`getting ${propKey}!`);

return Reflect.get(target, propKey, receiver);

},

set: function (target, propKey, value, receiver) {

console.log(`setting ${propKey}!`);

return Reflect.set(target, propKey, value, receiver);

}

})

Vue响应式原理的实现细节相信大部分人已经很熟悉了,这里不再赘述。

双向数据绑定

双向数据绑定通常是指我们使用的 v-model 指令的实现。 它是 Vue 的一个特性,也可以说是输入事件和值的语法糖。 Vue 通过 v-model 指令为组件添加输入事件处理和值属性赋值。

</template>

上面的组件等价于下面的代码。

{{localValue}}

export default{

data(){

return {

localValue:,

}

},

methods:{

onInput(v){

this.localValue=v.target.value;

console.log(this.localValue)

}

}

}

</script>

因此,当我们修改输入框的值时,我们通过v-model绑定的值也会同步修改。 基于以上原理,我们可以轻松实现一个双向数据绑定组件。

v-model实践

首先,我们定义一个Vue组件:

click me {{value}}

export default{

props:{

value:{

type:Number,

default:0

}

},

watch:{

value(v){

this.localvalue=v;

}

},

methods:{

addCount(){

this.localvalue++;

this.$emit(input,this.localvalue);

}

},

data(){

return{

localvalue:0

}

},

created(){

this.localvalue=this.value;

}

}

</script>

上面的组件指定我们在 props 中添加 value 属性,并在 value 更新时触发 input 事件。 在创建的云服务器 hook 和 watch 中对 localvalue 的赋值是将父组件的状态同步到子组件。

通过上面的组件定义,我们可以使用 v-model 指令对组件进行双向数据绑定。

The parent component{{count}}

export default{

data() {

return {

count: 0,

};

},

methods: {

},

created(){

}

}

</script>

以下是实际效果。

当然,我们也可以不使用 value 和 input 事件的组合。 为了让组件的定义更加语义化,我们还可以自定义属性和事件,实现双向绑定。 我们可以在组件的模型选项中设置值和事件。 如下:

export default{

model:{

value:count,

event:change

},

props:{

count:{

type:Number,

default:0

}

},

methods:{

addCount(){

this.localvalue++;

this.$emit(change,this.localvalue);

}

},

}

由上述组件定义。

<add-one v-model="count"></add-one>

相当于:

{{count}}

export default{

data(){

return {

count:0,

}

},

methods:{

onChange(v){

this.count=v;

console.log(this.count)

}

}

}

</script>

只是v-model指令帮我们做了上面的事件添加、属性绑定和状态同步操作。

最后

以上就是今天全部内容,谢谢你的阅读。如果你觉得有用,请记得点赞我,关注我,感谢感谢。

WordPress模板
  • Tag:

相关文章

  • 如何利用Switch加速电脑?(教你简单操作,提高电脑速度!)

    摘要:在日常使用电脑的过程中,我们经常会遇到电脑运行缓慢的情况。为了解决这个问题,本文将介绍如何利用Switch来加速电脑,提高其运行速度。Switch是一种网络设备,通过调整网络连接,...
    2025-11-05
  • 通过以太网供电(PoE)技术为智能建筑供电

    以太网供电(PoE)顾名思义:它通过用于数据传输的同一根电缆为小型设备提供足够的电力。该技术被广泛应用于智能建筑中,由于涉及的电压较低,正常的市电电气安全规则不适用。这凸显了PoE具有吸引力的原因之一
    2025-11-05
  • 三星One UI安全漏洞:剪贴板数据明文存储且永不过期

    三星One UI系统曝出重大安全漏洞,通过剪贴板功能导致数百万用户的敏感信息面临泄露风险。剪贴板数据永久存储安全研究人员发现,运行Android 9及以上系统的三星设备会将所有剪贴板内容——包括密码、
    2025-11-05
  • 线上 Redis 频繁崩溃?这套大 key 治理方案请收好

    兄弟们,凌晨两点,手机突然像地震一样狂震,我迷迷糊糊摸到床头一看,运维群里炸了锅:"Redis节点又挂了!内存使用率飙到99%,CPU直接打满!" 顶着黑眼圈爬起来连服务器,刚登录就看到熟悉的报错:O
    2025-11-05
  • 电脑机箱前置音频升级教程(轻松解决前置音频问题,提升音质体验)

    摘要:随着人们对音质要求的提高,电脑机箱前置音频的质量成为了用户关注的焦点。然而,很多电脑机箱的前置音频接口质量较差,给用户带来了不良的音质体验。本文将为大家详细介绍如何进行电脑机箱前置...
    2025-11-05
  • MySQL中的赋值运算符详解

    在MySQL中,赋值运算符是一个非常重要且常用的操作符。本文将详细介绍MySQL中赋值运算符的使用方法和注意事项,并提供丰富的示例帮助理解。赋值运算符简介MySQL中的赋值运算符主要用于以下两个目的:
    2025-11-05

最新评论