概述:通过一个对象代理另一个对象属性的操作,这里先将数据代理,后面的数据劫持、检测后面细讲
我们代码中的data对象数据经过一番操作后变成_data挂载到vm上面,但每次访问数据只能通过_data访问不方便,VUE便直接代理到vm身上,原理图如下所示:
概述:for in遍历,插值语法使用数据,:key这里咋暂且认为标识的每一条数据
初始数据生成虚拟DOM、虚拟DOM转换成真实DOM,注意VUE对之前的DOM留有备份在内存中,留给后面的对比算法
重新生成虚拟dom,根据唯一标识符key和之前的虚拟dom比较(未找到重新生成真实DOM)
会导致标签标识出现问题,加大了工作量(无法复用数据)、导致输入的数据错位
面试题:react、vue中的key有什么作用?(key的内部原理) 1. 虚拟DOM中key的作用: key是虚拟DOM对象的标识,当数据发生变化时,Vue会根据【新数据】生成【新的虚拟DOM】, 随后Vue进行【新虚拟DOM】与【旧虚拟DOM】的差异比较,比较规则如下: 2.对比规则: (1).旧虚拟DOM中找到了与新虚拟DOM相同的key: ①.若虚拟DOM中内容没变, 直接使用之前的真实DOM! ②.若虚拟DOM中内容变了, 则生成新的真实DOM,随后替换掉页面中之前的线).旧虚拟DOM中未找到与新虚拟DOM相同的key 创建新的真实DOM,随后渲染到到页面。 3. 用index作为key可能会引发的问题: 1. 若对数据进行:逆序添加、逆序删除等破坏顺序操作: 会产生没有必要的真实DOM更新 == 界面效果没问题, 但效率低。
2. 如果结构中还包含输入类的DOM: 会产生错误DOM更新 == 界面有问题。
4. 开发中如何选择key?: 1.最好使用每条数据的唯一标识作为key, 比如id、手机号、身份证号、学号等唯一值。 2.如果不存在对数据的逆序添加、逆序删除等破坏顺序操作,仅用于渲染列表用于展示, 使用index作为key是没有问题的。
和v-model针对具有 value 属性的标签,对于其他的标签,可使用下述方法
再显示(适用于一些简单逻辑的处理)语法: 1.注册过滤器:Vue.filter(name,callback) 或 new Vue{filters:{}} 2.使用过滤器:{{ xxx 过滤器名}} 或 v-bind:属性 = xxx 过滤器名备注: 1.过滤器也可以接收额外参数、多个过滤器也可以串联 2.并没有改变原本的数据, 是产生新的对应的数据
概述:VUE 实例创建完成并接管实例后删除这个属性,可以防止出现{{name}}情况
概述:所在节点在初次动态渲染后,就视为静态内容了。以后数据的改变不会引起 v-once 所在结构的更新,可以用于优化性能。
概述:通过指令包装dom元素,让使用者避免操作dom元素、一般有三个流程
二、配置对象中常用的3个回调: (1).bind:指令与元素成功绑定时调用。 (2).inserted:指令所在元素入页面时调用。 (3).update:指令所在模板结构被重新解析时调用。 三、调用时机 1.指令与元素成功绑定时(一上来)。 2.指令所在的模板被重新解析时。 四、备注: 1.指令定义时不加v-,但使用时要加v-; 2.指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名,命名注意
两个函数,合在一起使用需求1:定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍。
需求2:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点。元素需要插入到页面之后在进行焦点触发
常用的生命周期钩子: 1.mounted: 发送ajax请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】 2.beforeDestroy: 清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】
关于销毁Vue实例 1.销毁后借助Vue开发者工具看不到任何信息 2.销毁后自定义事件会失效,但原生DOM事件依然有效 3.一般不会在beforeDestroy操作数据,因为即便操作数据,也不会再触发更新流程了
beforeDestroy:可以访问数据,但不能修改,因为就算你修改了也不能回到beforeUpdate里面