Vue.observable()
<template>
<div>{{ proxyObj.name }}</div>
</template>
<script>
import { reactive } from 'vue';
export default {
name: 'App',
setup() {
const proxyObj = reactive({
name: 'Lance',
age: 233
});
console.log(proxyObj);
return {
proxyObj
}
}
}
</script>
<template></template>
<script>
import { reactive } from 'vue';
export default {
name: 'App',
setup() {
const obj = reactive(1); // 无法包装基本类型
}
}
</script>
reactive() API 有两条限制:
let state = reactive({ count: 0 })
// 上面的引用 ({ count: 0 }) 将不再被追踪(响应性连接已丢失!)
state = reactive({ count: 1 })
同时这也意味着当我们将响应式对象的属性赋值或解构至本地变量时,或是将该属性传入一个函数时,我们会失去响应性:
const state = reactive({ count: 0 })
// n 是一个局部变量,同 state.count
// 失去响应性连接
let n = state.count
// 不影响原始的 state n++
// count 也和 state.count 失去了响应性连接
let { count } = state
// 不会影响原始的 state
count++
// 该函数接收一个普通数字,并且
// 将无法跟踪 state.count 的变化
callSomeFunction(state.count)
这样赋值页面是不会变化的因为会脱离响应式
let person = reactive<number[]>([]);
setTimeout(() => {
person = [1, 2, 3];
console.log(person);
}, 1000);
解决方案: