ref与reactive
ref定义基本类型数据
reactive定义对象或者数组类型的数据
问题:也就是说不建议用ref()来定义对象吗?
回答:ref()可以用来定义对象,但是如果需要对整个对象进行响应式处理,建议使用reactive()。因为ref()只能包装简单的值类型,无法直接包装对象,如果强行使用ref()包装对象,那么得到的是一个带有.value属性的包装对象,而这个.value属性才是真正的对象。而使用reactive()则可以直接将对象转化为响应式对象。
ref通过Object.defineProperty()下面的get()和set()来实现响应式的
reactive是通过Proxy来实现响应式的并通过Reflect来操作源数组
获取ref的数据时候(js中)是需要.value的,读取数据模板中不需要.value
reactive操作是和{{}}模板读取是不需要.value的
Proxy Reflect reactive ref 之间的关系
JavaScript的Proxy和Reflect与Vue的reactive和ref之间有相互关联的关系,它们都是用于实现JavaScript中的响应式编程。
Proxy: 是JavaScript中的一个对象,用于在对象上定义自定义行为。它可以用于拦截对象的属性访问、赋值、函数调用等操作,从而实现对对象行为的监听和修改。Proxy通常用于实现数据的双向绑定和数据的响应式更新。
Reflect: 是JavaScript中引入的一个内置对象,它提供了一组操作对象的方法,这些方法与对象的属性操作相关,例如读取、设置、删除等。Reflect的方法与Object的方法类似,但是它们是作为函数而不是作为对象的方法调用的。Reflect的方法可以用于代替部分Object方法,同时还提供了一些新的功能,例如Reflect.has()可以用于判断对象是否包含某个属性。
Vue的reactive: 可以将一个普通的 JavaScript 对象转换成响应式对象,当响应式对象的属性发生变化时,Vue会自动更新相关的内容。它是通过使用Proxy来实现的。
Vue的ref: 是Vue 3中的一个特殊对象,它用于在组件之间传递数据,并且可以触发视图的重新渲染。Ref对象通常用于对简单类型的数据进行响应式处理。它是通过使用Proxy和Reflect来实现的。
这些概念之间的关系如下图所示:
gherkin
Copy
+----------+ +----------+
| Proxy | | Reflect |
+----------+ +----------+
| |
| |
v v
Reactive Programming Object Operations
| |
| |
v v
+-------+ +-------+
| Vue | | Vue |
|reactive| | ref |
+-------+ +-------+
在图中,Proxy和Reflect都与对象操作相关,而Vue的reactive和ref则是用于实现Vue中的响应式行为的工具。Vue的ref对象可以使用Proxy和Reflect来实现其内部的响应式行为。
计算属性
<template>
姓:<input type="text" v-model="person.firstName"><br/>
名:<input type="text" v-model="person.lastName">
<p>
<input type="text" v-model="person.addName">
</p>
</template>
<script>
import {ref,reactive,computed} from 'vue'
export default {
name: 'App',
setup(){
const person=reactive({
firstName:'付',
lastName:"强"
})
// 计算属性简写,只读写法
// person.addName=computed(()=>{
// return person.firstName+person.lastName
// })
// 计算属性完整写法 读写
person.addName=computed({
get(){
return person.firstName
+"-"+person.lastName
},
set(value){
const nameArr=value.split('-')
person.firstName=nameArr[0]
person.lastName=nameArr[1]
}
})
return{
person
}
}
}
</script>
<style>
</style>