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

企业网站百度认证网站网站模版

企业网站百度认证,网站网站模版,wordpress数据库命名,.net core 网站开发一、Vue2是如何实现数据响应式的 Vue实现响应式变化的方式是通过数据劫持和发布-订阅模式。 数据劫持#xff1a;Vue通过使用Object.defineProperty()方法对数据对象的属性进行劫持#xff0c;使其能够在属性值发生变化时触发相应的操作。 发布-订阅模式#xff1a;Vue使用…一、Vue2是如何实现数据响应式的 Vue实现响应式变化的方式是通过数据劫持和发布-订阅模式。 数据劫持Vue通过使用Object.defineProperty()方法对数据对象的属性进行劫持使其能够在属性值发生变化时触发相应的操作。 发布-订阅模式Vue使用发布-订阅模式来监听数据变化并在变化时通知相关的订阅者更新视图。当数据发生变化时会触发相应的setter方法然后通知所有订阅者进行更新。 具体实现步骤如下 在初始化Vue实例时通过遍历数据对象利用Object.defineProperty()方法将每个属性转化为getter和setter。 在getter方法中将订阅者Watcher对象添加到当前属性的依赖列表中。 在setter方法中当数据发生改变时会触发该属性的所有订阅者的更新操作即将Watcher对象的update方法加入到异步更新队列中。 当所有同步任务执行完毕后异步更新队列会依次执行各个Watcher对象的update方法更新视图。 通过数据劫持和发布-订阅模式的结合Vue能够在数据变化时及时更新视图实现了响应式变化。 export function defineReactive ( // 定义响应式数据obj: Object,key: string,val: any,customSetter?: ?Function,shallow?: boolean) {const dep new Dep()// 如果不可以配置直接returnconst property Object.getOwnPropertyDescriptor(obj, key)if (property property.configurable false) {return}// cater for pre-defined getter/settersconst getter property property.getconst setter property property.setif ((!getter || setter) arguments.length 2) {val obj[key]}// 对数据进行观测let childOb !shallow observe(val)Object.defineProperty(obj, key, {enumerable: true,configurable: true,get: function reactiveGetter () { // 取数据时进行依赖收集const value getter ? getter.call(obj) : valif (Dep.target) {dep.depend()if (childOb) { // 让对象本身进行依赖收集childOb.dep.depend() // {a:1} {} 外层对象if (Array.isArray(value)) { // 如果是数组 {arr:[[],[]]} vm.arr取值只会让arr属性和外层数组进行收集 dependArray(value) }}}return value},set: function reactiveSetter (newVal) {const value getter ? getter.call(obj) : val/* eslint-disable no-self-compare */if (newVal value || (newVal ! newVal value ! value)) {return}/* eslint-enable no-self-compare */if (process.env.NODE_ENV ! production customSetter) {customSetter()}// #7981: for accessor properties without setterif (getter !setter) returnif (setter) {setter.call(obj, newVal)} else {val newVal}childOb !shallow observe(newVal)dep.notify()}}) } 二、vue2中如何检测数组的变化 数组考虑性能原因没有用 defineProperty 对数组的每一项进行拦截而是选择重写 数组 push,shift,pop,splice,unshift,sort,reverse 方法。 数组中如果是对象数据类型也会进行递归劫持 数组的索引和长度变化是无法监控到的 检测数组的变化是通过重写数组原型上的相关方法来实现的。具体步骤如下 首先Vue会判断当前浏览器是否支持原生的数组方法。如果支持则直接重写数组原型上的方法并在重写的方法中添加对应的变异方法。如果不支持则创建一个新的对象使用Object.defineProperty来拦截数组变异方法。 在重写数组方法时Vue会先缓存原生的数组方法比如Array.prototype.push、Array.prototype.pop等。然后在重写的方法中先调用缓存的原生方法再根据不同的变异方法类型执行不同的操作比如添加响应式元素、触发依赖更新等。 Vue还会判断是否支持__proto__属性如果支持则直接将数组的原型指向重写的原型对象以便数组的原型链能够正常查找到重写的方法。如果不支持则遍历重写的原型对象将其中的方法拷贝到数组的实例上。 示例代码如下 // 是否支持原生数组方法 const hasProto __proto__ in {}; // 缓存原生数组方法 const arrayProto Array.prototype; // 创建重写的原型对象 const arrayMethods Object.create(arrayProto);// 定义重写的原型方法 [push, pop, shift, unshift, splice, sort, reverse].forEach(function (method) {// 缓存原生数组方法const original arrayProto[method];// 重写原型方法def(arrayMethods, method, function mutator(...args) {// 调用原生数组方法const result original.apply(this, args);// 获取当前数组的__ob__属性即Observer实例const ob this.__ob__;// 数组变异操作的类型let inserted;switch (method) {case push:case unshift:inserted args;break;case splice:inserted args.slice(2);break;}// 如果有新增的元素将其转换为响应式对象if (inserted) ob.observeArray(inserted);// 触发依赖更新ob.dep.notify();return result;}); });// 将重写的原型对象设置到数组的原型上 const arrayKeys Object.getOwnPropertyNames(arrayMethods); if (hasProto) {protoAugment(target, arrayMethods); } else {copyAugment(target, arrayMethods, arrayKeys); }通过以上代码Vue实现了对数组变化的检测并能够自动追踪数组的操作以实现响应式更新。
http://www.pierceye.com/news/822385/

相关文章:

  • 网站开发概述多城市二手车网站源码
  • 网站建设的内容策略本人做静态网站开发
  • 网站建设到运营赚钱网站主体负责人邮箱
  • 国外有在线做设计方案的网站吗网站地址免费
  • 做谷歌网站使用什么统计代码吗公司流程建设的意义
  • 网站广告收入如何缴文化事业建设费东莞人才市场招聘信息2023
  • 各大网站网址目录云服务器是什么意思
  • 免费作文网站张家港做网站排名
  • 具有营销价值好的网站找网站建设需要问什么软件
  • 免费好用的网页制作软件网站建设优化开发公司
  • 跟我一起做网站pdf电驴建设网站公开教学视频
  • 广州网站制作商怎样查看网站的权重
  • 网站群建设标准最好的响应式网站
  • 石家庄市建设厅网站网页网页设计班
  • 网站首页怎么设计公司网页制作培训试题
  • 虚拟主机怎么做网站新seo排名点击软件
  • 买服务器做网站 镜像选什么网页设计用的软件
  • 内江 网站建设网站后台登录地址
  • 网站建设合同副本临沂建设局官方网站
  • 林州网站建设哪家好网站做电子链接标识申请好吗
  • 石家庄开发网站建设263企业邮箱登录邮箱
  • 青岛公司建设网站电子商务网站开发技术论文
  • 龙华网站的建设建设网站教程视频视频
  • 威海高区建设局网站品牌网站建设多少钱
  • 网站php网站空间新乡河南网站建设
  • 你第一个物流网站建设方案信诚网络公司网站
  • 企业建站什么网站好wordpress管理员后台
  • 南京网站开发价格两个wordpress共用一个数据库
  • 番禺制作网站平台柳城网站制作
  • 网站建设相关视频教程网页设计布局有哪几种方法