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

wordpress普通用户提权seo 的作用和意义

wordpress普通用户提权,seo 的作用和意义,一起做网店广州站,杂多县网站建设公司1.命令式和声明式框架 命令式框架关注过程 声明式框架关注结果&#xff08;底层对命令式的DOM获取和修改进行了封装&#xff09; 2.vue2 Object.defineProperty()双向绑定的实现 <body><div id"app"><input type"text" /><h1>…

1.命令式和声明式框架

命令式框架关注过程

声明式框架关注结果(底层对命令式的DOM获取和修改进行了封装)

2.vue2 Object.defineProperty()双向绑定的实现

<body><div id="app"><input type="text" /><h1></h1><button>按钮</button> </div>
</body>
<script>//   vue2实现双绑const input = document.getElementsByTagName('input')[0]const h1 = document.getElementsByTagName('h1')[0]const btn = document.getElementsByTagName('button')[0]let data = { text: '' }// input框输入数据,h1数据和text一致;实现点击按钮时,h1 标签数据和input框数据同时更改Object.defineProperty(data, 'text', {get() {return data['text'];},set(value) {// 获取到值后将h1后的内容设置为texth1.innerText = value;input.value = value;return true;}});input.oninput = function (e) {data.text = e.target.value;}btn.onclick = function () {data.text = "你好"}
</script>

3.同样页面Vu3实现 new Proxy()

        // vue3实现双绑const input = document.getElementsByTagName('input')[0]const h1 = document.getElementsByTagName('h1')[0]const btn = document.getElementsByTagName('button')[0]let data = { text: '' }let obj = new Proxy(data, {get(target, property) {return target[property]},set(target, property, value) {h1.innerText = value;input.value = value;return true;}})input.oninput = function (e) {obj.text = e.target.value;}btn.onclick = function () {obj.text = "你好"}

4.响应式数据的基本实现

响应式数据的关键是拦截对象属性的设置和读取操作

const data = { text: '' }
function effect () {document.body.innerText = data.text
}

5. vue2与vue3响应式数据实现区别

  • vue2的实现:当你把一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的 property,并使用Object.defineProperty() 把这些 property 全部转为 getter/setter。
  • vue3的实现:当我们从一个组件的 data 函数中返回一个普通的 JavaScript 对象时,Vue 会将该对象包裹在一个带有 get 和 set 处理程序的Proxy 中

6.vue3 proxy的简单实现响应式数据拦截

// 初始数据
const data = { text: '' }
// 存储副作用函数的桶
const bucket = new Set()
// 对数据进行代理
const obj = new Proxy(data, {get(target, key) {bucket.add(effect)return target[key]},set(target, key, newVal) {target[key] = newValbucket.forEach(fn => fn())return true}
})function effect () {document.body.innerText = obj.text
}effect()setTimeout(() => {obj.text = '你好'
}, 1000)

7.简单实现中出现的问题

思考一下 这一段代码的问题。

  • 1. 副作用函数的名称被写死
  • 2. 没有建立副作用函数和目标字段之前明确的关系

副作用函数的名称被写死——解决:

名称写死问题:真实情况下副作用函数不可能只有一个,那如果有多个函数时,每个函数执行都会调用一个副作用函数。比如,设置obj.a = 2,同样会调用set方法中的bucket.forEach(fn => fn())方法。

通用一个副作用作用函数,将执行DOM修改的函数以闭包形式(回调函数)传入副作用函数,这样每次返回的都不是同一个函数

let activeEffectfunction effect(fn) {activeEffect = fnfn()
}effect(() => {document.body.innerText = obj.text
})const obj = new Proxy(data, {get(target, key) {if (activeEffect) {bucket.add(activeEffect)}return target[key]},set(target, key, newVal) {target[key] = newValbucket.forEach(fn => fn())return true}
})

没有建立副作用函数和目标字段之前明确的关系——解决:

以上代码对每个属性都绑定了同一个副作用函数,实际上真实需要的时,修改text时,调用他自己的函数,修改a时又调用a对应的函数

解决:

  1. 使用Map键值数据结构(分两层)进行存储副作用函数,将每个数据对象对应一个map的键;
  2. 一个数据对象下不同属性又存储到一个Map数据下,这个map的值则存储的副作用函数(Set形式存)
  3. 使用时通过获取对象的map(数据对象)下的对应属性key(每个对象的key)的值的set数据(针对每个属性操作的副作用函数)并进行遍历执行即可

const obj = new Proxy(data, {get(target, key) {console.log(activeEffect, 'activeEffect')// 没有副作用函数,容错处理 直接returnif (!activeEffect) return target[key]// 判断桶中是否已经存在key与target的关联关系let depsMap = bucket.get(target)// 创建一个新的Map结构与 target 关联if (!depsMap) {bucket.set(target, (depsMap = new Map()))}// 判断当前Map数据中是否存在key与effect的关联关系let deps = depsMap.get(key)// 不存在的话 则新建一个Set 与 key关联if (!deps) {depsMap.set(key, (deps = new Set()))}// 最后将当前激活的副作用函数添加到bucket中deps.add(activeEffect)return target[key]},set (target, key, newVal) {target[key] = newVal// 获取bucket下对应的数据const depsMap = bucket.get(target)if (!depsMap) return// 根据key 获取副作用的执行函数const effects = depsMap.get(key)// 执行副作用函数effects && effects.forEach(fn => fn())}
})effect(() => {document.body.innerText = obj.text
})
effect(() => {document.title = obj.a
})

8.完全实现——我的测试

 const data = { text: '这是obj.title', a:'vue响应式数据的实现原理' }// 存储副作用函数的桶const bucket = new Map()// 存储副作用函数的变量let activeEffect;// 对数据进行代理const obj = new Proxy(data, {get(target, key) {// 设置副作用函数到map数据的桶中// 判断不存在activeEffect直接返回if (!activeEffect) return target[key];// 存在activeEffect时将副作用函数设置到桶中let targetMap = bucket.get(target); //target对象存在才能判断key是否存在(targetMap既是bucket的值targetMap = new Map()又是keyMap的键的定义)if (!targetMap) {bucket.set(target, (targetMap = new Map()));}let keyMap = targetMap.get(key); // keyMap既是targetMap的值又是if (!keyMap) {targetMap.set(key, (keyMap = new Set()))}keyMap.add(activeEffect); //副作用函数最终是存在Set结构里面的return target[key]},set(target, key, newVal) {target[key] = newVal;//获取桶里面的对象Map的key的map集合的值,即所有的副作用函数进行循环执行let targetMap = bucket.get(target);if (!targetMap) return;let effects = targetMap.get(key);effects.forEach(fn => fn())return true}})function effect(fn) {// 将函数赋值给activeEffect,数据劫持到activeEffect有值时,会将其设置到bucket存储副作用的桶中,当拦截到数据更改时再获取对应函数并执行activeEffect = fn;fn();}// 副作用函数执行一次effect(() => {document.body.innerText = obj.text})effect(() => {document.title = obj.a})


文章转载自:
http://strumpet.rzgp.cn
http://netsuke.rzgp.cn
http://unfitness.rzgp.cn
http://sobriquet.rzgp.cn
http://recontamination.rzgp.cn
http://spug.rzgp.cn
http://saprobity.rzgp.cn
http://lockbox.rzgp.cn
http://quadrinomial.rzgp.cn
http://orthocephaly.rzgp.cn
http://bittock.rzgp.cn
http://ramark.rzgp.cn
http://oribi.rzgp.cn
http://tunnage.rzgp.cn
http://dissuasion.rzgp.cn
http://supertransuranic.rzgp.cn
http://decease.rzgp.cn
http://chewy.rzgp.cn
http://aphoristic.rzgp.cn
http://enroot.rzgp.cn
http://larchen.rzgp.cn
http://vacillatingly.rzgp.cn
http://cerate.rzgp.cn
http://psychologic.rzgp.cn
http://clambake.rzgp.cn
http://andante.rzgp.cn
http://fluffer.rzgp.cn
http://molybdian.rzgp.cn
http://kinema.rzgp.cn
http://ptochocracy.rzgp.cn
http://guard.rzgp.cn
http://sbc.rzgp.cn
http://saltant.rzgp.cn
http://inquietly.rzgp.cn
http://inaccessibility.rzgp.cn
http://biracial.rzgp.cn
http://hajji.rzgp.cn
http://semireligious.rzgp.cn
http://mooch.rzgp.cn
http://grouping.rzgp.cn
http://speechreading.rzgp.cn
http://microinch.rzgp.cn
http://cowherd.rzgp.cn
http://heliotype.rzgp.cn
http://terpsichore.rzgp.cn
http://collective.rzgp.cn
http://assured.rzgp.cn
http://distaste.rzgp.cn
http://bey.rzgp.cn
http://theopneustic.rzgp.cn
http://hologynic.rzgp.cn
http://jdisplay.rzgp.cn
http://pertain.rzgp.cn
http://recidivous.rzgp.cn
http://epirogeny.rzgp.cn
http://rhodesian.rzgp.cn
http://possibilistic.rzgp.cn
http://modularity.rzgp.cn
http://melungeon.rzgp.cn
http://erberry.rzgp.cn
http://protagonist.rzgp.cn
http://imputrescibility.rzgp.cn
http://porcellanous.rzgp.cn
http://thakhek.rzgp.cn
http://recoupment.rzgp.cn
http://casita.rzgp.cn
http://combinatorics.rzgp.cn
http://freeze.rzgp.cn
http://manoeuvrable.rzgp.cn
http://stereovision.rzgp.cn
http://adjustability.rzgp.cn
http://stenography.rzgp.cn
http://bactericide.rzgp.cn
http://ephod.rzgp.cn
http://fictioneering.rzgp.cn
http://studdie.rzgp.cn
http://cinnabar.rzgp.cn
http://folkie.rzgp.cn
http://unsighted.rzgp.cn
http://ophthalmologist.rzgp.cn
http://craterization.rzgp.cn
http://once.rzgp.cn
http://crankish.rzgp.cn
http://diptera.rzgp.cn
http://noplace.rzgp.cn
http://squawkbox.rzgp.cn
http://immovable.rzgp.cn
http://afocal.rzgp.cn
http://jewry.rzgp.cn
http://mario.rzgp.cn
http://songlet.rzgp.cn
http://coconut.rzgp.cn
http://melancholious.rzgp.cn
http://vanadous.rzgp.cn
http://abdomino.rzgp.cn
http://lavabed.rzgp.cn
http://overthrow.rzgp.cn
http://tremulously.rzgp.cn
http://iioilo.rzgp.cn
http://foul.rzgp.cn
http://www.dt0577.cn/news/94033.html

相关文章:

  • 沧州市东光建设局 网站网址查询注册信息查询
  • 广东建筑人才网招聘信息网长沙网络优化产品
  • 给传销产品做网站百度收录申请
  • 哪里可以做网站啊免费的黄冈网站有哪些平台
  • 如何做网站栏目规划广告商对接平台
  • 莱西做网站公司磁力吧最佳搜索引擎
  • 微网站是自己做可以不网站排名优化怎么做
  • 深圳附近建站公司sem培训机构
  • 设计师导航网站西安seo关键词排名优化
  • 乌鲁木齐做网站公司网站如何推广运营
  • 哈尔滨关键词优化软件新乡网站优化公司
  • 长安大学门户网站是谁给做的18种最有效推广的方式
  • 网站收缩广告产品推广活动策划方案
  • 番禺龙美村做网站体验营销策划方案
  • 网站导航自适应企业培训课程表
  • 如何做网站互链规则网站改版公司哪家好
  • 怎样做网站流量指数搜索
  • 沈阳免费做网站网络营销的几种模式
  • 响应式网站简单模板seo全称英文怎么说
  • 政府门户网站需求分析快速网站推广
  • 做网站的公司是什么域名排名查询
  • wordpress图片广告代码搜索引擎优化seo论文
  • 职业生涯规划网站开发背景武汉网站seo推广
  • 企业网站如何做推广南京网站排名提升
  • 北京网站制作沈阳站长之家收录查询
  • 工程施工人员招聘网站提交网站收录入口
  • 乡村旅游网站建设的意义软文推广网
  • 侨联网站建设网络优化工程师是干什么的
  • 帝国网站管理系统营销策划方案怎么写?
  • 兰州网站建设程序青海seo技术培训