Vue知识零散学习(面试篇)

此文章仅记录学习Vue中一些平常自己没有去学习到知识,很多东西都是基于自我的认知去写的。文中可能会有理解错误的地方。但大多数都是参考Vue官网学习记录,有的部分也只是仅作了解,后续有需要会更深入学习。
一般情况下会持续更新。

目录:

动态组件
异步组件
路由懒加载
nextTick
混入
组件缓存(keep-alive)
插槽(slot)
过滤器(filter)
自定义指令
插件
几个API
风格指南
Vue CLI
Vuex
Vue响应式原理
Vue中的虚拟DOM以及Diff算法理解
Vue-Router

动态组件

让多个组件使用同一个挂载点,并动态切换,这就是动态组件。
通过使用保留的元素,动态地绑定到它的is特性,可以实现动态组件。


异步组件

异步组件就是在定义的时候什么都不做,只在组件渲染的时候进行加载渲染并缓存,缓存是以备下次访问。

路由懒加载

vue-router配置路由,实现按需加载方式

  1. webpack的代码分割(异步组件技术)
    特点:一个组件生成一个js文件
{
  path:"/",
  name:"home",
  component:resolve => require(["@/components/home"],resolve)
}
  1. webpack2 + ES6(推荐使用)
    特点:
    没有指定webpackChunkName,每个组件打包成一个js文件。
    指定了相同的webpackChunkName(使用注释的方式),会合并打包成一个js文件。
const home = ()=>import("@/components/home");
const mine = ()=>import(/* webpackChunkName:"mine" */ "@/components/mine");
  1. webpack提供的require.ensure()
    特点:多个路由指定相同的chunkName,会合并打包成一个js文件
{
  path:"/",
  name:"home",
  component: r => require.ensure([],()=> r(require(''/components/home)),"home")
}

nextTick

Vue实现响应式并不是在数据改变后就立即更新DOM,而是在一次事件循环的所有数据变化后再异步执行DOM更新.
而Vue.nextTick()就是在DOM更新之后触发的方法。
nextTick的触发时机就是
一次事件循环中的代码执行完毕=>DOM更新=>触发nextTick的回调=>进入下一次循环。
例子:




默认显示

Before NextTick
在nextTick执行前获取内容:
在nextTick执行之后获取内容:
在nextTick执行前获取内容:

点击按钮修改content的值的时候显示

After NextTick
在nextTick执行前获取内容:Before NextTick
在nextTick执行之后获取内容:After NextTick
在nextTick执行前获取内容:Before NextTick

虽然content1content3获得内容的语句是写在content数据改变语句之后的,但他们属于同一个事件循环中,所以content1content3获取的还是“Before NextTick”,而content2获得内容的语句写在nextTick的回调中,在DOM更新之后再执行,所以获取的是更新后的“After NextTick”。

官网有这么一段话:
Vue 在更新 DOM 时是异步执行的。只要侦听到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更。如果同一个 watcher 被多次触发,只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作是非常重要的。然后,在下一个的事件循环“tick”中,Vue 刷新队列并执行实际 (已去重的) 工作。Vue 在内部对异步队列尝试使用原生的 Promise.then、MutationObserver 和 setImmediate,如果执行环境不支持,则会采用 setTimeout(fn, 0) 代替。

mixin 混入

混入是一种方式,来分发Vue组件中的可复用功能,一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混入”该组件本身的选项。
mixin.js

export default {
    data() {
        return {
            name:"田雷雷"
        }
    },
    methods: {
        changeName(){
            this.name = "啦啦啦德玛西亚"
        }   
    },
    mounted() {
        console.log("mixin mounted")
    }
}

组件user




页面显示“田雷雷”,此时“田雷雷”是mixin.js中的data数据,
Console面板此时依次输出“mixin mounted”,“组件mounted”,
点击按钮触发changeName事件修改name,页面显示“tianleilei”,
此时的调用的是组件内的methodschangeName方法。

当组件和混入对象含有同名选项时,这些选项将以恰当的方式进行“合并”。比如数据对象在内部会进行递归合并,发生冲突时以组件数据优先。

同名钩子函数将合并为一个数组,都将被调用,但是混入的钩子将在组件自身钩子 之前 调用。

值为对象的选项,例如methodscomponents、将被合并为同一个对象,两个对象键名冲突时,取组件对象的键值对。

全局混入:
混入也可以进行全局注册,一旦全局注册它将影响每一个之后创建的Vue实例。

Vue官网的例子

// 为自定义的选项 'myOption' 注入一个处理器。
Vue.mixin({
  created: function () {
    var myOption = this.$options.myOption
    if (myOption) {
      console.log(myOption)
    }
  }
})

new Vue({
  myOption: 'hello!'
})
// => "hello!"

keep-alive

keep-alive是一个抽象组件:它自身不会渲染一个DOM元素,也不会出现在父组件链中;使用keep-alive包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。

包裹动态组件时会缓存不活动的组件实例,而不是销毁它们。当组件在内被切换,它的 activateddeactivated 这两个生命周期钩子函数将会被对应执行。

属性:

include:只有名称匹配的组件会被缓存
exclude:任何名称匹配的组件都不会被缓存
max:数字,最多可以缓存多少组件实例。

includeexclude属性允许组件有条件地缓存,二者都可以用逗号分隔字符串、正则表达式或一个数组来表示。



  




  




  

匹配首先检测组件自身的name选项,如果name选项不可用,则匹配它的局部注册名称(父组件components选项的键值)。匿名组件不能被匹配。

max最多可以缓存多少组件实例,一旦这个数字达到了,在新实例被创建之前,已缓存组件中最久没有被访问到的实例会被销毁掉。

activated:进入组件被执行,deactivated:离开组件被执行。

slot(插槽)

Slot可以理解为“占坑”,在组件模板中占好了位置,当使用该组件标签的时候,组件标签里面的内容就会自动“填坑”。

  1. 内容插槽:
    定义两个组件:Parent.vueChild.vue
    Parent.vue组件中引用Child.vue.
//Parent.vue

  Hello World

//Child.vue

Child组件中的所占的位置会被Parent组件中的“Hello World”所替代。

  1. 后备内容插槽(默认内容)
//Parent

//Child
啦啦啦

Child组件中的所占的位置会被默认内容“啦啦啦”所替代。

  1. 具名插槽
    有时候一个组价需要多个插槽
    可以使用元素的特殊属性:name,这个属性可以用来定义额外的插槽。
//Parent

  
  
  
没有name默认为default
//Child

页面中显示为
header
没有name默认为default
footer

如果一个不带name属性的话,那么它的name默认为default
在向具名插槽提供内容的时候,我们可以在