vue3响应式实现原理(5)

简介: vue3响应式实现原理(5)

theme: fancy

highlight: a11y-light

简单数据类型的代理

简单数据类型需要使用ref,实际上ref的背后还是reactive.本质是手动给他加一层,并且给他一个ref的标记__v_isRef

function ref(val) {
   
  const wrapper = {
   
    value: val,
  };
  // 使用 Object.defineProperty 在 wrapper 对象上定义一个不可枚举的属性 __v_isRef,并且值为 true
  Object.defineProperty(wrapper, "__v_isRef", {
   
    value: true,
  });
  return reactive(wrapper);
}
let proxyNum = ref(1);
effect(() => {
   
  console.log(proxyNum.value);
});
proxyNum.value++;

setup暴露出的响应式对象,经过...会失去响应式,首先来模拟一下这种情景

let newObj = {
    ...proxyData }
effect(() => {
   
 console.log(newObj.age)
});
newObj.age++

问题关键在于有没有办法能够帮助我们实现:在副作用函数内,即使通过普通对象 newObj 来访问属性值,也能够建立响应联系,方法是有的,可以借助访问器,同时要有get和set.如果没有set不能修改数据

newObj = {
   
  age: {
   
    get value() {
   
      return proxyData.age;
    },
    set value(val) {
   
      proxyData["age"] = val;
    },
  },
};
effect(() => {
   
  console.log(newObj.age.value);
});

newObj.age.value++;

可以将上面的逻辑封装成一个函数,并添加__v_isRef

function toRef(proxyData, key) {
   
  let wrapper = {
   
    get value() {
   
      return proxyData[key];
    },
    set value(val) {
   
      proxyData[key] = val;
    },
  };
  Object.defineProperty(wrapper, "__v_isRef", {
   
    value: true,
  });

  return wrapper;
}

也可以一次性完成对象的操作,这样newObj修改他的值也会有触发响应

function toRefs(obj) {
   
  const ret = {
   };
  for (const key in obj) {
   
    ret[key] = toRef(obj, key);
  }
  return ret;
}

const newObj = {
    ...toRefs(obj) }

我们都知道ref类型在模板是不需要使用.value的,这其实要借助我们之前的标__v_isRef,在get中判断是否是ref返回不同的数据

return value.__v_isRef ? value.value : value

至此响应系统的内容结束

相关文章
|
21天前
|
JavaScript 前端开发 算法
vue渲染页面的原理
vue渲染页面的原理
96 56
|
8天前
|
JavaScript 前端开发 UED
vue2和vue3的响应式原理有何不同?
大家好,我是V哥。本文详细对比了Vue 2与Vue 3的响应式原理:Vue 2基于`Object.defineProperty()`,适合小型项目但存在性能瓶颈;Vue 3采用`Proxy`,大幅优化初始化、更新性能及内存占用,更高效稳定。此外,我建议前端开发者关注鸿蒙趋势,2025年将是国产化替代关键期,推荐《鸿蒙 HarmonyOS 开发之路》卷1助你入行。老项目用Vue 2?不妨升级到Vue 3,提升用户体验!关注V哥爱编程,全栈开发轻松上手。
|
11天前
|
JavaScript 前端开发 算法
高效工作流:用Mermaid绘制你的专属流程图;如何在Vue3中导入mermaid绘制流程图
mermaid是一款非常优秀的基于 JavaScript 的图表绘制工具,可渲染 Markdown 启发的文本定义以动态创建和修改图表。非常适合新手学习或者做一些弱交互且自定义要求不高的图表 除了流程图以外,mermaid还支持序列图、类图、状态图、实体关系图等图表可供探索。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
11天前
|
JavaScript 前端开发 API
你真的会使用Vue3的onMounted钩子函数吗?Vue3中onMounted的用法详解
onMounted作为vue3中最常用的钩子函数之一,能够灵活、随心应手的使用是每个Vue开发者的必修课,同时根据其不同写法的特性,来选择最合适最有利于维护的写法。博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
21天前
|
资源调度 JavaScript 前端开发
Pinia 如何在 Vue 3 项目中进行安装和配置?
Pinia 如何在 Vue 3 项目中进行安装和配置?
|
11天前
|
JavaScript 前端开发 API
管理数据必备;侦听器watch用法详解,vue2与vue3中watch的变化与差异
一篇文章同时搞定Vue2和Vue3的侦听器,是不是很棒?不要忘了Vue3中多了一个可选项watchEffect噢。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
1月前
|
移动开发 JavaScript API
Vue Router 核心原理
Vue Router 是 Vue.js 的官方路由管理器,用于实现单页面应用(SPA)的路由功能。其核心原理包括路由配置、监听浏览器事件和组件渲染等。通过定义路径与组件的映射关系,Vue Router 将用户访问的路径与对应的组件关联,支持哈希和历史模式监听 URL 变化,确保页面导航时正确渲染组件。
|
4月前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
164 58
|
4月前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
140 56
|
2月前
|
资源调度 JavaScript 前端开发
创建vue3项目步骤以及安装第三方插件步骤【保姆级教程】
这是一篇关于创建Vue项目的详细指南,涵盖从环境搭建到项目部署的全过程。
348 1

热门文章

最新文章

相关实验场景

更多