Vue总结

113 阅读3分钟

v-if和v-show的区别,以及使用场景

  • v-if,通过销毁并重建组件,来控制组件显示隐藏,初始化不会渲染,不适用频繁显示隐藏的组件,可以用在<template>上。
  • v-show,通关元素的display属性,来控制元素显示隐藏,初始化会渲染,适用频繁显示隐藏的元素,不能用在<template>上。

v-for和v-if不能一起适用

v-for的优先级比v-if更高,这意味着v-if将分别重复运行于每个v-for循环中。

为何在v-for中用key

  • 必须用key,且不能是index和random
  • diff算法中通过tag和key来判断,是否是sameNode
  • 减少渲染次数,提升渲染性能

组件之间通讯

  • 父子组件之间通讯:props, this.$emit()调用父组件事件
  • 兄弟组件之间通讯:new Vue().emit()调用自定义事件,newVue().emit()调用自定义事件, new Vue().on()绑定自定义事件, new Vue().$off在beforeDestroy里及时销毁

组件生命周期调用顺序

组件的调用顺序都是先父后子,渲染完成的顺序是先子后父。 组件的销毁操作是先父后子,销毁完成的顺序是先子后父。

  • 加载渲染过程 父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted
  • 更新过程 父berforeUpdate->子beforeUpdate->子updated->父updated
  • 销毁过程 父beforeDestroy->子beforeDestroy->子destroyed->父destroyed

自定义v-model

  • 首先在props里定义类型为String的text属性。
  • 在model对象里定义props和event属性。
  • 在标签上添加:value="text"和@input="emit(change,emit('change', event.target.vaule)"
<template>
    <!-- 例如:vue 颜色选择 -->
    <input type="text"
        :value="text"
        @input="$emit('change', $event.target.value)"
    >
    <!--
        1. 上面的 input 使用了 :value 而不是 v-model
        2. 上面的 change 和 model.event 要对应起来
        3. text 属性对应起来
    -->
</template>

<script>
  export default {
      model: {
          prop: 'text', // 对应 props text
          event: 'change'
      },
      props: {
          text: {
            type: String,
            default: ''
          }
      }
  }
</script>

ajax请求应该放在哪个生命周期

  • mounted
  • JS是单线程的,ajax异步获取数据
  • 放在mounted之前没有用,只会让逻辑更加混乱

何时需要使用beforeDestory

  • 解绑自定义事件event.$off
  • 清除定时器
  • 解绑自定义的DOM事件,如window scroll等

异步组件

在大型应用中,我们可能需要将应用分割成小一些的代码块,并且只在需要的时候才从服务器加载一个模块。

components: {
    'my-component': () => import('./my-async-component')
}

mixin

多个组件有相同的逻辑,抽离出来

缺点

  • 变量来源不明确,不利于阅读
  • 多mixin可能会造成命名冲突
  • mixin和组件可能出现多对多的关系,复杂度较高

何时需要使用keep-alive

  • 缓存组件,不需要重复渲染
  • 如多个静态tab页的切换
  • 优化性能

vuex

  • state
  • getters
  • action
  • mutation
  • dispatch
  • commit
  • mapState
  • mapGetters
  • mapActions
  • mapMutations

Vuex中action和mutation的区别

  • action中处理异步,mutation不可以
  • mutation做原子操作
  • action可以整合多个mutation

vue-router

  • 路由模式
  • 路由配置
    • 动态路由
    • 懒加载

Vue 常见性能优化方式

  • 合理使用v-show和v-if
  • 合理使用computed
  • v-for时加key,以及避免和v-if同时使用
  • 自定义事件、DOM事件及时销毁
  • 合理使用异步组件
  • 合理使用keep-alive
  • data层级不要太深
  • 使用vue-loader在开发环境做模板编译(预编译)