Skip to content

watch面试题

面试题:watch 和 computed 的区别是什么?说一说各自的使用场景?

watch的使用

js
const count = ref('');
watch(count, async (newVal, oldVal)=>{})

watch(()=>{
  count...
}, (newVal, oldVal)=>{
  // ...
})

watch核心实现

js
import { effect, cleanup } from "./effect/effect.js";

// 遍历对象
function traverse(value, seen = new Set()) {
  // ...
}

/**
 * @param {*} source 
 * @param {*} cb 要执行的回调函数
 * @param {*} options 选项对象
 * @returns
 */
export function watch(source, cb, options = {}) {
  // 1. 参数归一化,统一成一个函数
  let getter;
  if(typeof source === 'function'){
    getter = source;
  } else {
    getter = () => traverse(source)
  }
  
  // 2. 保存新值和旧值
  let oldValue, newValue;
  
  const effectFn = effect(()=>getter(), {
    lazy: true,
    scheduler: ()=>{
      newValue = effectFn();
      cb(newValue, oldValue)
      oldValue = newValue
    }
  })
  
  oldValue = effectFn()
  
  return ()=>{
    cleanup(effectFn)
  }
}

面试题:watch 和 computed 的区别是什么?说一说各自的使用场景?

参考答案:

computed

  • 作用:用于创建计算属性,依赖于 Vue 的响应式系统来做数据追踪。当依赖的数据发生变化时,会自动重新计算。
  • 无副作用:计算属性内部的计算应当是没有副作用的,也就是说仅仅基于数据做二次计算。
  • 缓存:计算属性具备缓存机制,如果响应式数据没变,每次获取计算属性时,内部直接返回的是上一次计算值。
  • 用处:通常用于模板当中,以便在模板中显示二次计算后的结构。
  • 同步:计算属性的一个核心特性是缓存,而这种缓存机制是基于同步计算的,假如允许异步计算,那么在异步操作完成之前,计算属性无法提供有效的返回值,这与它的缓存设计理念相违背。

watch

  • 作用:用于监听数据的变化,可以监听一个或者多个数据,当数据发生改变时,执行一些用户指定的操作。
  • 副作用:监听器中的回调函数可以执行副作用操作,例如发送网络请求、手动操作 DOM 等。
  • 无缓存:监听器中的回调函数执行结果不会被缓存,也没办法缓存,因为不知道用户究竟要执行什么操作,有可能是包含副作用的操作,有可能是不包含副作用的操作。
  • 用处:常用于响应式数据发生变化后,重新发送网络请求,或者修改 DOM 元素等场景。
  • 支持异步:在监听到响应式数据发生变化后,可以进行同步或者异步的操作。

-EOF-

Released under the MIT License.