响应式对象和数组:reactive

<template>
  <div>{{ state.count }}</div>
</template>
 
<script setup>
import { reactive } from 'vue'
const state = reactive({ count: 0 })
</script>

state 是什么?

是原始对象的 Proxy,它和原始对象是不相等的

reactive 是默认深层响应式的,改变深层次的对象或数组,改动也能被检测到。(可以通过使用 shallowReactive 放弃深层响应性)

局限

  • 仅对对象类型有效(对象、数组和 Map、Set 这样的集合类型),而对 原始类型 无效
  • 将响应式对象的属性做赋值操作给一个变量,再修改这个变量不会产生响应式变化
let a = state.count
a = 1 // 不会响应式变化

响应式变量:ref

创建可以使用任何值类型的响应式

<template>
  <div>{{ count }}</div>
</template>
 
<script setup>
import { ref } from 'vue'
const count = ref(1)
 
console.log(count) // { value: 1, ... }
console.log(count.value) // 1
 
count.value++ // 2
 
const newCount = count
console.log(newCount) // { value: 2, ... }
newCount.value = 111 // 111
</script>

ref 是什么? ref() 将传入参数的值包装为一个带 .value 属性的 ref 对象

ref 是默认深层响应式的,改变深层次的对象或数组,改动也能被检测到。(可以通过使用 shallowRef 放弃深层响应性)

自动解包

不用写 .value

  • template 中的顶层属性
  • 作为 reactive 响应式对象的属性被访问或修改时自动解包