VUE3重点-3响应式
·
响应式 = 数据变了,页面自动跟着变,不用手动操作 DOM
原生js是没有响应式的
let name = "小明" // 页面渲染 name name = "小红" // 数据改了,页面不会自动刷新,要自己重新赋值改DOM
Vue 响应式:
只要你改数据,模板视图自动更新,不用你操作任何 DOM。
vue2和vue3的响应式核心区别
Vue2:Object.defineProperty
-
只能监听已存在的属性
-
监听不了:新增属性、删除属性、数组下标、数组长度
-
所以 Vue2 才有
this.$set强制更新
Vue3:Proxy(核心)
Proxy 是 ES6 原生 API:
直接劫持整个对象 / 数组,不是劫持单个属性。
能监听:
-
对象新增属性
-
对象删除属性
-
数组下标修改
-
数组长度修改
-
嵌套深层对象
vue3两个核心的响应式API:ref、reactive
ref和reactive的区别
ref的本质是把值包在value对象中、
const count = ref(0)
// 等价于
const count = {
value: 0
}
reactive
reactive 直接代理整个对象,本身就是对象,直接点属性就行。
1. ref
作用:把基本类型(字符串、数字、布尔)变成响应式
底层原理:
把值包装成一个对象,内部有 value 属性,再被 Proxy 劫持。
<script setup>
import { ref } from 'vue'
// 基本类型
const count = ref(0)
// 脚本里修改必须 .value
count.value = 10
</script>
<template>
<!-- 模板里不用 .value -->
{{ count }}
</template>
简单类型 → 用 ref
脚本里 .value
模板里直接写变量名
2、reactive
作用:把 对象 / 数组 变成响应式
不能放基本类型,适合复杂结构。
不用 .value,直接点属性。
<script setup>
import { reactive } from 'vue'
const user = reactive({
name: '张三',
age: 18
})
// 直接改,不用 .value
user.name = '李四'
</script>
<template>
{{ user.name }}
</template>
易错点
1、在代码中结构会丢失响应式
const user = reactive({ name:'张三' })
// 直接解构,失去响应式
const { name } = user
// 改了页面不更新
name = '李四'
toRefs 保留响应式
import { reactive, toRefs } from 'vue'
const user = reactive({ name:'张三' })
// 解构后每一项还是 ref 响应式
const { name } = toRefs(user)
// 脚本里要 .value
name.value = '李四'
原理:
toRefs 把 reactive 对象的每一个属性都转成 ref,解构后依然是响应式。
2、computed 计算属性(衍生响应式)
依赖别的响应式数据,自动缓存,依赖变它自动变
const count = ref(0) const double = computed(() => count.value * 2)
-
不能直接随意赋值(默认只读)
-
依赖变化自动重新计算
-
有缓存,多次渲染只算一次
更多推荐


所有评论(0)