VUE3(九)reactive与toRefs函数

上一部分中我们说到的ref只是作为单个变量的响应。

Vue3.0中还为我们提供了一个对象式响应的reactive函数 。

Reactive函数创建一个响应式对象。

一:Reactive函数

其实,在我看来,reactive函数 就是VUE3.0为我们提供的替代VUE2.0中data的一个函数,因此,在这里,我不建议将方法也写到reactive函数中。

reactive函数 中只写数据即可。

1:引入

import {
    ref,
    reactive,
} from "vue";

2:实例

我这里使用上一部分中我们测试使用的代码来做示例,刚好对比一下ref与reactive在写法上边的区别。

Helloworld.vue

<template>
  <h1>{{ msg }}</h1>
  <!-- <button @click="count++">count is: {{ count }}</button> -->
  <!-- 模板语法需要使用data.属性来调用 -->
  <button @click="count++">count is: {{ data.count }}</button>
  <p>Edit <code>components/HelloWorld.vue</code> to test hot module replacement.</p>
  <button @click="clickMe()">点我弹窗</button>
</template>
 
<script lang='ts'>
import {
    ref,
    reactive
} from "vue";
export default {
  name: 'HelloWorld',
  props: {
    msg: String
  },
  // 使用setup 代替 data
  // 因为我这里使用的是typescript,因此需要给参数指定类型
  setup(props:any,context:any){
    // ref 定义响应式数据
    // let count = ref(0); 
 
    // reactive 创建响应式对象
    let data = reactive({
      // 定义响应式数据
      count:0,
    });
    
    const clickMe = () => {
      // 使用ref关键字绑定的变量,赋值 的时候必须使用.value
      // count.value++;
      // 调用reactive 定义对象的参数的时候需要使用对象.来调用
      data.count++;
      alert('hi');
    }
    return {
      data,
      clickMe
    }
  },
}
</script>
3:主要有这几个区别:

1:在js中调用需要使用data.属性来赋值使用。

2:在VUE模板语法中,也需要使用data.属性来赋值使用。

二:toRefs函数

模板语法中需要使用data.属性来调用属性显示,相对来说就比较麻烦。

其实我们可以使用ES6中的扩展运算符来对其进行解构处理,但是,这样吧解构之后,便不再具有响应式的属性,这个不行。

VUE3.0为我们提供了toRefs函数可以解决这个问题。

1:引入
import {
    ref,
    reactive,
    toRefs
} from "vue";
2:示例

Helloworld.vue

<template>
  <h1>{{ msg }}</h1>
  <button @click="count++">count is: {{ count }}</button>
  <!-- 模板语法需要使用data.属性来调用(单独使用reactive函数) -->
  <!-- <button @click="count++">count is: {{ data.count }}</button> -->
  <p>Edit <code>components/HelloWorld.vue</code> to test hot module replacement.</p>
  <button @click="clickMe()">点我弹窗</button>
</template>
 
<script lang='ts'>
import {
    ref,
    reactive,
    toRefs
} from "vue";
export default {
  name: 'HelloWorld',
  props: {
    msg: String
  },
  // 使用setup 代替 data
  // 因为我这里使用的是typescript,因此需要给参数指定类型
  setup(props:any,context:any){
    // ref 定义响应式数据
    // let count = ref(0); 
 
    // reactive 创建响应式对象
    let data = reactive({
      // 定义响应式数据
      count:0,
    });
    
    const clickMe = () => {
      // 使用ref关键字绑定的变量,赋值 的时候必须使用.value
      // count.value++;
      // 调用reactive 定义对象的参数的时候需要使用对象.来调用
      data.count++;
      alert('hi');
    }
 
    // 使用toRefs函数对data对象进行包装,确保使用扩展运算符进行解构之后,仍具有响应式
    let param = toRefs(data);
    return {
      // data,
      ...param,
      clickMe
    }
  },
}
</script>

完整的代码已经给出,具体的使用,你可能还需要自己试一下。

有好的建议,请在下方输入你的评论。

欢迎访问个人博客
https://guanchao.site

欢迎访问小程序:

在这里插入图片描述

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3中,我们可以使用`reactive`和`toRefs`这两个函数来处理响应式数据。引用中的代码展示了如何引入这两个函数。 `reactive`函数Vue 3为我们提供的替代Vue 2中的`data`选项的函数。它接收一个普通的JavaScript对象作为参数,并将其转换为具有响应式特性的对象。这意味着当我们修改这个响应式对象的属性时,相关的组件会自动更新。所以,可以将组件的状态数据放在`reactive`函数中来管理。引用提到了不建议将方法也写在`reactive`函数中。 而`toRefs`函数在处理响应式数据时非常有用。它允许我们在模板或计算属性中访问响应式对象的属性,并保持属性的响应式特性。通常情况下,当我们将一个`reactive`对象传递给子组件时,子组件无法正确地追踪响应式对象的属性的变化。但是,我们可以使用`toRefs`将`reactive`对象的属性转换为普通的响应式引用对象,从而解决这个问题。这样,在子组件中使用这些属性时,就能够获得正确的响应式特性。引用中提到了结合`ref`、`reactive`和`toRefs`的使用能够更灵活地管理组件的状态和响应。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [VUE3 reactivetoRefs函数](https://blog.csdn.net/hsany330/article/details/120134550)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [Vue 3 中的 toRefs:响应式数据的关键函数](https://download.csdn.net/download/qq_29901385/88105478)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值