Vue3中使用ref与reactive创建响应式数据的示例代码

 更新时间:2024年08月12日 09:21:37   作者:布呐呐na  
这篇文章主要介绍了Vue3中使用ref与reactive创建响应式数据的方法,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

1 ref创建:基本类型的响应式数据

使用ref将基本类型的数据变成一个RefImpl的实例对象,对象的value属性即为具体数值,函数修改时需要修改value属性,但是在模板中直接使用,不需要value:

<template>
  <h1 class="home">首页</h1>
  // 基本数据类型
  <p>{{name}}</p>
  <p>{{age}}</p>
  <button @click="addAge">增加年龄</button>
</template>
 
<script setup lang="ts">
  import {ref} from "vue";
 
  let name = ref("张三")
  let age = ref(18)
 
  function addAge(){
    age.value += 1
  }
</script>

2 ref创建:对象类型的响应式数据

 ref既可以定义基础类型的数据,也可以定义对象类型的响应式数据,但是都必须加上.value:

<template>
  <h1 class="home">首页</h1>
  <p>我喜欢开{{car.name}}</p>
  <button @click="changeCar">修改汽车</button>
</template>
 
<script setup lang="ts">
  import {ref} from "vue";
 
  // 数据
  let car = ref({name: "AuDi", price: 1000000})
  // 方法
  function changeCar(){
    car.value.name = car.value.name === "AuDi" ? "YaDi" : "AuDi"
  }
</script>

3 reactive创建:对象类型的响应式数据

使用reactive将对象类型数据变成一个Proxy的实例对象,将其变成响应式数据,其实不仅仅是对象类型,数组、集合等类型均可:

注:reactive只能创建对象类型的响应式数据

<template>
  <h1 class="home">首页</h1>
  // 对象数据类型
  <p>我喜欢开{{car.name}}</p>
  <button @click="changeCar">修改汽车</button>
  <hr>
  <h3>我喜欢的游戏:</h3>
  // 数组数据类型
  <ul>
    <li v-for="item in games" :key="item.id">{{item.name}}</li>
  </ul>
  <button @click="changeFirstGame">改变第一个游戏</button>
  <hr>
</template>
 
<script setup lang="ts">
  import {ref} from "vue";
  import {reactive} from "vue";
 
  // 数据
  let car = reactive({name: "AuDi", price: 1000000})
  let games = reactive([
    {id: "001", name: "英雄联盟"},
    {id: "002", name: "穿越火线"},
    {id: "003", name: "洛克王国"}
  ])
  // 方法
  function changeCar(){
    car.name = car.name === "AuDi" ? "YaDi" : "AuDi"
  }
  function changeFirstGame(){
    games[0].name = "LOL"
  }
</script>

4 ref与reactive 

当修改使用reactive创建的对象属性时,如果只修改对象的某个属性,则不会出现问题。如果修改整个对象比如:

  function changeCar(){
    car = {name: "YaDi", price: 1000}
  }
  function changeCar(){
    car = reactive({name: "YaDi", price: 1000})
  }

上面两种写法均无法修改数据,页面不会更新,数据失去了响应式。正确修改方式:

<template>
  <h1 class="home">首页</h1>
  <p>我喜欢开{{car.name}},价值{{car.price}}元</p>
  <button @click="changeCar">修改汽车</button>
</template>
 
<script setup lang="ts">
  import {reactive} from "vue";
 
  // 数据
  let car = reactive({name: "AuDi", price: 1000000})
  // 方法
  function changeCar(){
    Object.assign(car, {name: "YaDi", price: 1000})
  }
</script>

但是,使用ref创建的对象可以直接修改:

<template>
  <h1 class="home">首页</h1>
  <p>我喜欢开{{car.name}},价值{{car.price}}元</p>
  <button @click="changeCar">修改汽车</button>
</template>
 
<script setup lang="ts">
  import {ref} from "vue";
 
  // 数据
  let car = ref({name: "AuDi", price: 1000000})
  // 方法
  function changeCar(){
    car.value = {name: "YaDi", price: 1000}
  }
</script>

使用原则:

  • 若需要一个基本数类型的响应式数据,必须用ref
  • 若需要一个响应式对象,层级不深,refreactive都可以
  • 若需要一个响应式对象,层级较深,推荐使用reactive

5 ref的另一个作用

ref标签属性

ref标签加到html标签上,可以直接拿到DOM元素:

<template>
  <div>
    <p ref="title">hello vue3</p>
    <button @click="showTag">输出title标签的组件</button>
  </div>
</template>
 
<script setup lang="ts">
  import {ref} from 'vue';
 
  // 创建一个title,用于存储ref标记的内容
  let title = ref()
 
  function showTag(){
    console.log(title.value)
  }
</script>

当ref标签加到组件上,也可以拿到组件元素,但是vue3对其进行了保护措施:

<template>
  <Home ref="qwe"/>
  <button @click="showTag">获取组件</button>
</template>
 
<script setup lang="ts">
  import Home from "./components/Home.vue"
  import {ref} from "vue";
 
  let qwe = ref()
 
  function showTag(){
    console.log(qwe.value)
  }
</script>

获取的内容里并没有可用信息,需要Home组件暴露出信息,使用defineExpose指出可访问的信息:

<template>
  <div>
    <p ref="title">hello vue3</p>
    <button @click="showTag">输出title标签的组件</button>
  </div>
</template>
 
<script setup lang="ts">
  import {ref,defineExpose} from 'vue';
 
  // 创建一个title,用于存储ref标记的内容
  let title = ref()
 
  function showTag(){
    console.log(title.value)
  }
  defineExpose({title})
</script>

6 toRefs与toRef

toRefs可以用来将对象类型数据解构,解构后的数据也是响应式数据:

注:原对象的数据也会跟随结构的数据的改变而改变!!!

<template>
  <h1 class="home">首页</h1>
  <p>{{name}}</p>
  <p>{{price}}</p>
  <button @click="changeCarName">修改车名</button>
  <button @click="changeCarPrice">修改价格</button>
 
</template>
 
<script setup lang="ts">
  import {reactive, toRefs} from "vue";
 
  // 数据
  let car = reactive({name: "AuDi", price: 1000000})
  let {name,price} = toRefs(car)
  // 方法
  function changeCarName(){
    name.value = "YaDi"
  }
  function changeCarPrice(){
    price.value = 1000
  }
</script>

toRef的解构方式:

  let car = reactive({name: "AuDi", price: 1000000})
  let carName = toRef(car, 'name')
  let carPrice = toRef(car, 'price')

7 小贴士: 

条件渲染的两种方式v-if和v-show的对比,两种方式实现的效果相同,但是渲染原理不同:

v-if:指令用于条件性地渲染一个元素。如果条件为真,元素将会被渲染到 DOM 中;如果条件为假,元素将不会被渲染。

v-show:它与v-if不同,在渲染时不管条件为真还是为假,都会渲染。但是会根据条件真假去决定显示还是隐藏。

v-if具有更高的切换开销,v-show具有更高的初始渲染开销。v-if 适用于条件不经常改变的场景,切换条件时的开销较大,因为需要重新渲染元素。v-show适用于条件经常改变的场景,切换条件时的开销较小,因为只是改变样式属性。

以上就是Vue3中使用ref与reactive创建响应式数据的示例代码的详细内容,更多关于Vue3 ref与reactive创建响应式数据的资料请关注脚本之家其它相关文章!

相关文章

  • vue filter的几种用法示例小结

    vue filter的几种用法示例小结

    Vue.filter函数用于注册一个全局的过滤器,该过滤器可以在模板和组件中使用,这篇文章主要介绍了vue filter的几种用法示例小结,需要的朋友可以参考下
    2024-08-08
  • vue实现登录后页面跳转到之前页面

    vue实现登录后页面跳转到之前页面

    本文给大家分享了vue实现登录后页面跳转到之前页面的一个功能,有这方便需要的朋友学习参考下吧。
    2018-01-01
  • vue-video-player 播放m3u8视频流的实现

    vue-video-player 播放m3u8视频流的实现

    本文主要介绍了vue-video-player 播放m3u8视频流的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Vue如何设置el-table背景透明样式

    Vue如何设置el-table背景透明样式

    本文主要介绍了Vue如何设置el-table背景透明样式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Vue的自定义事件之组件通信工具详解

    Vue的自定义事件之组件通信工具详解

    这篇文章主要介绍了Vue的自定义事件之组件通信工具详解,Vue的自定义事件(Custom Events)是一种强大的工具,用于实现组件之间的通信和数据传递,本文将深入探讨什么是Vue的自定义事件,以及如何自定义和使用它们,需要的朋友可以参考下
    2023-10-10
  • vue+element下日期组件momentjs转换赋值问题解决

    vue+element下日期组件momentjs转换赋值问题解决

    这篇文章主要介绍了vue+element下日期组件momentjs转换赋值问题,记录下使用momentjs转换日期字符串赋值给element的日期组件报错问题,需要的朋友可以参考下
    2024-02-02
  • Vue中foreach/map/filter的使用及说明

    Vue中foreach/map/filter的使用及说明

    foreach、map和filter是JavaScript中用于数组操作的三个方法,foreach用于循环遍历数组并对每个元素进行操作,不会改变原数组,没有返回值,map也用于遍历数组,但会返回一个新的数组,不会改变原数组,每次遍历都有返回值,filter用于过滤数组,根据条件返回一个新的数组
    2026-03-03
  • vue动态配置模板 ''component is''代码

    vue动态配置模板 ''component is''代码

    这篇文章主要介绍了vue动态配置模板 'component is'代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 详解vue 模版组件的三种用法

    详解vue 模版组件的三种用法

    本篇文章主要介绍了详解vue 模版组件的三种用法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • vue3的二维码组件vue3-next-qrcode

    vue3的二维码组件vue3-next-qrcode

    这篇文章主要为大家介绍了vue3的二维码组件vue3-next-qrcode示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09

最新评论