# 列表渲染
# 1.key 的作用与原理

# react vue中的key有什么作用?(key的内部原理)
虚拟DOM中key的作用:key是虚拟DOM中对象的标识,当数据发生变化时,Vue会根据新数据生成新的虚拟DOM,随后Vue进行新虚拟DOM与旧虚拟DOM的差异比较,比较规则如下
对比规则
a.旧虚拟DOM中找到了与新虚拟DOM相同的key若虚拟DOM中内容没变, 直接使用之前的真实DOM 若虚拟DOM中内容变了, 则生成新的真实DOM,随后替换掉页面中之前的真实DOMb.旧虚拟DOM中未找到与新虚拟DOM相同的key -----> 创建新的真实DOM,随后渲染到到页面
用index作为key可能会引发的问题
a.若对数据进行逆序添加、逆序删除等破坏顺序操作,会产生没有必要的真实DOM更新 ==> 界面效果没问题,但效率低
b.若结构中还包含输入类的DOM:会产生错误DOM更新 ==> 界面有问题开发中如何选择key?
a.最好使用每条数据的唯一标识作为key,比如 id、手机号、身份证号、学号等唯一值
b.如果不存在对数据的逆序添加、逆序删除等破坏顺序的操作,仅用于渲染列表,使用index作为key是没有问题的
# 2.数据监视
# 像vue一样模拟一个数据监测
let data = {
name: 'jdzx',
address: '北京',
}
function Observer(obj) {
// 汇总对象中所有的属性形成一个数组
const keys = Object.keys(obj)
// 遍历
keys.forEach((k) => {
Object.defineProperty(this, k, {
get() {
return obj[k]
},
set(val) {
console.log(`${k}被改了,解析模板,生成虚拟DOM.....`)
obj[k] = val
}
})
})
}
// 创建一个监视的实例对象,用于监视data中属性的变化
const obs = new Observer(data)
console.log(obs)
// 准备一个vm实例对象
let vm = {}
vm._data = data = obs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
原理
- vue会监视data中所有层次的数据
- 如何监测对象中的数据?
通过setter实现监视,且要在new Vue()时就传入要监测的数据
- 对象创建后追加的属性,Vue默认不做响应式处理
- 如需给后添加的属性做响应式,使用如下API
Vue.set(target,propertyName,value)
vm.$set(target,propertyName,value)
1
2
2
- 如何监测数组中的数据?
通过包裹数组更新元素的方法实现,本质就是做了两件事
a. 调用原生对应的方法对数组进行更新
b. 重新解析模板,进而更新页面 - 在Vue修改数组中的某个元素一定要用如下方法
push()pop()unshift()shift()splice()sort()reverse()这几个方法被Vue重写了
Vue.set()或vm.$set()
特别:Vue.set() 和 vm.$set() 不能给vm或vm的根数据对象(data等)添加属性