VUE一些细节

43 阅读3分钟

数组变化侦测

vue能侦听响应式数组的变更方法,并在他们被调用时触发相关的更新,这些变更方法包括

  • push() 在数组的末尾添加一个或多个元素,并返回修改后数组的新长度。
  • pop() 从数组的末尾移除最后一个元素,并返回被移除的元素。
  • shift() 从数组的开头移除第一个元素,并返回被移除的元素。
  • unshift() 在数组的开头添加一个或多个元素,并返回修改后数组的新长度。
  • splice() 从数组中添加或删除元素,可以实现在指定位置进行添加、删除或替换操作。
  • sort() 用于对数组的元素进行排序,可通过传递函数作为参数来实现自定义排序逻辑。
  • reverse() 用于反转数组中的元素顺序,即第一个元素变为最后一个,最后一个变为第一个

一些非变更方法不会改变原数组,而是返回一个新数组,不会引起vue的响应式更新

  • filter() 用于筛选出满足特定条件的元素,并返回一个新数组。
  • concat() 将一个或多个数组与当前数组合并,创建并返回一个新数组。原始数组不会被修改
  • slice() 返回数组的一个浅拷贝,选择开始和结束的索引,不包括结束索引处的元素。

若要使用上述方法并进行vue的响应式更新,应该把数组重新赋值,例如:

this.arr = this.arr.concat(['a','b','c'])

DOM更新时机

要等待 DOM 更新完成后再执行额外的代码,可以使用 nextTick() 全局 API

import { nextTick } from 'vue'

export default {
  methods: {
    async increment() {
      this.count++
      await nextTick()
      // 现在 DOM 已经更新了
    }
  }
}

Watch监听

侦听数据源类型

watch 的第一个参数可以是不同形式的“数据源”:它可以是一个 ref (包括计算属性)、一个响应式对象、一个 getter 函数、或多个数据源组成的数组:

const x = ref(0)
const y = ref(0)

// 单个 ref
watch(x, (newX) => {
  console.log(`x is ${newX}`)
})

// getter 函数
watch(
  () => x.value + y.value,
  (sum) => {
    console.log(`sum of x + y is: ${sum}`)
  }
)

// 多个来源组成的数组
watch([x, () => y.value], ([newX, newY]) => {
  console.log(`x is ${newX} and y is ${newY}`)
})

注意,你不能直接侦听响应式对象的属性值,例如:

const obj = reactive({ count: 0 })

// 错误,因为 watch() 得到的参数是一个 number
watch(obj.count, (count) => {
  console.log(`count is: ${count}`)
})

这里需要用一个返回该属性的 getter 函数:

// 提供一个 getter 函数
watch(
  () => obj.count,
  (count) => {
    console.log(`count is: ${count}`)
  }
)

回调的触发时机

当你更改了响应式状态,它可能会同时触发 Vue 组件更新和侦听器回调。

默认情况下,用户创建的侦听器回调,都会在 Vue 组件更新之前被调用。这意味着你在侦听器回调中访问的 DOM 将是被 Vue 更新之前的状态。

如果想在侦听器回调中能访问被 Vue 更新之后的 DOM,你需要指明 flush: 'post' 选项:

watch(source, callback, {
  flush: 'post'
})

样式scoped

让当前样式只在当前组件中生效

ref与reactive的区别

使用ref所定义的所有数据均可进行修改并在页面实时更新,而用reactive定义的数据是常量,基本数据类型无法修改,数组和对象也仅仅能修改内部的值