Vue

2022/9/1

# 1. vue 组件间传值 (opens new window)

  1. 父向子传值:props自定义属性
  • Child.vue
<template>
  <div class="hello">
    {{msg}} ———— {{date}}
     <button @click="show">获取子组件的值</button>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  props: {
    msg: String,
    date: {
      type: String,
      required: true 
    }
  },
  methods: {
    show(){
      this.$emit('getSonValue', '子向父传的值')
    }
  }
}
</script>
  • Parent.vue
<template>
  <div>
    <Child msg="Welcome to Your Vue.js App" date="2022"/>
  </div>
</template>

<script>
import Child from './components/Child.vue'

export default {
  name: 'Parent',
  components: {
    Child
  }
}
</script>
  1. 子向父传值:自定义事件($emit)
  2. EventBus
    通过一个空的Vue实例作为中央事件总线(事件中心),用它来触发事件和监听事件
  3. 使用 ref
  4. $parent 和 $root
  5. $attrs 和 $listeners
  6. provide 和 inject
  7. vuex

# 2. 虚拟dom

概念
虚拟dom是对真实dom的抽象,用javaScript对象作为基础的树,用对象的属性来描述节点

作用

  1. 直接操作真实dom的代价很大,尤其是频繁操作时,而使用虚拟dom可以避免一些多余的渲染,从而提高页面的渲染效率
  2. 虚拟dom使跨平台更容易实现。同一套虚拟dom可以对接不同平台的渲染逻辑,实现一套代码,多平台使用

# 3. diff 算法

概念
diff算法是一种通过同层树节点进行比较的高效算法

特点

  1. 比较只会在同层级进行,不会跨层级比较
  2. 进行比较时从两端向中间进行

应用场景
常用于虚拟dom渲染成真实dom时,新旧虚拟dom树的比较

原理

  1. 引入4个指针,分别指向旧虚拟dom节点列表开头、结尾和新虚拟dom的开头、结尾。
  2. 按下列顺序进行比较:
    (1)旧前与新前节点对比
    (2)旧后与新后节点对比
    (3)旧前与新后节点对比
    (4)旧后与新前节点对比
    如果有相同的,则将真实节点移到对应位置;如果没有相同的,遍历旧节点列表新前指针所指节点,找到则对应移动真实dom,否则真实dom插入新节点
  3. 重复上述步骤直至旧前大于旧后新后小于新前
  4. 如果
    (1)旧前大于旧后,且新节点列表仍没遍历完,则新增这些节点插入到对应位置
    (2)新后小于新前,且旧节点列表没遍历完,则删除这些剩余的节点

# 4. vue 中 key 的作用

key是每个虚拟dom节点的唯一标识,当进行diff时,根据key可以更快、更准确地找到对应的节点

如果不用key,vue就无法获取每个节点的顺序来在对应位置进行插入或删除,而是会采用就地更新的方式,导致一些多余的dom操作

比如现在有个节点列表是[1,2,3],要向头部插入一个新的节点,值为0;
若不使用key,vue会将原本的节点值改为0、1、2,再在尾部新增一个值为3的节点;
而使用key,vue则会直接创建一个值为0的节点,然后插入到1前面

# 5. vue 数据响应式的原理

  • 概念
    数据响应式即当数据改变时,视图也会相应改变。
  • 原理
    vue 中采用数据劫持和观察者模式的方式实现

Vue2 中:
vue2 中采用 Object.defineProperty 中进行数据劫持,通过为每个数据增加 gettersetter 来监听数据的变化。 缺点:

  1. 监听对象时,需要遍历对象的属性
  2. 无法监听到对象新增的属性
  3. 无法监听数组的变化,vue2 中是通过重写数组方法来实现对数据的劫持

Vue3 中:
vue3 改用 Proxy 进行数据劫持

# 6. v-if 和 v-show

v-if 和 v-show 都能控制元素的显示,但 v-if 显示、隐藏元素是通过增加或删除 dom 元素,而 v-show 是通过为元素加上、移除 display:none 来实现显示或隐藏。
如果是切换频繁的情况,使用 v-show 较好,而如果运行时条件很少变化,则一般使用 v-if

# SPA

单页页面,即网页只会有一个主页面,而不会转移到另一个页面,通过动态加载不同的资源来显示不同界面。

# watch 和 computed 的区别

  1. 功能上:computed 是计算属性,watch是监听一个值的变化,然后执行对应的回调函数
  2. 缓存上:computed 函数所依赖的值没有发生改变,那么调用函数的时候会从缓存中读取;而watch监听到的值发生改变时都会执行回调函数
  3. 是否需要return:computed 必须要有return值,而watch可以没有
  4. computed 默认第一次加载时就开始监听;watch 第一次默认不监听,必须设置 immediate:true 才会监听第一次加载时