简要介绍Vue中ref以及相关的工具函数

本文介绍了Vue.js中的ref对象,它用于创建响应式、可变的变量。文章详细讲解了如何使用ref,包括导入、声明和操作方式,以及相关的工具函数如isRef、unRef和toRef/toRefs的作用和用法。强调了ref底层原理和使用时需要注意的问题,鼓励读者查阅官方文档以获得更深入的理解。
摘要由CSDN通过智能技术生成

什么是ref

官方解释:接受一个内部值,返回一个响应式的、可更改的 ref 对象,此对象只有一个指向其内部值的属性。建议可以多看看文档Vue.js - 渐进式 JavaScript 框架 | Vue.js

 个人理解:使用ref声明的变量,对起进行操作之后值都会被追踪,在用到该数据的地方也会发生相应的变化并且需要使用.value来对数据进行操作,该Api的底层还是使用了Proxy代理来实现,使用get与set方法来重新定义并获取值(但是还不是很明白)

1、如何使用

使用方法:

        1、需要先将ref导入

        2、在定义变量的时候使用ref(值)

  //导入ref
import { ref,type Ref } from "vue";
    // 使用ref
const count:Ref<number> = ref(0);
console.log(count)//拿到值

介绍一些相关的工具函数

        1、isRef

               该工具函数的作用是用来检查一个值是否为ref对象,如果是使用ref来定义的数据就是true不是就是false

  // 2、isRef
    const count:Ref<number> = ref(0);
    const count2:number = 0;
    console.log(isRef(count) ? '使用ref定义的数据' : '没有使用ref定义的数据');//使用ref定义的数据
    console.log(isRef(count) ? '使用ref定义的数据' : '没有使用ref定义的数据');//没有使用ref定义的数据
      2、unRef

                该工具函数 判断传入的参数是否为一个ref对象,是则返回该对象的值,不是则返回参数

它是isRef的语法糖,可以用isRef来实现该工具函数

    2、unRef
    // 1、使用ref
    const count:Ref<number> = ref(0);
    // 不使用ref
    const count2:number = 10;
    //unRef 判断传入的参数是否为一个ref对象,是则返回该对象的值,不是则返回参数
    // 直接使用
    const isNumber = (value:number)=>{
        console.log(unref(value));
    }
    isNumber(count.value);//0
    // 传入一个非ref对象
    isNumber(count2)//10

        unRef使用isRef来实现

     2、unRef
    // 1、使用ref
    const count:Ref<number> = ref(0);
    // 不使用ref
    const count2:number = 10;
    //unRef 判断传入的参数是否为一个ref对象,是则返回该对象的值,不是则返回参数
    // 直接使用
    const isNumber = (val:number)=>{
        //console.log(unref(val));
        //使用isRef来实现unRef
        console.log( isRef(val) ? val.value : val )
    }
    isNumber(count.value);//0
    // 传入一个非ref对象
    isNumber(count2)//10
3、toRef

        该工具函数,是将基于响应式数据的对象中的属性,创建一个对应的ref,且对应的ref与源数据同步

        在使用该方法之前,需要先认识一下reactive,这样更好理解toRef方法

        reactive(数据响应式Api)

                该Api同Ref作用类似都是将数据变成响应式数据,只不过reactive多用来定义对象、数组、Map等类型数据,其中要注意如果将对象直接解构出来,则对应的属性会失去响应式

//定义一个响应式对象
const p1: Info2 = reactive({
  names:'123',
  addres:'123',
  sum:1
})
//解构对象
const {names,addres,sum} = p1;//此时数据已不再具备响应式
function changeSum(){
    p1.sum++;
    console.log(p1.sum,sum)
}
changeSum()

 所以为了解决这样的问题,可以使用toRef工具让响应式对象的属性具备数据响应的功能,创建一个对应的ref。创建出来的ref会跟源属性保持同步:更改了ref的值就会更改源属性的值,反之亦然。

const p1: Info2 = reactive({
  names:'123',
  addres:'123',
  sum:1
})
// 直接解构将不再具备响应式
//const {names,addres,sum} = p1;
const NewSum = toRef(p1,'sum')
// 使用toRef将数据编程响应式数据
const changInfo = () => {
    // p1.sum++;
    p1.sum++;
    console.log('原对象的值'+p1.sum,'使用toRef'+NewSum.value)
}
changInfo()

 由于他们是双向的,改变ref的值也会改变对象的值,在使用的时候还有个问题需要注意,如果数据对象是下面这种

const arr = reactive(ref(0));
//如果要访问arr的值,必须使用.value的方法访问,reactive不会对ref自动解包
console.log(arr[0])//会返回一个ref对象
console.log(arr[0].value)//得到值0

4、toRefs

        该工具函数与toRef类似,根据英语上面s多半代表多个复数(瞎扯的),toRef会对对象上面的属性创建一个对应的ref,创建出来的ref会跟源属性保持同步,而toRefs会将对象变成一个普通对象,而里面每一个属性则都具备toRef的效果,则现在可以直接对该对象解构,里面的属性也不会丢失响应式。

//toRefs
const Obj = reactive({
    num:1,
    num2:2,
    num3:3,
});
const NewObj = toRefs(Obj);//此时NewObj里面的属性都具备响应式,可直接解构
const {num ,num2,num3} = NewObj;
const changeNum = ()=>{
    num.value++;
    console.log('源对象的值',num.value,'使用toRefs解构的值',num.value)
}

         

以上就是简要介绍了下ref以及相关的工具函数,可能理解或用法上会有误。拿不准的或者觉得不好理解的可以去看看官方文档。

  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以用文回答你的问题。 在Vue 3,`ref`和`reactive`都是用于在Vue组件创建响应式数据的函数。 `ref`函数接受一个参数,并返回一个响应式的对象。这个参数可以是任何JavaScript类型,包括对象、数组、字符串、数字等等。`ref`函数返回的响应式对象包装了传入的参数,使得该参数的任何变化都会被Vue自动检测到并触发重新渲染视图。要访问`ref`对象的值,需要使用`.value`属性。 例如: ``` import { ref } from 'vue' const count = ref(0) console.log(count.value) // 输出0 count.value++ // 修改count的值 console.log(count.value) // 输出1 ``` `reactive`函数也接受一个参数,但这个参数必须是一个普通的JavaScript对象。`reactive`函数会递归地将这个对象的所有属性转换成响应式的对象,从而实现响应式数据的功能。要访问`reactive`对象的值,可以直接使用对象属性访问方式。 例如: ``` import { reactive } from 'vue' const state = reactive({ count: 0 }) console.log(state.count) // 输出0 state.count++ // 修改state对象count属性的值 console.log(state.count) // 输出1 ``` 总的来说,`ref`和`reactive`都是Vue 3非常有用的响应式数据函数,用于实现组件的数据绑定和响应式渲染。如果你只需要创建单一的响应式值,使用`ref`更为简单;如果你需要创建一个包含多个属性的响应式对象,使用`reactive`更为方便。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值