一、对于MVVM的理解?
MVVM 是 Model-View-ViewModel 的缩写。
Model代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑。
View 代表视图,它负责将数据模型转化成视图展现出来。
ViewModel 虚拟模型,监听模型数据的改变和控制视图行为、处理用户交互,简单理解就是一个同步View 和 Model的对象,连接Model和View。
在MVVM架构下,View 和 Model都是通过ViewModel进行交互,iewModel 通过双向数据绑定把 View 层和 Model 层连接了起来。View 数据的变化会同步到Model中,而Model 数据的变化也会立即反应到View 上。View 和 Model之间的同步是程序自动处理的,因此开发者只需关注业务逻辑,不需要手动操作DOM,不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。
二、Vue实现数据双向绑定的原理?
Object.defineProperty()。Vue.js是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。
具体步骤:
第一步:需要observe的数据对象进行递归遍历,包括子属性对象的属性,都加上 setter和getter
这样的话,给这个对象的某个值赋值,就会触发setter,那么就能监听到了数据变化
第二步:compile解析模板指令,将模板中的变量替换成数据,然后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,添加监听数据的订阅者,一旦数据有变动,收到通知,更新视图
第三步:Watcher订阅者是Observer和Compile之间通信的桥梁,主要做的事情是:
1、在自身实例化时往属性订阅器(dep)里面添加自己
2、自身必须有一个update()方法
3、待属性变动dep.notice()通知时,能调用自身的update()方法,并触发Compile中绑定的回调,则功成身退。
第四步:MVVM作为数据绑定的入口,整合Observer、Compile和Watcher三者,通过Observer来监听自己的model数据变化,通过Compile来解析编译模板指令,最终利用Watcher搭起Observer和Compile之间的通信桥梁,达到数据变化 -> 视图更新;视图交互变化(input) -> 数据model变更的双向绑定效果
三、Vue的生命周期
beforeCreate(创建前) 在数据观测和初始化事件还未开始
created(创建后) 完成数据观测,属性和方法的运算,初始化事件,e****l属性还没有显示出来beforeMount(载入前)在挂载开始之前被调用,相关的render函数首次被调用。实例已完成以下的配置:编译模板,把data里面的数据和模板生成html。注意此时还没有挂载html到页面上。mounted(载入后)在el被新创建的vm.el 替换,并挂载到实例上去之后调用。实例已完成以下的配置:用上面编译好的html内容替换el属性指向的DOM对象。完成模板中的html渲染。一般在这里进行数据的处理,接口请求。
beforeUpdate(更新前) 在数据更新之前调用,可以在该钩子中进一步地更改状态,不会触发附加的重渲染过程。
updated(更新后) 在由于数据更改导致的虚拟DOM重新渲染之后调用。在大多数情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环。该钩子在服务器端渲染期间不被调用。
beforeDestroy(销毁前) 在实例销毁之前调用。实例仍然完全可用。
destroyed(销毁后) 在实例销毁之后调用。调用后,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务器端渲染期间不被调用。
四、Vue.js 的优点是什么?
Vue.js性能好,非常容易优化。
Vue.js体积小,包含了 Vuex + Vue Router 的 Vue 项目 (gzip 之后 30kB) 。
Vue.js更加灵活,Vue 官方提供了构建工具来协助你构建项目,但它并不限制你去如何组织你的应用代码。
Vue.js容易上手。要学习 Vue,你只需要有良好的 HTML 和 JavaScript 基础,API也比较少。
Vue.js生态系统丰富,很多开源组件和UI框架。
五、Vue.js的template模板编译的理解?
简而言之,就是先转化成AST树,再得到的render函数返回VNode(Vue的虚拟DOM节点)
首先,通过compile编译器把template编译成AST语法树(abstract syntax tree 即 源代码的抽象语法结构的树状表现形式),compile是createCompiler的返回值,createCompiler是用以创建编译器的。另外compile还负责合并option。
然后,AST会经过generate(将AST语法树转化成render funtion字符串的过程)得到render函数,render的返回值是VNode,VNode是Vue的虚拟DOM节点,里面有(标签名、子节点、文本等等
六、Vue.js常用指令?
v-model 双向数据绑定
v-bind 绑定属性
v-for 循环
v-if 判断
v-show 显示
v-on 绑定事件
v-text 渲染字符串
v-html 渲染html跟字符串
七、Vue.js常用修饰符有哪几类?
事件修饰符、按键修饰符、系统修饰符和鼠标按钮修饰符。
八、Vue.js常用事件修饰符有那些?
.stop: 阻止单击事件继续传播
.prevent:提交事件不再重载页面
.capture :即元素自身触发的事件先在此处处理,然后才交由内部元素进行处理
.self:只当在 event.target 是当前元素自身时触发处理函数
.once:点击事件将只会触发一次
九、Vue组件间的参数传递
1父传递子如何传递
在父组件中给子组件标签上绑定一个属性, 属性上挂载需要传递的值
在子组件通过props:[“自定义属性名”]来接收数据
2子传递父如何传递
(1) 在父组件中给子组件标签绑定一个自定义事件,给这个事件挂载需要调用的方法
(2) 在子组件的方法通过this.$emit(‘自定义事件名’)来调用这个方法
3兄弟组件如何通信
(3) 创建一个空的vue实例BUS
(4) 通过BUS.$emit(‘事件名’)传到空的vue实例中
(5) 通过BUS.$on(‘事件名’,(参数)=>{挂载从子1传来的数据})来接收
十、如何让Vue组件中css只在当前组件起作用?
在style标签中写入scoped即可
十一、v-if 和 v-show 区别?
v-if按照条件是否渲染,v-show是display的block或none;
v-if:判断是否有dom
v-show:判断隐藏/显示dom
十二、Vue.js中 key 值的作用?
当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用“就地复用”策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。key的作用主要是为了高效的更新虚拟DOM。
十三、keep-alive的作用是什么?
keep-alive是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。include和exclude都支持”,”分割字符串、数组或正则表达式,include表示只有名称匹配的组件会被缓存。
十四、router-view组件的作用?
router-view可以实现嵌套路由。如果不想跳转到新页面,只在当前页面切换着显示,router-view组件就非常适合。可以配合 和 使用。如果两个结合一起用,要确保在内层使用 :
十五、 r o u t e 和 route和 route和router的区别是什么?
emit方法传递参数2.非父子组件间的数据传递,兄弟组件传值eventBus或者使用store来做状态管理,eventBus项目比较小比较合适。¨K12K在style标签中写入scoped即可¨G0G¨K13Kv−if按照条件是否渲染,v−show是display的block或none;¨K14K当Vue.js用v−for正在更新已渲染过的元素列表时,它默认用“就地复用”策略。如果数据项的顺序被改变,Vue将不会移动DOM元素来匹配数据项的顺序,而是简单复用此处每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。key的作用主要是为了高效的更新虚拟DOM。¨K15Kkeep−alive是Vue内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。include和exclude都支持”,”分割字符串、数组或正则表达式,include表示只有名称匹配的组件会被缓存。¨K16Krouter−view可以实现嵌套路由。如果不想跳转到新页面,只在当前页面切换着显示,router−view组件就非常适合。可以配合和使用。如果两个结合一起用,要确保在内层使用:¨K17Kroute是“路由信息对象”,包括path,params,hash,query,fullPath,matched,name等路由信息参数。而$router是“路由实例”对象包括了路由的跳转方法,钩子函数等。
十六、vue-router路由之间跳转?
1、使用 创建 a 标签来定义导航链接
2、编程式导航 router.push(‘index’)等等
十七、vue路由的钩子函数有哪些?
beforeEach,afterEach等,一般用于页面title标题的修改或者登陆的全局验证。
beforeEach主要有3个参数to,from,next:
to:route即将进入的目标路由对象,
from:route当前导航正要离开的路由
next:function一定要调用该方法resolve这个钩子。执行效果依赖next方法的调用参数。可以控制网页的跳转。
十八、vuex是什么?
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。状态改变使用同步的mutations提交,异步操作请使用actionti,Action 提交的是mutation,而不是直接变更状态。
state
Vuex 使用单一状态树,即每个应用将仅仅包含一个store 实例,但单一状态树和模块化并不冲突。存放的数据状态,不可以直接修改里面的数据。
mutations
mutations定义的方法动态修改Vuex 的 store 中的状态或数据。
getters
类似vue的计算属性,主要用来过滤一些数据。
action
actions可以理解为通过将mutations里面处里数据的方法变成可异步的处理数据的方法,简单的说就是异步操作数据。view 层通过 store.dispath 来分发 action
十九、Vue.js UI组件库用过哪些?
这个结合自己的个人情况。比如ElementUI、IView、Vant等UI组件库。