Reactive 基础
- 数据绑定概念
- Reactive 概念
- Object.defineProperty 介绍
- Reactive 实现
数据绑定概念
- 数据 → HTML 模板
- 如何简化流程?
- data = newData
在一般情况下我们要把数据插入到模版上,我们需要请求数据,然后拼接字符串,在调用jQuery的方法来把模版插入到DOM中。有时候会将涉及到比较多的业务代码,在手动拼接的维护上甚至对展示结构的完整性有一定的风险。
$.get('/xx-api', (data) => {
// 拼接模板
const template = `<div>${data}</div>`
// 渲染到页面上
$('#xx-table').html(template)
})
Reactive 概念
我们只需要为对数据赋予新的值,所有和这个数据相关的内容都会得到响应。例如我对一个列表的数据进行 push 操作,那么这个列表数据所绑定的DOM当中也会发生动态的更新。
- 一种特殊类型的对象
- 支持响应式更新
- 基于 Accessor 设计模式(访问者)
我们具有一个特殊类型的数据,对这个数据进行存取,都会引起一些状态的变更,所有订阅了他的事件或者绑定了和他相关的数据,都会在这个数据被访问的时候进行响应式的更新。
Object.defineProperty 介绍
Object.defineProperty(obj, prop, descriptor) 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
- ES5 标准特性
- 参数
- obj 要在其上定义属性的对象
- prop 要定义或修改的属性的名称
- descriptor 将被定义或修改的属性描述符
- 读写对象属性值时,触发事件钩子
- get ()
- set ()
- 局限
- 仅支持 Object,不支持 Array 与 primitive 类型
- 动态为对象添加属性时无法触发
Reactive 实现
- 基于 defineProperty,实现 defineReactive 函数
function defineReactive (obj, key, val) {
Object.defineProperty(obj, key, {
get () {
return val
},
set (newValue) {
val = newValue
}
})
}
const demo = {}
defineReactive(demo, 'foo', 123)
console.log(demo.foo)