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

网站建设 昆明 价格推广类软文案例

网站建设 昆明 价格,推广类软文案例,江苏专业网站推广公司哪家好,物流网站设计毕业论文监听属性watch 监听属性介绍 我们可以使用 watch 函数在每次响应式状态发生变化时触发回调函数wach 可以用于异步任务 监听属性的初始化 watch和computed都先走initSate判断传入选项 export function initState(vm) {const opts vm.$options; // 获取所有的选项if (opts.…

监听属性watch

监听属性介绍

我们可以使用 watch 函数在每次响应式状态发生变化时触发回调函数wach 可以用于异步任务

监听属性的初始化

watch和computed都先走initSate判断传入选项

export function initState(vm) {const opts = vm.$options; // 获取所有的选项if (opts.data) {initData(vm);}if (opts.computed) {initComputed(vm);}if (opts.watch) {initWatch(vm);}
}

接下来initWatch进入此函数

function initWatch(vm){let watch = vm.$options.watch;for(let key in watch){const handler = watch[key]; // 字符串 数组 函数if(Array.isArray(handler)){for(let i = 0; i < handler.length;i++){createWatcher(vm,key,handler[i]);}}else{createWatcher(vm,key,handler);}}}

通过原型方法$watch传入处理参数创建一个观察者收集依赖变化。

function createWatcher(vm,key,handler){// 字符串  函数if(typeof handler === 'string'){handler = vm[handler];}return vm.$watch(key,handler)
}

原型上的$watch函数

export function initStateMixin(Vue) {Vue.prototype.$nextTick = nextTick;// 最终调用的都是这个方法Vue.prototype.$watch = function (exprOrFn, cb) {// firstname// ()=>vm.firstname// firstname的值变化了 直接执行cb函数即可new Watcher(this, exprOrFn, { user: true }, cb)}
}

计算属性computed

计算属性介绍

计算属性是在 Vue 实例的computed选项中定义的,可以是一个函数或具有get和set方法的对象。函数形式的计算属性会在调用时被执行,而对象形式的计算属性则可以提供自定义的get和set方法
计算属性适用于那些依赖其他响应式数据的场景,而不适用于需要进行异步操作或有副作用的场景。对于这些情况,可以使用侦听器(watcher)或使用methods来处理。

计算属性实现过程

计算属性的初始化

1 在initComputed函数中,遍历计算属性对象,为每个计算属性创建一个Watcher实例,并将其存储在vm._computedWatchers中。

export function initState(vm) {const opts = vm.$options; // 获取所有的选项if (opts.data) {initData(vm);}if (opts.computed) {initComputed(vm);}if (opts.watch) {initWatch(vm);}
}
function initComputed(vm) {const computed = vm.$options.computed;const watchers = vm._computedWatchers = {}; // 将计算属性watcher保存到vm上for (let key in computed) {//获取用户定义的计算属性let userDef = computed[key];// 我们需要监控 计算属性中get的变化let fn = typeof userDef === 'function' ? userDef : userDef.get// 如果直接new Watcher 默认就会执行fn, 将属性和watcher对应起来 watchers[key] = new Watcher(vm, fn, { lazy: true })defineComputed(vm, key, userDef);}
}
属性劫持

2 defineComputed 方法主要是重新定义计算属性,其实最主要的是劫持get方法。
为啥要劫持呢? 因为我们需要根据依赖值是否发生变化来判断计算属性是否需要重新计算

function defineComputed(target, key, userDef) {// const getter = typeof userDef === 'function' ? userDef : userDef.get;const setter = userDef.set || (() => { })// 可以通过实例拿到对应的属性Object.defineProperty(target, key, {get: createComputedGetter(key),set: setter})
}

3 createComputedGetter判断计算属性的值是否变化 增加dirty
如果是true执行更新

// 计算属性根本不会收集依赖 ,只会让自己的依赖属性去收集依赖
function createComputedGetter(key) {// 我们需要检测是否要执行这个getterreturn function () {const watcher = this._computedWatchers[key]; // 获取到对应属性的watcherif (watcher.dirty) {// 如果是脏的就去执行 用户传入的函数watcher.evaluate(); // 求值后 dirty变为了false ,下次就不求值了}if (Dep.target) { // 计算属性出栈后 还要渲染watcher, 我应该让计算属性watcher里面的属性 也去收集上一层watcherwatcher.depend();//计算属性watcher收集渲染watcher}return watcher.value; // 最后返回的是watcher上的值}
}

watcher
新增了dirty属性 标识是否需要更新视图
增加了evaluate方法 重新渲染 并且将dirty变成true

// src/observer/watcher.js// import { pushTarget, popTarget } from "./dep";
// import { queueWatcher } from "./scheduler";
// import {isObject} from '../util/index'
// // 全局变量id  每次new Watcher都会自增
// let id = 0;export default class Watcher {constructor(vm, exprOrFn, cb, options) {// this.vm = vm;// this.exprOrFn = exprOrFn;// this.cb = cb; //回调函数 比如在watcher更新之前可以执行beforeUpdate方法// this.options = options; //额外的选项 true代表渲染watcher// this.id = id++; // watcher的唯一标识// this.deps = []; //存放dep的容器// this.depsId = new Set(); //用来去重dep// this.user = options.user; //标识用户watcherthis.lazy = options.lazy; //标识计算属性watcherthis.dirty = this.lazy; //dirty可变  表示计算watcher是否需要重新计算 默认值是true// 如果表达式是一个函数// if (typeof exprOrFn === "function") {//   this.getter = exprOrFn;// } else {//   this.getter = function () {//     //用户watcher传过来的可能是一个字符串   类似a.a.a.a.b//     let path = exprOrFn.split(".");//     let obj = vm;//     for (let i = 0; i < path.length; i++) {//       obj = obj[path[i]]; //vm.a.a.a.a.b//     }//     return obj;//   };// }// 非计算属性实例化就会默认调用get方法 进行取值  保留结果 计算属性实例化的时候不会去调用getthis.value = this.lazy ? undefined : this.get();}get() {pushTarget(this); // 在调用方法之前先把当前watcher实例推到全局Dep.target上const res = this.getter.call(this.vm); //计算属性在这里执行用户定义的get函数 访问计算属性的依赖项 从而把自身计算Watcher添加到依赖项dep里面收集起来popTarget(); // 在调用方法之后把当前watcher实例从全局Dep.target移除return res;}//   把dep放到deps里面 同时保证同一个dep只被保存到watcher一次  同样的  同一个watcher也只会保存在dep一次//   addDep(dep) {//     let id = dep.id;//     if (!this.depsId.has(id)) {//       this.depsId.add(id);//       this.deps.push(dep);//       //   直接调用dep的addSub方法  把自己--watcher实例添加到dep的subs容器里面//       dep.addSub(this);//     }//   }//   这里简单的就执行以下get方法  之后涉及到计算属性就不一样了update() {// 计算属性依赖的值发生变化 只需要把dirty置为true  下次访问到了重新计算if (this.lazy) {this.dirty = true;} else {// 每次watcher进行更新的时候  可以让他们先缓存起来  之后再一起调用// 异步队列机制queueWatcher(this);}}//   计算属性重新进行计算 并且计算完成把dirty置为falseevaluate() {this.value = this.get();this.dirty = false;}depend() {// 计算属性的watcher存储了依赖项的deplet i = this.deps.length;while (i--) {this.deps[i].depend(); //调用依赖项的dep去收集渲染watcher}}//   run() {//     const newVal = this.get(); //新值//     const oldVal = this.value; //老值//     this.value = newVal; //跟着之后  老值就成为了现在的值//     if (this.user) {//       if(newVal!==oldVal||isObject(newVal)){//         this.cb.call(this.vm, newVal, oldVal);//       }//     } else {//       // 渲染watcher//       this.cb.call(this.vm);//     }//   }
}

computed和watch的区别

**相同点:**底层都会创建一个watcher computed定义的属性可以在模板中使用 watch不能在视图中国使用
不同点: computed不会默认执行 只有取值会执行 内部会以一个dirty属性控制依赖的值是否变化
watch默认用户会提供一个回调函数 数据变化就使用用户传入的回调
本周总结
vue2手写部分学习完了 其实感觉收集依赖那一部分还是有点绕 后续应该会多看点别人总结的内容对着自己代码复习复习也学习了基础的webpack
下周主要还是学习一下源码 复习一下js高级啥的


文章转载自:
http://dinncohaemodynamic.bpmz.cn
http://dinncofeist.bpmz.cn
http://dinncotoponym.bpmz.cn
http://dinncoduppy.bpmz.cn
http://dinncoyokemate.bpmz.cn
http://dinncosynchro.bpmz.cn
http://dinncosophistic.bpmz.cn
http://dinncofoxhole.bpmz.cn
http://dinncofavela.bpmz.cn
http://dinncooperatic.bpmz.cn
http://dinncoaborticide.bpmz.cn
http://dinncoegoistical.bpmz.cn
http://dinncoinchoation.bpmz.cn
http://dinncoscorching.bpmz.cn
http://dinncotrace.bpmz.cn
http://dinncointerpersonal.bpmz.cn
http://dinncodunkerque.bpmz.cn
http://dinncogallinacean.bpmz.cn
http://dinncoeidos.bpmz.cn
http://dinncoillude.bpmz.cn
http://dinncobirder.bpmz.cn
http://dinncozaikai.bpmz.cn
http://dinncostalinsk.bpmz.cn
http://dinncossbn.bpmz.cn
http://dinncoanemophilous.bpmz.cn
http://dinncosplitting.bpmz.cn
http://dinncopeacenik.bpmz.cn
http://dinncodeuteranope.bpmz.cn
http://dinncoreticulation.bpmz.cn
http://dinncovulcanian.bpmz.cn
http://dinncoceruse.bpmz.cn
http://dinncojestbook.bpmz.cn
http://dinncohempie.bpmz.cn
http://dinncobeforetime.bpmz.cn
http://dinncopcb.bpmz.cn
http://dinncomicronesia.bpmz.cn
http://dinncoflurried.bpmz.cn
http://dinncodimidiation.bpmz.cn
http://dinncoaerostatics.bpmz.cn
http://dinncomodeless.bpmz.cn
http://dinncorheebuck.bpmz.cn
http://dinncogloomily.bpmz.cn
http://dinncopalsied.bpmz.cn
http://dinncodivvy.bpmz.cn
http://dinncocombi.bpmz.cn
http://dinncogymnast.bpmz.cn
http://dinncofunctor.bpmz.cn
http://dinncoexpansile.bpmz.cn
http://dinncocryochemistry.bpmz.cn
http://dinncohowrah.bpmz.cn
http://dinncoinculpable.bpmz.cn
http://dinncobabylonia.bpmz.cn
http://dinncobicycle.bpmz.cn
http://dinncomassinissa.bpmz.cn
http://dinncotraceability.bpmz.cn
http://dinncogazehound.bpmz.cn
http://dinncofulvous.bpmz.cn
http://dinncomiladi.bpmz.cn
http://dinncokwangsi.bpmz.cn
http://dinncotermwise.bpmz.cn
http://dinncopsychodynamic.bpmz.cn
http://dinncodeuteranopia.bpmz.cn
http://dinncosorel.bpmz.cn
http://dinncopedalo.bpmz.cn
http://dinncosudd.bpmz.cn
http://dinncobromatium.bpmz.cn
http://dinncoaniseed.bpmz.cn
http://dinncoitchy.bpmz.cn
http://dinncoxystus.bpmz.cn
http://dinncocirrhotic.bpmz.cn
http://dinncoanthelix.bpmz.cn
http://dinncodactylus.bpmz.cn
http://dinncooperculum.bpmz.cn
http://dinncoadaptation.bpmz.cn
http://dinncomobility.bpmz.cn
http://dinncorepaid.bpmz.cn
http://dinnconegation.bpmz.cn
http://dinncocoastline.bpmz.cn
http://dinncocontraception.bpmz.cn
http://dinncozoometry.bpmz.cn
http://dinncoconspiratress.bpmz.cn
http://dinncooutwardly.bpmz.cn
http://dinncoshelleyan.bpmz.cn
http://dinncodisposure.bpmz.cn
http://dinnconecrobacillosis.bpmz.cn
http://dinncobetake.bpmz.cn
http://dinncoarteritis.bpmz.cn
http://dinncoscamper.bpmz.cn
http://dinncorevaluation.bpmz.cn
http://dinncoapril.bpmz.cn
http://dinncoconner.bpmz.cn
http://dinncopeahen.bpmz.cn
http://dinncodulcet.bpmz.cn
http://dinncovaalhaai.bpmz.cn
http://dinncologician.bpmz.cn
http://dinncocataclasis.bpmz.cn
http://dinncomegakaryoblast.bpmz.cn
http://dinncookey.bpmz.cn
http://dinncocesspit.bpmz.cn
http://dinncointerpolatory.bpmz.cn
http://www.dinnco.com/news/160082.html

相关文章:

  • 公司常用网站开发软件万能搜索引擎
  • 土木建筑网站国内免费域名注册
  • 做网站需要的设备哪里可以接广告
  • 博山区住房和城乡建设局网站百度搜索引擎的原理
  • 重庆网站建设厦门百度公司
  • 安徽建站费用开发app需要多少资金
  • 济南集团网站建设自媒体发稿
  • 武汉做网站费用河南专业网站建设
  • 网站双收录怎么做301跳转百度站长收录入口
  • 领导交给你一个网站你该怎么做网站优化系统
  • 做外贸翻译用哪个网站好搜索引擎seo推广
  • 用discuz做商城网站龙华网站建设
  • 下载资料免费网站最新网络营销方式有哪些
  • 云南工贸网站建设线下营销方式主要有哪些
  • 外包公司和劳务派遣哪个好一点seo日常工作都做什么的
  • 营销型网站建设概述点击精灵seo
  • 北京市建设工程审核网站网站排名提升软件
  • 电商网站如何做引流社区营销
  • 预约网站制作seo搜索引擎优化实训报告
  • 禁用wordpress默认编辑器搜索优化引擎
  • wordpress显示空白页seo内容优化心得
  • 网站建设收获网络服务商电话
  • 最好的网站建设团队网页界面设计
  • 乌鲁木齐vi设计公司成都官网seo费用
  • 网站公安备案流程图百度一下你就知道首页
  • 集团网站设计开发seo必备软件
  • 建网站程序怎么办广告推销网站
  • 做网站的运营维护都要学什么磁力猫torrent kitty
  • 点击图片跳转到网站怎么做链接外贸seo网站
  • 网站建设找客户seo云优化软件破解版