当前位置: 首页 > wzjs >正文

经销商自己做网站营销推广方案包括哪些内容

经销商自己做网站,营销推广方案包括哪些内容,保定网站设计优势,做绒毛鉴定网站目录 响应式的基本实现 Proxy 与属性访问器 Proxy 的工作原理 属性访问器(Getter/Setter) 为什么解构会丢失响应性 ref 和 toRefs 的解决方案 proxyRefs:自动解包 ref 总结 Vue3 的响应式系统是其核心特性之一,它通过 Pro…

目录

响应式的基本实现

Proxy 与属性访问器

Proxy 的工作原理

属性访问器(Getter/Setter)

为什么解构会丢失响应性

ref 和 toRefs 的解决方案

proxyRefs:自动解包 ref

总结


Vue3 的响应式系统是其核心特性之一,它通过 Proxy 和属性访问器实现了数据的响应式变化。本文将深入探讨非原始值(对象、数组等)的响应式方案,以及为什么解构会导致响应式丢失。

响应式的基本实现

Vue3 的响应式系统主要通过以下几个核心 API 实现:

export function reactive(target: any) {return createReactiveObject(target);
}function createReactiveObject(target: any) {// 只对对象进行代理if (!isObject(target)) {return target;}//  访问属性 会命中 get 方法if (target[ReactiveFlags.IS_REACTIVE]) {return target;}// 如果代理对象已经存在,直接返回const existingProxy = reactiveMap.get(target);if (existingProxy) {return existingProxy;}let proxy = new Proxy(target, mutableHandlers);reactiveMap.set(target, proxy);return proxy;
}

Proxy 与属性访问器

Proxy 的工作原理

Proxy 是 ES6 引入的新特性,它允许我们拦截并自定义对象的基本操作。在 Vue3 中,Proxy 用于拦截对象的属性访问和修改:

export const mutableHandlers: ProxyHandler<any> = {get(target: any, key: any, receiver: any) {if (key === ReactiveFlags.IS_REACTIVE) {return true;}track(target, key);let res = Reflect.get(target, key, receiver);if (isObject(res)) {return reactive(res);}return res;},set(target: any, key: any, value: any, receiver: any) {let oldValue = target[key];let result = Reflect.set(target, key, value, receiver);if (oldValue !== value) {trigger(target, key, value, oldValue);}return result;},
};

属性访问器(Getter/Setter)

属性访问器是 JavaScript 中的一种特性,允许我们通过

getset  方法来控制对象属性的读取和设置:

let flag1 = {_v: false,get value() { //收集依赖return this._v},set value(newVal) { //触发依赖this._v = newVal}
}

为什么解构会丢失响应性

当我们对响应式对象进行解构时,会丢失响应性,例如:

const state = reactive({ count: 0 });
const { count } = state; // count 不再是响应式的

这是因为解构实际上是创建了一个新的变量,它只是复制了原始值,而不是保持对原始响应式对象的引用。解构后的变量不再被 Proxy 代理,因此无法触发 getter/setter。

ref 和 toRefs 的解决方案

为了解决这个问题,Vue3 提供了reftoRefs API:

export function ref(value: any) {return createRef(value);
}class RefImpl {public __v_isRef = true;public _value: any;public dep;constructor(public rawValue: any) {this._value = toReactive(rawValue);}get value() {trackRefValue(this);return this._value;}set value(newVal) {if (newVal !== this._value) {this.rawValue = newVal;this._value = newVal;triggerRefValue(this);}}
}

toRefs 将响应式对象的每个属性转换为 ref:

export function toRefs(obj) {const ret = {};for (const key in obj) {ret[key] = toRef(obj, key);}return ret;
}class ObjectRefImpl {public __v_isRef = true;constructor(public _object, public _key) {}get value() {return this._object[this._key];}set value(newVal) {this._object[this._key] = newVal;}
}

proxyRefs:自动解包 ref

为了使用更方便,Vue3 还提供了proxyRefsAPI,它可以自动解包 ref:

export function proxyRefs(obj) {return new Proxy(obj, {get(target, key, receiver) {let res = Reflect.get(target, key, receiver);return res.__v_isRef ? res.value : res;},set(target, key, value, receiver) {let oldValue = target[key];if (oldValue.__v_isRef) {oldValue.value = value;return true;} else {return Reflect.set(target, key, value, receiver);}},});
}

这样,我们就可以像这样使用:

let proxy = proxyRefs({ ...toRefs(obj) })
console.log(proxy.name); // 直接访问,无需 .value
proxy.name = "李四"; // 直接设置,无需 .value

总结

Vue3 的响应式系统通过 Proxy 和属性访问器实现了对非原始值的响应式处理。解构会导致响应式丢失是因为解构创建了新的变量,失去了与原始响应式对象的连接。通过reftoRefsproxyRefs 等 API,Vue3 提供了优雅的解决方案,使我们能够在保持响应式的同时,享受更简洁的代码风格。

http://www.dtcms.com/wzjs/412834.html

相关文章:

  • 上海网站建设好处百度店铺
  • 广州番禺网站建设公司百度地图的精准定位功能
  • 国网交流建设公司网站优化模型数学建模
  • 无锡高端网站建设app推广80元一单
  • 单位如何做网站宣传品牌网络推广
  • 网站开发时会遇到哪些问题北京seo做排名
  • 网站项目建设周期人工智能培训机构排名前十
  • 长春网站设计外包网络推广网站排行榜
  • 汽车网站建设价格武汉大学人民医院怎么样
  • 做购物网站收费市场调研报告
  • 用什么框架做网站快武汉网站优化公司
  • 宣传片剪辑优化营商环境心得体会
  • 网站降权怎么恢复今日国际新闻头条15条简短
  • 东莞优化网站建设福建seo外包
  • 自己做卖东西网站线上销售水果营销方案
  • 绵阳网站推广排名腾讯中国联通
  • 网站建设模板怎么做抖音seo怎么做的
  • 企业网站建设实训总结推广如何做网上引流
  • 网站建设维护学习宁波网络推广
  • 自己做网站怎么让字体居中网络营销就是
  • 网络工程专业学什么课程公司网站如何seo
  • 手机商城建站系统网站建设宁波正规seo快速排名公司
  • 哪个平台做网站好免费信息发布平台网站
  • 网站域名劫持如何提升网站搜索排名
  • 清理空壳网站东营网站建设费用
  • 网站常用的推广方法有哪些网站设计优化
  • 阿里巴巴国际网站怎么做网站建设
  • 如何修改网站后台登陆入口路劲飞猪关键词排名优化
  • 网络程序设计学什么北京优化seo排名
  • 河南网站制作公司打开2345网址大全