1,ref
作用:一般用于定义基本数据类型数据,比如 String / Boolean / Number等
原理:ref 的背后是使用 reactive 来实现的响应式
语法:const x = ref(100)
访问:在 setup 中使用 .value 来访问
// Demo.vue
<template>
<h1>ref的使用</h1>
<h1 v-text="num"></h1>
<button @click="num++">自增</button>
<button @click="add">自增</button>
</template>
<script setup>
import {ref} from "vue"
// num叫一个ref变量,也叫ref对象
let num = ref(1000);
let add = ()=>{
num.value++
}
</script>
<style lang="less" scoped>
</style>
#2,isRef
作用:判断一个变量是否为一个 ref 对象。
语法:const bol = isRef(x)
// Demo.vue
<template>
<h1>isRef的使用</h1>
<h1 v-text="num"></h1>
<button @click="num++">自增</button>
<button @click="add">自增</button>
</template>
<script setup>
import {ref,isRef} from "vue"
let num = ref(1000);
let add = ()=>{
num.value++
}
// num就是一个ref变化
console.log(isRef(num)); // true
console.log(isRef(110)); // false
console.log(isRef(num.value)); // false
</script>
<style lang="less" scoped>
</style>
#3,unref
作用:用于返回一个值,如果访问的是 ref变量,就返回其 .value值;如果不是 ref变量,就直接返回。
语法:const x = unref(y)
// Demo.vue
<template>
<h1>unref的使用</h1>
<h1 v-text="num"></h1>
<button @click="num++">自增</button>
<button @click="add">自增</button>
</template>
<script setup>
import {ref,isRef,unref} from "vue"
let num = ref(1000);
let add = ()=>{
num.value++
}
console.log(isRef(num));
// 如果给unref传递一个ref变量,得到这个ref的value值
console.log(unref(num));
// 如果给unref传递的不是一个ref变量,得到这个值的本身
console.log(unref(num.value));
console.log(unref(110));
</script>
<style lang="less" scoped>
</style>
#4,customRef
作用:自定义ref对象,把ref对象改写成get/set,进一步可以为它们添加 track/trigger。
// Demo.vue
<template>
<h1>customRef的使用</h1>
<input type="text" v-model="name" />
</template>
<script setup>
// import {ref,isRef,unref} from "vue"
// let name = ref("");
import { customRef,onRenderTracked,onRenderTriggered } from "vue"
let name = customRef((track,trigger)=>{
let value = "";
return {
get(){
track(); // 如果有人访问name,就执行track()
return value
},
set(val){
trigger(); // 如果有人修改name,就执行trigger
value = val;
}
}
})
// 仅供在开发环境下,用于ref变量的调试
onRenderTracked((ev) => console.log("name被访问了", ev));
onRenderTriggered((ev) => console.log("name被修改了", ev));
</script>
<style lang="less" scoped>
</style>
#5,toRef
作用:把一个 reactive对象中的某个属性变成 ref 变量。
语法:const x = toRef(reactive(obj), 'key') // x.value
// Demo.vue
<template>
<h1>toRef的使用</h1>
<h1 v-text="user.name"></h1>
</template>
<script setup>
import {ref,isRef,unref,reactive,toRef} from "vue"
let user = reactive({name:"malu",age:18});
setTimeout(() => {
user.name = "码路"
}, 1000);
// 能不能把user中的name变成ref变量呢?
// 答:toRef
console.log(user.name);
console.log(isRef(user.name));
console.log("-------");
let name = toRef(user,"name");
console.log(name.value);
console.log(isRef(name));
</script>
<style lang="less" scoped>
</style>
#6,toRefs
作用:把一个reactive响应式对象变成ref变量。
语法:const obj1 = toRefs(reactive(obj))
应用:在子组件中接收父组件传递过来的 props时,使用 toRefs把它变成响应式的。
// Demo.vue
<template>
<h1>toRefs的使用</h1>
<h2 v-text="name"></h2>
<h2 v-text="age"></h2>
</template>
<script setup>
import {ref,isRef,unref,reactive,toRefs} from "vue"
let user = reactive({name:"malu",age:18});
let {name,age} = toRefs(user);
console.log(isRef(name));
console.log(isRef(age));
</script>
<style lang="less" scoped>
</style>