composable 是以 use 开头、用组合式 API 封装有状态逻辑的函数:接收 ref 或普通值作为输入,返回 ref、computed 与方法,内部可注册生命周期与 watch。设计要点:单一职责、输入输出显式、副作用随组件卸载自动清理。

约定与技巧:参数尽量接受 MaybeRef,用 toValue()(Vue 3.3+)或 unref() 归一化;返回普通对象便于调用方解构扩展;watch、事件监听注册在 setup 建立的 effect 作用域内,卸载时自动停止。易错点:若在全局单例等脱离组件作用域的地方调用,需要用 effectScope 手动管理生命周期;不要返回一个 reactive 整体,调用方一解构就丢响应式,应返回 ref 组成的对象。追问:effectScope 的用法、与 React 自定义 Hook「每次渲染重跑」的差异。

function useFetch(url) {
  const data = ref(null), error = ref(null)
  watchEffect(async () => { data.value = await (await fetch(toValue(url))).json() })
  return { data, error }
}