vue核心知识点

318 阅读2分钟

生命周期

image.png

父子组件之间的生命周期更新, 其实大家想一下就明白了, 只是平时不会去考虑

image.png

Vue常用的高级特性

  1. 自定义v-model

常见方法一

<AComponent :value="a" @input="val=>a=val" />

自定义 v-model 里的 prop和event


// AComponent 子组件
<input :value="text" @change="$emit('change', $event.target.value)"/>
export default {
    model: {
        prop: 'text',
        event: 'change'
    },
    props: {
        text: String
    }
}

// 父组件
<AComponent v-model="a"/>

第二个方法就很少用了, 因为你完全可以不修改model, 在chang的时候直接$emit('input')是一样的。如果组件比较复杂用model用有一种声明的感觉在里面, 让人点进来就知道你这个组件的v-model是用change触发的

个人还是推荐用 value和input保持和官网一样的

  1. $nextTick
    • 异步执行, 在dom更新后执行
    • 为什么需要这个?
    • data更新不是马上更新dom的, 如果需要操作dom之类的你可能就需要用到了
    • 为什么data不马上更新dom?
    • 马上更新影响效率, 每次更新前vue、react都需要经过diff算法, 创建虚拟dom一系列运算, 为了缩小和原生开发的渲染性能的差距, 就有必要减少多余的运算
  2. slot

匿名slot


// 子组件 A
<div>
    你好<slot></slot>
<div>

// 父组件
<A>世界</A>

// 展示

你好世界

匿名slot 设置默认值


// 子组件 A
<div>
    你好<slot>world</slot>
<div>

// 父组件
<A>世界</A>
<A></A>

// 展示

你好世界
你好world

具名slot


// 子组件 A
<div>
    <slot name="c"></slot>你好<slot></slot>
<div>

// 父组件
<A>
    <templete v-slot:prefix>啊~</templete>世界
</A>

// 展示

啊~你好世界

作用域slot(子组件给父组件传递数据)


// 子组件 A
<div>
    你好<slot row="{id:1}"></slot>
<div>

// 父组件
<A>
    <templete v-slot={row}><div @click="handle(row.id)">aaaa</div></templete>
    // 具体使用场景参考el-table
</A>

  1. 动态、异步组件

动态组件

components: {
    c,d
},
data(){
    return {
        a: ''
    }
}
created(){
    this.a = 'c'
    setTimeout(()=>{
        this.a = 'd'
    }, 2000)
}
<component :is="a"/> 
// 等于下面这种写法
<c v-if="a ==="c"/>
<d v-if="a === d"/>

异步组件

components: {
    a: ()=>import('a')
},
  1. keep-alive keep-alive 就是保持之前的状态 和v-show差不多, 所有的状态都保留
<tab-group v-model="tabVal">
    <tab name='c'></tab>
    <tab name='d'></tab>
</tab-group>

<keep-alive>
    <c v-if="tabVal ==="c"/>
    <d v-if="tabVal === d"/>
</keep-alive>

  • 那么为什么不直接使用v-show呢
  • v-show会初始化进来渲染所有内容, 已经发送所有组件请求, 特别如果是复杂的组件还有tab数比较多, 一进页面发送请求数量太多
  1. mixin

mixin 主要是抽离代码逻辑的, 个人不喜欢用, 如果真想抽离公共代码逻辑个人喜欢抽离成js, 一个个方法。

为什么不用mixin: 因为mixin是一个黑盒子,

  • 在引入页面中根本不知道引入了哪些方法和属性, 而且这些方法和属性和本页面的重名也会存在冲突的
  • 在查阅代码时经常就是这个方法在本页面找不到, 如果一个页面有多个mixin你就得一个个找, 多个mixinn也提升了重名的隐患, 重名最可怕的就是你还不知道, 他还不会报错