Vuex的属性有state、mutation、actions、getters、module
router是VueRouter的一个实例,所以它是一个全局对象,包含了所有的子对象和属性,而route是正在跳转的这个路由的局部对象,可以获取这个正在跳转的路由的name、path、params、query、hash、matched等。
异步操作放在actions中,actions通过commit调用mutation中方法操作state。
当某个组件修改某个值时,该组件不会立即重新渲染。
当环境不支持Promise.then\MutationObserver和setlmmediate时,Vue使用setTimeout(fn,0)代替;
可以使用this.$store.state获取Vuex中存储的状态;
getter的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算;
Actions提交的是mutation中的方法,而不是直接更改状态;
更改Vuex的store中的状态的唯一方法是提交mutation中的方法;
kepp-alive:
通过include属性,匹配要进行缓存的组件。
当组件在keep-alive内被切换,它的activated和deactivated这两个生命周期钩子函数会被对应执行。
keep-alive自身不会渲染为一个DOM元素,也不会出现在组件的父组件链中
max属性控制最多可以缓存多少组件实例。一旦这个数字达到了,在新实例被创建之前,已缓存组件中最久没有被访问的实例会被销毁掉;
当组件在keep-alive内被切换时,它的mounted和unmounted生命周期钩子会被activated和deactivafed代替;
关于Vue和React的描述:
Vue进行数据拦截、代理,对数据更敏感,数据驱动视图自更新,而React需要手动驱动数据更新视图;
React中组件的this并不是当前实例,需要通过bind或箭头函数来修改指向;
Vue和React都能使用jsx进行编程;
Vue和React都是数据驱动视图的更新;
在Vue中,concat()返回一个新的数组,还需要用新数组替换原数组才能实现视图的更新;
其中push()在该数组最尾添加新的元素,然后返回更新后的数组长度,方法将改变原始数组的长度;
shift()删除该数组第一个元素,并且把该数组剩下的元素索引往前挪一位,然后返回删除的元素,方法将改变原始数组的长度;
reserve()反转该数组中元素的顺序,方法将改变原始数组。
concat()把两个以上的数字连接起来,方法不会改变现有的数组,仅仅会返回被连接数组的一个副本。
push()、shift()reverse()改变原数组,会触发视图更新;
concat()不更改数组,会返回新数组,因此没有替换原数组,不触发视图更新,要用新数组替换原数组才能实现视图更新。
七个改变原数组且会让vue监听到的方法:
push()在末尾添加一个
pop()在末尾删除一个
shift()头部删除
unshift()头部添加
splice()删除,插入,替换
sort()排序
reverse()颠倒原来顺序
vue的特点:
1.轻量级 Angular的学习成本高,使用起来比较复杂,而Vue相对简单、直接,所以Vue使用起来更加友好。
2.数据绑定 Vue是一个MVVM框架,数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化,这也算是Vue的精髓之处。尤其是在进行表单处理时,Vue的双向数据绑定非常方便。
3.指令 指令主要包括内置指令和自定义指令,以“v-”开头,作用于HTML元素。指令提供了一些特殊的特性, 将指令绑定在元素上时,指令会给绑定的元素添加一些特殊的行为。 例如,v-bind动态绑定指令、v-if 条件渲染指令、v- for列表渲染指令等。
4.插件:插件用于对Vue框架功能进行扩展,通过MyPlugin.install完成插件的编写,简单配置后就可全局使用。常用的扩展插件有vue-router、Vuex 等。
Vue很多特性与Angular和React有着相同的地方,但是也有着性能方面的差别。 Vue使用基于依赖追踪的观察系统并且使用异步队列更新,所有的数据都是独立触发的,提高了数据处理能力。 React和Vue的中心思想是一切都是组件,组件之间可以实现嵌套。React 采用了特殊的JSX语法,Vue中也推崇编写以*.vue后缀命名的文件格式,对文件内容都有一些规定, 两者需要编译后使用。 值得一提的是,React依赖虚拟DOM,而Vue使用的是DOM模板。Vue 在模板中提供了指令、过滤器等,可以非常方便和快捷地操作DOM。推荐将Vue 使用到具有复杂交互逻辑的前端应用中,以确保用户的体验效果。
vue-router可以实现重定向,通过routes的redirect属性配置来完成。
vue-cli可以通过vue ui一套图形化界面管理所有项目。
Object.defineProperty(obj,key,val)不可以监听数组变化,需要做特殊处理,所以Vue3.0使用Proxy实现数据监听。
全局路由守卫的钩子函数有:beforeEach(全局前置守卫)、beforeResolve(全局解析守卫)、afterEach(全局后置守卫)
关于Vue2、Vue3的描述:
Vue3中Template支持多个根标签,Vue2不支持;
Vue3中的生命周期的挂载钩子是onMounted,需要引入才能使用;
Vue3的组合API中的setup()方法包含了所有的基本内容,包括生命周期,可以在setup()中使用生命周期钩子函数;
Vue3引入了tree-shaking,以模块的方式引入api,减小打包体积
关于Vue中diff算法说法:
1.比较只会在同层级节点进行比较,不会跨层级比较
2.在diff比较的过程中,循环从两边向中间收拢
3.老VNode节点的star和新VNode节点的end满足sameVnode时,这说明这次数据更新后oldStartvnode已经跑到了oldEndVNode后面了,这时候在patchVNode后,还需将当前真实dom节点移动到oldEndVnode的后面,同时老VNode节点开始索引加1,新VNode节点的结束索引减1.
4.vue的虚拟dom渲染真实dom的过程中首先会对新老VNode的开始和结束位置进行标记:oldStartldx、oldEndldx\newStartldx\newEndldx.
关于Vue响应式:
当利用索引值设置一个数组项时,Vue不能检测到数组的变动;
当修改数组长度时,Vue不能检测到数组的变动;
Vue无法检测property的添加或移除。由于Vue会在初始化实例时对property执行getter、setter转化,所以property必须在data对象上存在才能让Vue将其转换为响应式的。
关于vue组件化:
所谓组件化,就是将页面拆分成多个组件,每个组件依赖的css、JavaScript、模板、图片等资源放在一起开发和维护;
组件是资源独立的,组件在系统内部可复用,而且组件和组件之间可以嵌套,且组件之间可以通信;
组件化能提高开发效率,方便重复使用,简化调试步骤,提升项目可维护性,便于多人协调开发。
关于Vue组件的生命周期:
mounted钩子函数中,可以直接获取DOM元素;
beforeMount钩子函数中,不可以直接获取DOM元素;
Vue生命周期的钩子函数中mounted和beforeDestory中都可以获取到DOM元素;
关于Vue自定义指令钩子函数的描述:
被绑定元素插入父节点时调用inserted函数;
bind函数值调用一次,指令第一次绑定到元素时调用;
组件的VNode更新时调用update函数;
自定义指令钩子函数参数“el”指所绑定的元素,可以直接操作DOM元素。如修改绑定元素的字体颜色:el.style.color='red'。
在data中的对象的某个属性和input双向绑定,修改input的值,在beforeDestory中获取的值是修改过后的值;
在created钩子函数中操作DOM,可以将语句放在$nextTick中;
Ajax请求可以放在created钩子函数中;
父组件生命周期的执行顺序是父亲beforecreate-->父created-->父beforeMount-->子beforecreate-->子created-->子beforeMount-->子mounted-->父mounted-->父beforeDestory-->子beforeDestory-->子destroyed-->父destroyed,孩子的mounted早于父亲的mounted。
子组件更新过程:
父beforeUpdate-->子beforeUpdate-->子updated-->父updated
父组件更新过程:
父beforeUpdate-->父updated
销毁过程:
父beforeDestory-->子beforeDestory-->子destroyed-->父destroyed
关于Vue路由:
Vue路由的跳转方式有route-link、this.router.replace()、this.$router.go()等;
关于路由模式:
分为history和hash模式;
hash模式是通过onhashchange事件,监听url的修改;
history通过H5提供的AP history.pushState 和 history.pushState实现页面跳转且不刷新页面,需要后端进行配合;
关于$nextTick:
在组件内使用vm.$nextTick()实例方法特别方便,因为它不需要全局Vue,并且回调函数中的this将自动绑定到当前的Vue实例上;
在created等虚拟DOM没有完全挂载的钩子函数中,避免操作DOM报错可以把操作语句放在$nextTick的回调函数中;
$nextTick()返回一个Promise对象;
用于Vue的异步渲染;
关于v-for
v-for指令基于一个数组来渲染一个列表;
v-for指令需要使用item in items形式的特殊语法,其中items是源数据数组,而item则是被迭代的数组元素的别名;
v-for可以用来遍历一个对象的property
v-for在使用时最好添加key,且key最好不是索引;
watch在不添加immediate:true属性时,默认是不监听第一次赋值,watch未触发,
watch中能够执行异步操作;
Vue实例将会在实例化时调用¥watch,遍历watch对象的每一个property
关于vue-lazyload:
组件中使用vue-lazyload时,v-lazy代替v-bind:src,vue-lazyload指令可以实现图片懒加载,拓展功能api中的attempt代表尝试加载图片数量。
组件使用vue-lazyload时,不一定非要加 :key ,如果不加:key属性,刷新页面时,可能由于key相同,图片不刷新;
关于scoped
scoped原理是在标签上添加data-v属性,然后使用属性选择器实现样式局部化;
使用scoped后,父组件的样式将不会渗透到子组件中,不过一个子组件的根节点会同时受其父组件的scoped css 和子组件的scoped css的影响,这样设计是为了让父组件可以从布局的角度出发,调整其子组件根元素的样式;
使用scoped不会造成全局污染;
“>>>” 或::v-deep 或/deep/可以实现样式穿透
关于webpack配置的描述:
module.rule可以指定多个loader,而loader的作用是对模块的源码进行转换;
plugin是一个具有apply方法的JavaScript对象,由于plugin可以携带参数,所以必须在配置中间plugins属性传入一个实例;
模块热替换会在程序运行中,替换、添加、删除模块,无需重新加载整个页面,无需更替所有模块;
webpack开始处理程序时,从入口开始递归构建一个依赖关系图,包含了程序所需的模块,然后打包少量的bundle,通常只有一个bundle
单页面应用程序spa的优点:
- 无刷新切换内容,提高用户体验,
- 符合前后端分离的开发思想,通过Ajax异步请求数据接口获取数据,后台只需要负责数据,不用考虑渲染,前端使用vue等MVVM框架渲染数据;
- 减轻服务器压力,展示逻辑和数据渲染在前端完成,服务器任务更明确,压力减轻;
- 后端数据接口可复用,设计JSON格式数据可以在PC、移动端通用
单页面应用程序spa的缺点:
-
不利于SEO(搜索引擎优化),应用数据是通过请求接口动态渲染,不利于SEO;
-
首页加载慢,SPA下大部分的资源需要在首页加载,造成首页白屏等问题。
关于客户端渲染和服务器端渲染的描述:
服务器端渲染有利于SEO,且首页加载快;
客户端渲染节省后端资源,但是可能会加载慢出现白屏;
服务器端渲染耗费流量,局部页面的变化也需要重新请求完整的页面;
客户端首屏渲染时首先拿到的html模板,之后继续发起数据请求。而服务器端渲染只需要请求一次,服务器会将请求的数据放在html模板中一起返回。