Vue 3的Reactivity系统是Vue框架的核心特性之一,它使得数据的变化能够自动反映到视图上。相比Vue 2,Vue 3对Reactivity系统进行了全面重构,使用了Proxy替代Object.defineProperty,从而实现了更强大的响应式能力。
在Vue 3中,响应式系统主要依赖于ES6中的Proxy
对象。与Vue 2使用的Object.defineProperty
不同,Proxy
可以拦截整个对象的操作,而不仅仅是单个属性。这意味着我们可以轻松实现数组和嵌套对象的响应式支持,同时还能检测到新增或删除的属性。
const handler = {
get(target, key, receiver) {
console.log(`getting ${key}!`);
return Reflect.get(target, key, receiver);
},
set(target, key, value, receiver) {
console.log(`setting ${key}!`);
return Reflect.set(target, key, value, receiver);
}
};
const target = {};
const proxy = new Proxy(target, handler);
proxy.foo = 'bar'; // setting foo!
console.log(proxy.foo); // getting foo! bar
在这个例子中,我们定义了一个handler
对象,其中包含了get
和set
方法。当访问或修改proxy
对象时,这些方法会被触发。
Vue 3引入了一系列新的API来管理响应式数据,包括reactive
、ref
、computed
和watchEffect
等。
import { reactive, ref, computed, watchEffect } from 'vue';
// 使用reactive创建响应式对象
const state = reactive({
count: 0
});
// 使用ref创建响应式引用
const name = ref('Vue');
// 计算属性
const fullName = computed(() => `Hello ${name.value}`);
// 监听变化并执行副作用
watchEffect(() => console.log(fullName.value));
state.count++;
name.value = 'Vue 3';
这段代码展示了如何使用Vue 3的新API来管理状态和监听变化。
接下来,我们将使用Vue 3的Reactivity系统来构建一个简单的计数器组件。
App.vue
中编写以下代码:<template>
<div id="app">
<p>Count: {{ state.count }}</p>
<button @click="increment">Increment</button>
</div>
</template>
<script>
import { reactive } from 'vue';
export default {
setup() {
const state = reactive({
count: 0
});
const increment = () => {
state.count++;
};
return {
state,
increment
};
}
};
</script>
在这个示例中,我们使用reactive
创建了一个响应式状态对象,并通过按钮点击事件来改变状态。