# 列表渲染

# 1.key 的作用与原理

图片

# react vue中的key有什么作用?(key的内部原理)

  1. 虚拟DOM中key的作用:key是虚拟DOM中对象的标识,当数据发生变化时,Vue会根据新数据生成新的虚拟DOM,随后Vue进行新虚拟DOM与旧虚拟DOM的差异比较,比较规则如下

  2. 对比规则
    a.旧虚拟DOM中找到了与新虚拟DOM相同的key

     若虚拟DOM中内容没变, 直接使用之前的真实DOM
     若虚拟DOM中内容变了, 则生成新的真实DOM,随后替换掉页面中之前的真实DOM
    

    b.旧虚拟DOM中未找到与新虚拟DOM相同的key -----> 创建新的真实DOM,随后渲染到到页面

  3. 用index作为key可能会引发的问题
    a.若对数据进行逆序添加、逆序删除等破坏顺序操作,会产生没有必要的真实DOM更新 ==> 界面效果没问题,但效率低
    b.若结构中还包含输入类的DOM:会产生错误DOM更新 ==> 界面有问题

  4. 开发中如何选择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

原理

  1. vue会监视data中所有层次的数据
  2. 如何监测对象中的数据?
    通过setter实现监视,且要在new Vue()时就传入要监测的数据
  • 对象创建后追加的属性,Vue默认不做响应式处理
  • 如需给后添加的属性做响应式,使用如下API
Vue.set(target,propertyName,value)
vm.$set(target,propertyName,value)
1
2
  1. 如何监测数组中的数据?
    通过包裹数组更新元素的方法实现,本质就是做了两件事
    a. 调用原生对应的方法对数组进行更新
    b. 重新解析模板,进而更新页面
  2. 在Vue修改数组中的某个元素一定要用如下方法
    push()pop()unshift()shift()splice()sort()reverse()这几个方法被Vue重写了
    Vue.set()或vm.$set()
    特别:Vue.set() 和 vm.$set() 不能给vm或vm的根数据对象(data等)添加属性