参看:
1.v-for 和 v-if一起使用问题
v-for的优先级比v-if的优先级高,在遍历每一条item后,会执行v-if,会造成不必要的计算,影响性能。
解决方法:通过使用computed属性,来筛选出符合条件项,然后再使用v-for遍历
2.实例属性data为什么是一个function
vue的核心思想是数据驱动和组件系统,每一个组件都是可复用的,当引入一个组件的时候,组件里的data是一个普通的对象时,所有用到的这个组件都会引用时同一个data,会造成数据污染,将data封装为函数后,,实例化组件的时候,我们只是调用了data函数生成数据副本,避免了数据污染。
3.key在v-for的作用
vue在渲染列表时,默认使用的是“就地复用”的策略,让列表中某一条数据发生改变时,只会diff改变的这一条数据,而不会全部diff列表,这时就是依靠key实现的
所以,当用index作为key时,删除某一条数据,此时列表的index会更新,不能作为唯一标识符,此时会全部diff,无法做到性能最优
所以一句话,key的作用主要是为了高效的更新虚拟DOM。
4.在哪个生命周期发起ajax
不考虑服务器端渲染:在created和mounted都可以,created周期内,数据已经加载完毕,mounted周期内,vdom已经被挂载到实例上,此时ajax,如果只做{{}}渲染,俩个周期都可以,如果发生dom更新,在mounted比较合适。
服务器端渲染:在mounted内。
5.hash和history模式的区别
hash模式:在浏览器url中提现为#,#和#之后的内容用window.location.hash读取
特点:hash虽然在URL中,但不被包括在HTTP请求中;用来指导浏览器动作,对服务端安全无用,hash不会重加载页面。
hash 模式下,仅 hash 符号之前的内容会被包含在请求中,如 http://www.xxx.com,因此对于后端来说,即使没有做到对路由的全覆盖,也不会返回 404 错误。
history模式:history采用HTML5的新特性;且提供了两个新方法:pushState(),replaceState()可以对浏览器历史记录栈进行修改,以及popState事件的监听到状态变更。
history 模式下,前端的 URL 必须和实际向后端发起请求的 URL 一致,如 http://www.xxx.com/items/id。后端如果缺少对 /items/id 的路由处理,将返回 404 错误。
Vue-Router 官网里如此描述:“不过这种模式要玩好,还需要后台配置支持……所以呢,你要在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。”
6.计算属性怎么理解
在模板中放入太多的逻辑会让模板过重且难以维护,在需要对数据进行复杂处理,且可能多次使用的情况下,尽量采取计算属性的方式。
好处:
①使得数据处理结构清晰;
②依赖于数据,数据更新,处理结果自动更新;
③计算属性内部this指向vm实例;
④在template调用时,直接写计算属性名即可;
⑤常用的是getter方法,获取数据,也可以使用set方法改变数据;
⑥相较于methods,不管依赖的数据变不变,methods都会重新计算,但是依赖数据不变的时候computed从缓存中获取,不会重新计算。
7.v-on可以监听多个方法吗
<input type="text" v-on="{ input: onInput, focus: onFocus, blur: onBlur }">