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

广州互帮物流哪家公司做的网站seo服务价格表

广州互帮物流哪家公司做的网站,seo服务价格表,做亚克力在那个网站上好,自己怎么做拼单网站开始 声明一个对象man,可以视为vue中的data let man {height: 180,weight: 70,wealth: 100000000 } 添加Observer 作用在于将参数对象的属性变为响应式,只要对象的属性被读取或者被修改都能观察到。然后新建一个Observer实例,将man作为参数扔…

开始

声明一个对象man,可以视为vue中的data

let man = {height: 180,weight: 70,wealth: 100000000
}

添加Observer

作用在于将参数对象的属性变为响应式,只要对象的属性被读取或者被修改都能观察到。然后新建一个Observer实例,将man作为参数扔进去。这里的proxyData是将man的属性代理到以man为参数的Observer实例上去。

class Observer {constructor(obj) {this.walk(obj)}walk(obj) {Object.keys(obj).forEach(prop => {this[prop] = obj[prop]this.proxyData(obj, prop)this.defineReactive(this, prop, obj[prop])      })}proxyData(obj, prop) {let _this = thisObject.defineProperty(obj, prop, {get() {return _this[prop]},set(newVal) {_this[prop] = newVal}})}defineReactive(obj, prop, val) {Object.defineProperty(obj, prop, {get() {console.log(`${prop} - 被读取!`)return val},set(newVal) {if (newVal == val) returnval = newValconsole.log(`${prop} - 被修改!`)}})}
}new Observer(man)

这时打印一下man


现在man的属性都是由Observer实例所对应的属性的getter来返回,只有在查看时会被触发


对man的属性进行修改也会触发实例对应属性的setter

添加Watcher

现在的Watcher有点像vue中的computed,实际上就是定义一个计算属性,这个计算属性依赖于前面man中的某些属性,由他们计算而得。

class Watcher {constructor(obj, prop, computed) {this.getVal(obj, prop, computed)}getVal(obj, prop, computed) {Object.defineProperty(obj, prop, {get() {console.log(`computed属性 - ${prop}被读取!`)return computed()},set() {console.error('计算属性不可被修改!')}})}
}new Watcher(man, 'strength', () => {let {height, weight} = manif (height > 160 && weight > 70) return 'strong'return 'weak'
})


看起来没什么问题,所依赖的属性如果变了,计算属性只要再被查看(get方法)一次就可以更新了。但vue中的视图渲染是实时的,视图层依赖于数据层,数据变化了,视图层也会跟着变化,不需要手动更新。类比到这个例子就是计算属性如何才能在其所依赖的属性发生变化时被通知从而触发应有的事件?

这时我们先给Watcher加多一个callback,用于处理当依赖的数据被修改时,我这个计算属性该怎么响应

比如当依赖被修改时,我们就把这个计算属性的值打印出来

class Watcher {constructor(obj, prop, computed, callback) {this.getVal(obj, prop, computed, callback)}new Watcher(man, 'strength', () => {let {height, weight} = manif (height > 160 && weight > 70) return 'strong'return 'weak'
}, () => {console.log(`i am so ${man.strength} !`)
})

一切都准备好了,接下来就是该如何实现?

我们先看下Watcher中getVal这个方法

getVal(obj, prop, computed, callback) {Object.defineProperty(obj, prop, {get() {console.log(`computed属性 - ${prop}被读取!`)return computed()},set() {console.error('计算属性不可被修改!')}})
}

当我们查看计算属性时,会调用computed这个方法,相当于查看了其所依赖的height和weight属性,而在上面我们已经让man的所有属性都拥有了get方法,即他们被查看时我们是不是可以把callback塞给他们?
这时候我们引进一个桥梁,来连接Watcher和Observer。

添加Dep

Dep的用处在于当某一个属性(以下称‘自己’)被依赖了,将依赖自己的粉丝(们)--也就是Watcher(s),收集起来,假如自己发生了变化,能够及时通知粉丝们。

class Dep {constructor() {this.deps = []}getDeps() {if (!Dep.target || this.deps.includes(Dep.target)) returnconsole.log('依赖添加', Dep.target)this.deps.push(Dep.target)}notify() {this.deps.forEach(dep => {dep()})}
}

这里的Dep.target就是前面所说的callback方法了。这时我们改一下Watcher中的getVal

getVal(obj, prop, computed, callback) {Object.defineProperty(obj, prop, {get() {Dep.target = callbackconsole.log(`computed属性 - ${prop}被读取!`)return computed()},set() {console.error('计算属性不可被修改!')}})
}

在计算属性被查看时,将callback赋值给Dep.target,接下来就会调用其所依赖属性的getter,我们只要在getter里把callback给收集起来就行了。接下来修改依赖属性的getter方法。

defineReactive(obj, prop, val) {let dep = new Dep()Object.defineProperty(obj, prop, {get() {console.log(`${prop} - 被读取!`)dep.getDeps()  // 依赖收集return val},set(newVal) {if (newVal == val) returnval = newValconsole.log(`${prop} - 被修改!`)       }})
}

这时watcher的callback都被依赖属性给收集起来了,当依赖属性发生变化时只要去运行这些callback就可以了。接下来就是修改依赖属性的setter方法。

defineReactive(obj, prop, val) {let dep = new Dep()Object.defineProperty(obj, prop, {get() {console.log(`${prop} - 被读取!`)dep.getDeps()return val},set(newVal) {if (newVal == val) returnval = newValconsole.log(`${prop} - 被修改!`)dep.notify()  // 运行所有callback}})
}

运行看看


我们加多一个Watcher试试

new Watcher(man, 'isGreat', () => {let {height, weight, wealth} = manif (height > 180 && weight > 70 && wealth > 100000) return 'Great!'return 'not good enough ...'
}, () => {console.log(`they say i am ${man.isGreat}`)
})


这就是vue中的一个依赖对应多个Watcher

http://www.lbrq.cn/news/2734165.html

相关文章:

  • 重庆企业建站模板贵州seo推广
  • 哈尔滨模板做网站培训网址大全
  • 做网站推广的流程真正的免费建站在这里
  • 上海专业高端网站建设服务器外贸推广具体是做什么
  • php网站培训机构企业做网站google下载官方版
  • 网站运营解决方案制作网站要花多少钱
  • 有哪些做兼职的网站武汉网站运营专业乐云seo
  • 微站和pc网站3000块钱在朋友圈投放广告
  • 如何建设一个苹果网站网站建立
  • 外贸电子网站企业网站设计制作
  • 做淘宝的网线可以浏览台湾网站吗seo排名优化软件
  • 网站建好后广告是不是需要搜索引擎优化方法总结
  • 电脑公司网站设计软文撰写
  • 济南市建设信用网站武汉seo管理
  • 怎样建设自己的美甲网站做推广
  • 免费的网站怎么做谷歌关键词
  • 建设官网的网站首页北京网站优化
  • 响应式网站建设公司‘南宁关键词优化软件
  • 网站域名space关键词优化排名网站
  • 深圳布吉网站建设云搜索app官网
  • 网站高端建设电商怎么做新手入门
  • 椒江做网站文登seo排名
  • 全屏网站宽度苏州网站建设哪家靠谱
  • wordpress忘记了密码忘记北京优化推广公司
  • 可以网站可以做免费的文案广告语so导航 抖音
  • 江门网站建设运营团队竞价专员是做什么的
  • 江苏网站建设 seo什么是网络推广工作
  • 许昌网站建设浏览器下载
  • 中国建设银行有哪些招聘网站大数据查询平台
  • 移动端网站如何做导出功能西安今日头条新闻消息
  • 软件的终极:为70亿人编写70亿个不同的软件
  • 开疆智能Ethernet转ModbusTCP网关连接测联无纸记录仪配置案例
  • STM32F103C8T6学习——直接存储器访问(DMA)标准库实战3(ADC数据采集+DMA回传)
  • 电商架构测试体系:ZKmall开源商城筑牢高并发场景下的系统防线
  • Vue3 学习教程,从入门到精通,Axios 在 Vue 3 中的使用指南(37)
  • MyBatis的基本用法和配置方式