vue3.0-reactivityApi
2021-06-28 22:04
标签:监听 dos target sed 需要 改变 展开 html 详细 reactivity api: https://v3.vuejs.org/api/reactivity-api 应用: 题1:下面的代码输出结果是什么? 题2:按照下面的要求完成函数 题3:按照下面的要求完成函数 watchEffect watch 注意:无论是 应用:除非遇到下面的场景,否则均建议选择 试题: 下面的代码输出结果是什么? unref 等同于: 应用: toRef 得到一个响应式对象某个属性的ref格式 toRefs 把一个响应式对象的所有属性转换为ref格式,然后包装到一个 应用: 所有的 vue3.0-reactivityApi 标签:监听 dos target sed 需要 改变 展开 html 详细 原文地址:https://www.cnblogs.com/chenhao39/p/14940847.html
获取响应式数据
API
传入
返回
备注
reactive
plain-object
对象代理
深度代理对象中的所有成员
readonly
plain-object
or proxy
对象代理
只能读取代理对象中的成员,不可修改
ref
any
{ value: ... }
对value的访问是响应式的
如果给value的值是一个对象,
则会通过reactive
函数进行代理
如果已经是代理,则直接使用代理
computed
function
{ value: ... }
当读取value值时,
会根据情况决定是否要运行函数
reactive
或ref
readonly
ref
computed
import { reactive, readonly, ref, computed } from "vue";
const state = reactive({
firstName: "Xu Ming",
lastName: "Deng",
});
const fullName = computed(() => {
console.log("changed");
return `${state.lastName}, ${state.firstName}`;
});
console.log("state ready");
console.log("fullname is", fullName.value);
console.log("fullname is", fullName.value);
const imState = readonly(state);
console.log(imState === state);
const stateRef = ref(state);
console.log(stateRef.value === state);
state.firstName = "Cheng";
state.lastName = "Ji";
console.log(imState.firstName, imState.lastName);
console.log("fullname is", fullName.value);
console.log("fullname is", fullName.value);
const imState2 = readonly(stateRef);
console.log(imState2.value === stateRef.value);
function useUser(){
// 在这里补全函数
return {
user, // 这是一个只读的用户对象,响应式数据,默认为一个空对象
setUserName, // 这是一个函数,传入用户姓名,用于修改用户的名称
setUserAge, // 这是一个函数,传入用户年龄,用户修改用户的年龄
}
}
function useDebounce(obj, duration){
// 在这里补全函数
return {
value, // 这里是一个只读对象,响应式数据,默认值为参数值
setValue // 这里是一个函数,传入一个新的对象,需要把新对象中的属性混合到原始对象中,混合操作需要在duration的时间中防抖
}
}
监听数据变化
const stop = watchEffect(() => {
// 该函数会立即执行,然后追中函数中用到的响应式数据,响应式数据变化后会再次执行
})
// 通过调用stop函数,会停止监听
stop(); // 停止监听
// 等效于vue2的$watch
// 监听单个数据的变化
const state = reactive({ count: 0 })
watch(() => state.count, (newValue, oldValue) => {
// ...
}, options)
const countRef = ref(0);
watch(countRef, (newValue, oldValue) => {
// ...
}, options)
// 监听多个数据的变化
watch([() => state.count, countRef], ([new1, new2], [old1, old2]) => {
// ...
});
watchEffect
还是watch
,当依赖项变化时,回调函数的运行都是异步的(微队列)watchEffect
import { reactive, watchEffect, watch } from "vue";
const state = reactive({
count: 0,
});
watchEffect(() => {
console.log("watchEffect", state.count);
});
watch(
() => state.count,
(count, oldCount) => {
console.log("watch", count, oldCount);
}
);
console.log("start");
setTimeout(() => {
console.log("time out");
state.count++;
state.count++;
});
state.count++;
state.count++;
console.log("end");
判断
API
含义
isProxy
判断某个数据是否是由
reactive
或readonly
isReactive
判断某个数据是否是通过
reactive
创建的
详细:https://v3.vuejs.org/api/basic-reactivity.html#isreactive
isReadonly
判断某个数据是否是通过
readonly
创建的
isRef
判断某个数据是否是一个
ref
对象转换
isRef(val) ? val.value : val
function useNewTodo(todos){
todos = unref(todos);
// ...
}
const state = reactive({
foo: 1,
bar: 2
})
const fooRef = toRef(state, ‘foo‘); // fooRef: {value: ...}
fooRef.value++
console.log(state.foo) // 2
state.foo++
console.log(fooRef.value) // 3
plain-object
中返回const state = reactive({
foo: 1,
bar: 2
})
const stateAsRefs = toRefs(state)
/*
stateAsRefs: not a proxy
{
foo: { value: ... },
bar: { value: ... }
}
*/
setup(){
const state1 = reactive({a:1, b:2});
const state2 = reactive({c:3, d:4});
return {
...state1, // lost reactivity
...state2 // lost reactivity
}
}
setup(){
const state1 = reactive({a:1, b:2});
const state2 = reactive({c:3, d:4});
return {
...toRefs(state1), // reactivity
...toRefs(state2) // reactivity
}
}
// composition function
function usePos(){
const pos = reactive({x:0, y:0});
return pos;
}
setup(){
const {x, y} = usePos(); // lost reactivity
const {x, y} = toRefs(usePos()); // reactivity
}
降低心智负担
composition function
均以ref
的结果返回,以保证setup
函数的返回结果中不包含reactive
或readonly
直接产生的数据function usePos(){
const pos = reactive({ x:0, y:0 });
return toRefs(pos); // {x: refObj, y: refObj}
}
function useBooks(){
const books = ref([]);
return {
books // books is refObj
}
}
function useLoginUser(){
const user = readonly({
isLogin: false,
loginId: null
});
return toRefs(user); // { isLogin: refObj, loginId: refObj } all ref is readonly
}
setup(){
// 在setup函数中,尽量保证解构、展开出来的所有响应式数据均是ref
return {
...usePos(),
...useBooks(),
...useLoginUser()
}
}