参考文章:前端面试题--Vue--作者:流浪的de蝌蚪1.说说Vue的双向绑定数据Vue的原理实现双向数据绑定:通过Datahijacking结合publisher-subscriber模式,然后通过Object.defineProperty()劫持各个属性的setter和getter,当数据到时通过向订阅者发布消息触发相应的监听回调变化。了解更多请点击:发布者-订阅者模式简单实现二、讲解单向数据流和双向数据绑定单数据流:数据流向是单向的,流向单一可追溯,快速便捷故障排除。缺点是当你想更新UI时,需要创建各种动作来改变相应的state3。Vue如何去除url中#vue-router的两种模式:hash和history。hash模式是vue-router默认的。路由加载时,项目中的url会自动带上#;如果你想删除#,你可以使用历史模式。newRouter({mode:'history',routes:[]})需要注意的是,当我们启用history模式时,由于我们的项目是单页应用,在路由跳转的时候,会出现404,因为静态资源访问不上,服务端需要增加一个覆盖所有情况的候选资源:如果url没有匹配到任何静态资源,应该返回相同的index.html页面4.对于MVC和MVVMMVCModel的理解:实例模型(数据存储)Controller:控制器(业务逻辑)View:视图(用户界面)处理逻辑用户向控制器发送指令控制器通过视图接收指令,实现业务逻辑,通知模型改变状态。模型向视图发送新数据Render,用户得到反馈特点:所有通信都是单向的MVVMModel:模型(数据)视图:视图(界面)ViewModel:视图模型是MVVM模式的核心,它是连接视图和模型的桥梁特点:各部分之间的通信是双向的,采用双向绑定:View中的变化自动反映到ViewModel中,反之亦然。详情请点击:由浅入深详解MVVM两种模式的具体区别:及MVVM图解5.虚拟DOM介绍虚拟DOM介绍DOM基本操作相关知识点梳理JavaScript面试考点常见DOM操作6.理解vue生命周期Vue实例有一个完整的生命周期,生命周期是指一个实例从创建到销毁的过程beforeCreate()在实例创建之间执行,不加载数据。created()可以在实例创建和数据加载后初始化数据,beforeMount()在dom渲染之前执行。在数据渲染之前,在mounted()页面最后一次更改数据,完成数据渲染,挂载真正的dom。beforeUpadate()在重新渲染之前触发updated()。数据改了,dom也重新渲染了。更改数据会陷入死循环beforeDestory()和destroyed()前者在销毁前执行(实例仍然完全可用),后者在销毁后执行7.组件通信父组件与子组件通信子组件组件通过props属性绑定父组件数据实现双方Communicator该组件与父组件通信。父组件的事件通过$emit在子组件中触发,在非父子组件和兄弟组件之间传递数据/*创建一个新的Vue实例作为中心事件master*/letevent=newVue();/*监听事件*/event.$on('eventName',(val)=>{//......做某事});/*触发事件*/event.$emit('eventName','thisisamessage.')Vuex数据管理8.vue-router路由是一种与后端服务器交互的方式,通过不同的路径,去请求不同的资源,请求不同的页面是路由的一个功能,可以参考:路由实现原理9.v-if和v-show的区别无论值为true还是false,html元素都会存在,但是CSS中的display可以显示或者隐藏对于当前的router跳转对象,可以得到名称、路径、查询、参数等。11.NextTick是做什么的?$nextTick`是在下一个`DOM`更新周期结束后执行一个延迟回调,修改数据后使用`$nextTick`,可以在回调中获取更新后的`DOM。具体可以参考官方文档:深入响应式原理12.js本身的特点,为什么vue组件数据一定要是函数?属于引用类型,当我们修改其中一个属性时,会影响到所有Vue实例的数据。如果将data作为函数返回一个对象,那么各个实例的data属性是独立的,不会互相影响。13.计算属性和事件方法有什么区别?我们可以将相同的功能定义为方法或计算属性。对于最终的结果,这两个方法是相同的区别:computed:计算属性会根据它们的依赖关系进行缓存,只有当它们相关的依赖关系发生变化时才会重新计算对于method,只要发生重新渲染,method的调用会一直执行这个函数14.Vue和jQuery相比有什么不同?jQuery专注于视图层,通过操作DOM实现页面的一些逻辑渲染;减少DOM操作Vue采用组件化思维,使得项目子集职责明确,提高开发效率,便于复用,便于协同开发15.如何在Vue中全局注册自定义命令//注册一个全局自定义命令`v-focus`Vue.directive('focus',{//当绑定元素插入DOM时...inserted:function(el){//聚焦元素el.focus()}})Localregistrationdirectives:{focus:{//插入指令的定义:function(el){el.focus()}}}参考官方文档-自定义指令16.Vue中如何自定义过滤器可以用全局方法注册Vue.filter()带有两个参数的自定义过滤器:过滤器ID和过滤器功能。filter函数接受一个值作为参数,返回转换后的值Vue.filter('reverse',function(value){returnvalue.split('').reverse().join('')})
