对于这个问题:了解vue3中的ref、toRef、toRefs,其实对于很多同学来说,分清楚也不简单,一起看下。
ref:接收一个内部值,生成对应的响应式数据,该内部值挂载在ref对象的value属性上;该对象可以用于模版和reactive。使用ref是为了解决值类型在setup、computed、合成函数等情况下的响应式丢失问题。
toRef:为响应式对象(reactive)的一个属性创建对应的ref,且该方式创建的ref与源属性保持同步。
toRefs:将响应式对象转换成普通对象,对象的每个属性都是对应的ref,两者间保持同步。使用toRefs进行对象解构。
function ref(val) { const wrapper = {value: val} Object.defineProperty(wrapper, '__v_isRef', {value: true}) return reactive(wrapper) } function toRef(obj, key) { const wrapper = { get value() { return obj[key] }, set value(val) { obj[key] = val } } Object.defineProperty(wrapper, '__v_isRef', {value: true}) return wrapper } function toRefs(obj) { const ret = {} for (const key in obj) { ret[key] = toRef(obj, key) } return ret } // 自动脱ref function proxyRefs(target) { return new Proxy(target, { get(target, key, receiver) { const value = Reflect.get(target, key, receiver) return value.__v_isRef ? value.value : value }, set(target, key, newValue, receiver) { const value = target[key] if(value.__v_isRef) { value.value = newValue return true } return Reflect.set(target, key, newValue, receiver) } }) }
网友回答文明上网理性发言 已有0人参与
发表评论: