定义变量
1.ref()
1.1 作用
ref()函数用来定义变量,一般用来定义一个基本数据类型的变量
ref()也可以定义复杂数据类型,但是内部也会reactive()转化为响应式对象
1.2 语法
接受一个内部值,返回一个响应式的、可更改的 ref 对象,此对象只有一个指向其内部值的属性 .value。
ts
function ref<T>(value: T): Ref<UnwrapRef<T>>
interface Ref<T> {
value: T
}使用语法如下:
js
import {ref} from 'vue'
// 定义基本数据类型
const num=ref(123)
const str=ref('你好')
const bool=ref(true)
const none=ref(null)
const no=ref(undefined)
// 定义复杂数据类型
const obj=ref({
num:123
})
const arr=ref([1,2,3,4,5])ts
import {ref} from 'vue'
// 定义基本数据类型
const num=ref<number>(123)
const str=ref<string>('你好')
const bool=ref<boolean>(true)
const none=ref<null>(null)
const no=ref<undefined>(undefined)
// 定义复杂数据类型
interface Item{
num:number
}
const obj=ref<Item>({
num:123
})
const arr=ref<Array<number>>([1,2,3,4,5])1.3 使用
ref()返回一个Ref对象,其中有一个value属性存储着我们定义的值
也就是说ref()定义的数据都需要以.value的方式使用
js
const num=ref(123)
console.log(num.value) // 123
const str=ref('你好')
console.log(str.value) // '你好'
const obj=ref({
num:123
})
console.log(obj.value.num) // 123
const obj=ref([1,2,3])
console.log(obj.value[0]) // 11.4 ref引用
ref除了可以定义数据,也可以用来获取dom或者一个组件的引用,实现步奏主要有以下几步
- 给
dom元素或者组件添加ref属性,值为一个字符串 - 定义
ref变量,变量名要和dom或组件中ref属性的值一致 - 通过
.value获取dom或组件实例
vue
<template>
<div ref="boxRef"></div>
<Child ref="childRef"/>
<template/>
<script setup>
import {ref,onMounted} from 'vue'
const boxRef=ref(null)
const childRef=ref(null)
onMounted(()=>{
console.log(boxRef.value) // dom元素
console.log(childRef.value) //
})
</script>TIP
需要在dom挂载完毕后才能获取到ref引用的值
2.reactive()
2.1 作用
返回一个对象的响应式代理。Vue3用来定义复杂数据类型,注意不可以定义基本数据类型
ts
function reactive<T extends object>(target: T): UnwrapNestedRefs<T>2.2 语法
使用reactive()定义对象如下所示
js
import { reactive } from 'vue'
const obj=reactive({
name:'坤坤'
})
const arr=reactive([1,2,3])ts
import { reactive } from 'vue'
interface Item{
name:string
}
const obj=reactive<Item>({
name:'坤坤'
})
const arr=reactive<Array<number>>([1,2,3])2.3 使用
使用reactive()定义的数据不需要像ref()一样.value才能获取到值,reactive()定义的数据可以直接使用
js
const obj=reactive({
name:'坤坤'
})
console.log(obj.name) // 坤坤
const arr=reactive([1,2,3])
console.log(arr[0]) // 13.readonly()
接受一个对象 (不论是响应式还是普通的) 或是一个ref,返回一个原值的只读代理。
类型
ts
function readonly<T extends object>(
target: T
): DeepReadonly<UnwrapNestedRefs<T>>详细信息
只读代理是深层的:对任何嵌套属性的访问都将是只读的。它的 ref 解包行为与 reactive() 相同,但解包得到的值是只读的。
要避免深层级的转换行为,请使用 shallowReadonly()作替代。
示例
js
const original = reactive({ count: 0 })
const copy = readonly(original)
watchEffect(() => {
// 用来做响应性追踪
console.log(copy.count)
})
// 更改源属性会触发其依赖的侦听器
original.count++
// 更改该只读副本将会失败,并会得到一个警告
copy.count++ // warning!