面面经
1、谈谈对MVVM的理解?
MVVM是Model-View-ViewModel的缩写,是一种设计思想。
Model层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑。
View代表UI组件,负责将数据模型转换成UI展现出来。View是一个同步model和View的对象在MVVM架构下,View和Model直接并没有直接联系,通过View和Model进行交互,它们之间的交互是双向的,View数据的变化会同步到Model中,Model数据的变化立即会反应到View上。
ViewModel通过双向数据绑定把View层和Model层连接了起来,他们之间的同步工作完全是自动的,不需要手动操作Dom。
2、vue优点?
响应式编程:Vue会自动对页面中某些数据变化做出响应。通过MVVM思想实现数据的双向绑定,让开发者不用再操作Dom对象,有更多时间去思考业务逻辑。
虚拟Dom:在传统开发中,用JQuery或者js操作函数对DOM进行频繁操作的时候,浏览器要不停地渲染新的Dom树,导致在性能上的开销特别高。虚拟dom最后再计算完毕才真正将dom操作提交。
组件化开发:vue通过组件,把一个单页面应用中的各种模块拆分到一个一个单独的组件。组件化开发的优点:提高开发效率、方便重复使用、简化调试步骤、提升整个项目的可维护性、便于协同开发。
3、vue生命周期的理解?
什么是vue生命周期?生命周期就是一个vue实例从创建到销毁的过程。
总共分为8个阶段:
beforeCreate:在当前阶段data、methods、computed以及watch上的数据和方法都不能被访问。
created:在实例完成后发生,可以使用数据,更改数据,此处更改数据不会触发updataed函数。
beforeMounted:发生在挂载之前,虚拟dom已经创建完成,即将开始渲染。
mounted:在挂载完成后发生,我此阶段,真实的DOM挂载完毕,数据完成双向绑定,可以访问到Dom节点,使用$refs属性对DOM进行操作。
beforeUpdate:发生在更新之前,响应式数据发生更新,虚拟Dom重新渲染之前被触发,可以在当前阶段更改数据。
updated:发生在更新完成之后,当前阶段组件DOM已完成更新。避免在此期间更新数据,因为这可能导致无限循环的更新。
beforeDestroy:实例销毁之前,此阶段实例完全可以被使用,进行善后收尾工作,比如清除计时器。
destroyed:发生在实例销毁之后,这个时候只剩下Dom空壳,组件已经被拆解,监听被移除等。
第一次页面加载会触发哪几个钩子?
beforeCreate()、created()、beforeMount()、mounted()
DOM渲染在哪个周期就已经完成?
在mounted()阶段完成,此阶段真实的Dom挂载完毕,数据完成双向绑定,可以访问到DOM节点。
4、Vue实现双向数据绑定原理\响应式原理?
Vue2.x采用数据劫持结合发布订阅模式的方式,通过Object.defineProperty来劫持各个属性的setter、getter,在数据变动时发布消息给订阅者,触发相应的监听回调。
但在Vue3.x中采用Proxy,抛弃了Object.defineProperty方法。
5、vue组件的参数传递
父组件传给子组件:子组件通过props方法接受数据
子组件传给父组件:使用自定义事件,子组件通过$emit方法触发父组件的方法来传递参数
兄弟组件的数据传递:eventBus就是创建一个事件中心,相当于中转站,可以用它来传递事件和接收事件。
6、Vue路由的实现
hash模式和history模式的区别?
》URL的展示上,hash模式有“#”,history模式没有
》在兼容性上,hash可以支持低版本浏览器和IE
》刷新页面,hash模式可以正常加载到hash值对应的页面,而history没有处理的话,会返回404,一般需要后端将搜友的页面都配置重定向到首页路由
router和route的区别?
》$router对象是全局路由的实例,是router构造方法的实例
》$router对象常用的方法有:
push:向history栈添加一个新的记录
go:页面路由跳转前进或者后退
replace:替换当前的页面,不会向history栈添加一个新的记录
》$route对象表示当前的路由信息,包含了当前Url解析得到的信息。包含当前的路径,参数,query对象等。
》$route.params/$route.query:一个key/value对象,如果没有路由参数,就是一个空对象。
7、Vuex是什么?怎么使用?什么场景使用?
vuex是一个专为Vue应用程序开发的状态管理器,采用集中式存储管理应用的所有组件的状态。每一个vuex应用的核心就是store仓库。