1.Ref
- 作用:定义一个数据的响应式
- 语法:const xx = ref(initValue)
- 创建一个包含响应式数据的引用对象
- js中操作数据:xxx.value
- 模板中操作数据:不需要.value
- 一般用来定义一个基本类型的响应式数据
<template>
<h2>{{count}}</h2>
<hr>
<button @click="update">更新</button>
</template>
<script>
import {
ref
} from 'vue'
export default {
setup () {
const count = ref(1)
console.log(count)
function update () {
count.value = count.value + 1
}
return {
count,
update
}
}
}
</script>
2.Reactive
- 作用:定义多个数据的响应式
- const proxy = reactive(obj):接收一个普通对象然后返回该普通对象的响应式代理器对象
- 响应式转换是“深层的”:会影响对象内部所有嵌套的属性
- 内部基于ES6的proxy实现,通过代理对象操作源对象内部数据都是响应式的
<template>
<h2>name: {{state.name}}</h2>
<h2>age: {{state.age}}</h2>
<h2>wife: {{state.wife}}</h2>
<hr>
<button @click="update">更新</button>
</template>
<script>
import {
reactive,
} from 'vue'
export default {
setup () {
const state = reactive({
name: 'tom',
age: 25,
wife: {
name: 'marry',
age: 22
},
})
console.log(state, state.wife)
const update = () => {
state.name += '--'
state.age += 1
state.wife.name += '++'
state.wife.age += 2
}
return {
state,
update,
}
}
}
</script>
3.reactive与ref的细节(重要)
- 是Vue3的组合式API中2个最重要的响应式API
- ref用来处理基本类型数据,reactive用来处理对象(递归深度响应式)
- ref创建的变量必须使用.value(可以使用volar插件自动添加.value);reactive重新分配一个新对象,会失去响应式(可以使用object.assign去整体替换)
- 如果用ref对象/数组,内部会自动将对象转换为reactive的代理对象
- ref内部:通过给value属性添加getter/setter来实现对数据的劫持
- reactive内部:通过使用proxy来实现对对象内部所有数据的劫持,并通过Reflect操作对象内部数据
- ref的数据操作:在js中要.value,在模板中不需要(内部解析模板时会自动添加.value)
4.reactive与ref的使用原则
- 若需要一个基本类型的响应式数据,必须使用ref
- 若需要一个响应式对象,层级不深,ref、reactive都可以
- 若需要一个响应式对象,且层级较深,推荐使用reactive