Vue2 、vue3 监听对象的变化

这篇具有很好参考价值的文章主要介绍了Vue2 、vue3 监听对象的变化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1  响应式原理

vue响应式也叫作数据双向绑定

MVVM模型 (Model-Viem-ViewModel)

  • DOM listeners:实现了页面与数据的绑定,当页面操作数据的时候 DOM 和 Model 也会发生相应的变化
  • Data Bindings:  实现了数据与页面的绑定,当数据发生变化的时候会自动渲染页面

2 vue2 数据监听

2.1  实现原理

vue实现数据响应式,是通过object.defineProperty()对数据劫持侦测数据变化,发布订阅模式进行依赖收集与视图更新。

object.defineProperty()方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。

2.2  object.defineProperty()对数据的监听

const obj = {
  name: "one",
  age: 18
}


Object.keys(obj).forEach(key => {
  let value = obj[key]

  Object.defineProperty(obj, key, {
    get: function() {
      console.log(`监听到obj对象的${key}属性被访问了`)
      return value
    },
    set: function(newValue) {
      console.log(`监听到obj对象的${key}属性被设置值`)
      value = newValue
    }
  })
})

obj.name = "two"
obj.age = 20

console.log(obj.name)   
console.log(obj.age)

obj.height = 1.88

2.3 object.defineProperty()缺陷

1.defineProperty只能监听某个属性,不能对全对象监听 对一个对象的监听需使用foreach、闭包等技术

2. defineproperty不能监听到对象的添加删除属性操作

需要开发者主动调用相应的方法去更新 :Vue.set(),Vue.delete

2.defineproperty不能监听数组的添加删除操作

直接使用索引 index 设置数组项时,不会被vue检测到

vue2.0使用数组重写的方法实现了数组的响应,7个方法分别为

  • push();

  • pop();

  • shift();

  • unshift();

  • splice();

  • sort();

  • reverse()

3 vue3 数据监听

3.1 原理 

Proxy 对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义。之后的操作都是直接对Proxy的操作,而不是原有的对象

const p = new Proxy(target, handler)

target 要使用 Proxy 包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。

handler 一个通常以函数作为属性的对象,各属性中的函数分别定义了在执行各种操作时代理 p 的行为。

handler对象的方法【MDN】(13个捕获器 trap)   

3.2 代码

const obj = {
  name: 'one',
  age: 18,
};

const objProxy = new Proxy(obj, {
  // 获取值时的捕获器
  get: function (target, key) {
    console.log(`监听到对象的${key}属性被访问了`, target);
    return target[key];
  },

  // 设置值时的捕获器
  set: function (target, key, newValue) {
    target[key] = newValue;
    console.log(`监听到对象的${key}属性被设置值`, target);
  },
  // 监听in的捕获器
  has: function (target, key) {
    console.log(`监听到对象的${key}属性in操作`, target);
    return key in target;
  },
  // 监听delete的捕获器
  deleteProperty: function (target, key) {
    delete target[key];
    console.log(`监听到对象的${key}属性delete操作`, target);
  },
});

console.log(objProxy.name);
console.log(objProxy.age);

objProxy.name = 'two';
objProxy.age = 20;

// in操作符
console.log('name' in objProxy);

// delete操作
delete objProxy.name;
console.log(obj.name);
console.log(obj.age);

 执行结果

vue3监听对象属性值变化,前端,vue.js,javascript

 文章来源地址https://www.toymoban.com/news/detail-756673.html

3.3 

到了这里,关于Vue2 、vue3 监听对象的变化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在 Vue.js 中,使用 watch 监听data变量如:对象属性/data变量

    在 Vue.js 中,使用 `watch` 监听对象属性 的变化时,应该将属性名作为 字符串 传递给 `watch` 选项。 示例如下: ```javascript updateAddChuZhenForm函数 现在,当 `isCheck1` 或 `isCheck2` 的值发生变化时,相应的 `watch` 函数将被触发。 ``` 如果你想要 监听一个普通变量 ,而 不是 Vue 实例的属

    2024年02月09日
    浏览(43)
  • 【前端vue升级】vue2+js+elementUI升级为vue3+ts+elementUI plus

    gogo code 是一个基于 AST (源代码的抽象语法结构树状表现形式)的 JavaScript/Typescript/HTML 代码转换工具,可以用它来构建一个代码转换程序来帮助自动化完成如框架升级、代码重构、多平台转换等工作。 当前 GoGoCode 支持解析和操作如下类型的代码: ○JavaScript(JSX) ○Typescript

    2024年02月12日
    浏览(51)
  • vue3监听路由的变化

    可以使用监听 router.currentRoute.value 的值,,来监听路由的变化。 引入: setup使用 : 控制台输出的值 newValue : 如果我们只需要监听当前路由 name 的变化,就可以这么监听 router.currentRoute.value.name immediate:true //true 就表示会立即执行。(watch默认绑定,页面首次加载时,是不会执行

    2024年02月12日
    浏览(40)
  • vue3 监听props 的变化

    再三说明 仅仅个人学习用,不误导别人 我觉得props 会创建对应的属性,去接受这些值,比如传递一个ref的基本值 age props.age = age.value 传递一个ref的引用值 person props.person= person.value 传递一个reactive的引用值 person props.person= person 最开始时候,props指向了一个响应式的reactive pe

    2024年02月11日
    浏览(35)
  • Vue3优雅地监听localStorage变化

    目录 💡前言  💡 为什么要这样做? 💎 思路 💎 实现 🚗 实现中介者模式 🚗 重写localStorage 🚗 实现useStorage hook 💎 测试 🚗 使用localStorage 🚗 监听localStorage变化 🚗 结果         最近在研究框架,也仔细用了Vue3一些功能,今天分享一次我的实践:         原生的

    2024年02月08日
    浏览(50)
  • 19-vue2到vue3的一些变化

    Vue 2.x 有许多全局 API 和配置。 例如:注册全局组件、注册全局指令等。 Vue3.0中对这些API做出了调整: 将全局的API,即: Vue.xxx 调整到应用实例( app )上 2.x 全局 API( Vue ) 3.x 实例 API ( app ) Vue.config.xxxx app.config.xxxx Vue.config.productionTip 移除 Vue.component app.component Vue.directive

    2024年02月07日
    浏览(34)
  • Vue3组件不发生变化,如何监听pinia中数据变化?

    在开发过程中,我们需要将一些跨组件使用的的数据在pinia中进行状态管理,组件在初始化的时候我们能通过onMounted,computed,watch,watchEffect获取到存储在pinia state中的内容,有一些特殊情况,在组件初始化之后我们无法通过以上四种情况获取state中的内容,这时候我们怎么做呢?

    2024年02月11日
    浏览(52)
  • vue3 动态监听浏览器窗口变化

    定义一个属性记录宽度 在 vue mounted 的时候 去挂载一下 window.onresize 方法 去监听这个 属性值的变化,如果发生变化则讲这个 val 传递给 this.screenWidth 这样screenWidth就跟随浏览器的窗口大小动态变化了 进行使用

    2024年02月13日
    浏览(46)
  • Vue3前端开发,如何获取组件内dom对象以及子组件的属性和方法

    Vue3前端开发,借助Ref来获取组件内dom对象,借助defineExpose编译宏可以获取到子组件的属性和方法。 app入口文件,我们作为父组件,在里面调用了自定义组件TestCom.vue。 先做了一个测试,借助于ref来访问自身的dom对象。如图所示是可以拿到的。 ref又称谓钩子函数,在vue2版本中

    2024年01月22日
    浏览(59)
  • vue3 实现监听store里state状态变化

    需要注意: 不能直接监听对象的属性值,需要写成getter函数。 总结: watch 的第一个参数可以是不同形式的数据源,它可以是一个ref(包括计算属性),一个响应式对象,一个getter函数,或多个数据源组成的数组。 不能直接监听响应式对象的属性: 这里需要写成返回对象属

    2024年02月17日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包