-
v-show和v-if的区别 共同点都是控制显示和隐藏 v-show只是隐藏,不从dom树上移除,不太耗费性能 v-if是直接从dom树上移除,比较耗费性能
-
v-for中key的作用 更新渲染列表时,key是唯一的id标识,设为数字id或者字符串,可以更高效地找到对应的节点,提高了效率
-
vue中data为什么是function 假如当两个实例同时引用一个对象时,如果其中一个实例修改了属性后,另一个实例的属性也会发生变化,这样数据就乱了,所以当data是一个function时,每个组件实例就都有了自己的作用域,都可以相互独立,数据变化时,每个实例不会相互影响了
-
vue中双向绑定的原理 vue双向绑定,就是view视图层的改变能同步到数据层,数据层的变化能同步到view上。v-model主要用在表单的input上,完成视图层和数据层的双向绑定。将data中的数据进行递归遍历,对每个属性执行Object.defineProperty,定义get和set函数。并为每个属性添加一个dep数组。当get执行时,会为调用的dom节点创建一个watcher存放在该数组中。当set执行时,重新赋值,并调用dep数组的notify方法,通知所有使用了该属性watcher,并更新对应dom的内容
-
keep-alive的作⽤和被keep-alive声明的组件的⽣命周期 keep-alive是vue内置的一个组件,如果把切换出去的组件保留在内存中,可以保留它的状态或避免重新渲染。 在被 keep-alive 包含的组件或者路由中,会多出两个生命周期的钩子:activated和 deactivated。 activated钩子:在在组件第一次渲染时会被调用,之后在每次缓存组件被激活时调用。 deactivated钩子:组件被停用时调用。使用keep-alive就不会调用beforeDestroy和destroyed,因为组件没被销毁,被缓存起来了,这个钩子可以看作beforeDestroy的替代
-
说一下vue的生命周期,以及生命周期都做了什么事情? (1)beforeCreate创建前,在实例初始化之后,数据观测和事件配置之前被调用,这个时候组件的选项对象还未创建,el 和 data 并未初始化,因此无法访问methods, data, computed等上的方法和数据。 (2)created创建后,实例创建完成后被调用,在这一步,实例已经完成这些配置:数据观测、属性和方法的运算,watch/event事件回调,完成了data数据的初始化。 但是挂载阶段还没有开始, $el属性目前不可见,这是一个常用的生命周期,可以调用methods中的方法,改变data中的数据,并且修改可以通过vue的响应式绑定体现在页面上,获取computed中的计算属性等。 (3)beforeMount挂载前,相关的render函数首次被调用,实例已经完成这些配置: 编译模板,把data里面的数据和模板生成html,完成了el和data初始化,但是这个时候还没有挂在html到页面上。 (4)mounted挂载后,也就是模板中的HTML渲染到HTML页面中,一般可以做一些ajax操作,mounted只会执行一次。 (5)beforeUpdate数据更新前,发生在虚拟DOM重新渲染和打补丁之前,可以在该钩子中进一步地更改状态,不会触发附加地重渲染过程 (6)updated数据更新后调用,调用时,组件DOM已经更新,所以可以执行依赖于DOM的操作,然后在大多是情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环,该钩子在服务器端渲染期间不被调用 (7)beforeDestroy销毁前,在实例销毁之前调用,实例仍然完全可用,这一步还可以用this来获取实例,一般在这一步做一些重置的操作,比如清除掉组件中的定时器和监听的dom事件 (8)destroyed销毁后,在实例销毁之后调用,调用后,所以的事件监听器会被移出,所有的子实例也会被销毁,这个钩子在服务器端渲染期间不被调用
-
vue什么时候操作DOM比较合适?操作时发现有的组件获取不到,怎么办? 在mounted中可以访问操作DOM。因为在钩子函数mounted被调用前,Vue已经将编译好的模板挂载到了页面上。 如果获取不到,可以在mounted生命周期里面执行方法获取refs的dom,给实例添加ref属性,通过$refs获取dom实例 8。 发送网络请求在哪个函数中? beforeCreated、created、mounted都可以
-
vue组件间传值有哪些⽅式 (1)父子组件之间的传值 父传子: 在父组件里嵌套的子组件上,使用v-bind进行对象的绑定,子组件定义prop来接收传过来的对象 使用ref获取指定的子组件 子传父: 在子组件使用$emit传递事件给父组件,父组件监听这个事件 (2)非父子组件间传值 建立一个公共的js⽂文件,用来传递消息
-
vue中改变数组内索引的值,数据不更新,如何处理 数据不更新,我们可以使用官方给出的方案来通知视图更新,或者使用vue可以监听到的数组方法splice来解决
-
讲一下vuex vuex是用来管理组件之间通信的一个插件,目的是为了管理共享状态,它制定了一系列的规则,比如修改数据源state、触发actions等等,都需要遵循它的规则,以达到让项目结构更加清晰并且易于维护的目的。 每个vuex应用的核心是store,store就是一个容器,它包含了应用中大部分的状态。 state用来存放组件之间共享的数据,但是修改数据不能在state中进行,而是在mutations下的函数中。 mutatiaon里的函数是唯一可以修改state中数据的方法,通过commit(提交)来修改,而且mutations方法必须是同步方法,异步方法就要通过actions。 acitons提交的是mutations,不是直接去变更state里的数据,也就是说,actions会通过mutations,让mutations帮他提交数据的变更。 vuex还允许我们将store分割成模块,每个模块拥有自己的state、mutation、action、getter等
-
computed和watched的区别 computed是计算属性,依赖其他属性计算值,并且computed的值有缓存,只有当计算值变化才会返回内容。 watch监听到值的变化就会执行回调,在回调中可以进行一些逻辑操作。 所以一般来说需要依赖别的属性来动态获得值的时候可以使用computed,对于监听到值的变化需要做一些复杂业务逻辑的情况可以使用watch。
-
什么是递归组件 递归引用可以理解为组件调用自身,在开发多级菜单组件时就会用到,调用前要先设置组件的name选项,注意一定要配合v-if使用,避免形成死循环
-
为什么需要nextTick,nextTick是做什么的 vue是异步修改dom的,并且不鼓励开发者直接接触dom,但有时候业务需要必须对数据更改,刷新后的dom 做相应的处理,这时候就可以使用Vue.nextTick(callback)这个api了。 nextTick,则可以在回调中获取更新后的dom