vue3 ref 和 reactive 函数

前言

上一篇博文介绍 setup 函数的时候,最后出现一个问题,就是在 setup 函数中,编写一个事件,直接去修改定义的变量,发现页面上没有更新成功,并且控制台报错,那这篇博客就是讲解遇到的这个问题应该如何处理。

ref 函数介绍

  • ref 作用就是将基础数据转换为响应式数据,把数据包装成响应式的引用数据类型的数据。
  • 通过对参数返回值的 value 属性获取响应式的值,并且修改的时候也需要对 value 进行修改。
  • 在 vue2 当中,通过给元素添加 ref='xxx' ,然后使用 refs.xxx 的方式来获取元素,vue3 也可以。
  • 当 ref 里面的值发生变化的时候,视图会自动更新数据。
  • ref 可以操作基本数据类型和复杂数据类型,建议使用 ref 操作只对基本数据类型进行操作。

ref 函数使用

使用 ref 函数很简单,首先要在页面引用,然后就可以直接使用了,具体怎么使用呢,下面为了方便介绍,简单来几个案例。

ref 函数处理基本数据类型

首先提一个需求:页面有一个名称需要显示,有一个按钮,点击按钮的时候修改页面展示的这个名字。

<template>
<div>
<h1>ref reactive 函数</h1>
<h1>姓名:{{name_ref}}</h1>
<el-button type="primary" @click="btn">修改名字</el-button>
</div>
</template>
<script>
import { ref } from 'vue' // 引入 ref
export default {
setup() {
const name = '.' // 创建一个变量为 .
const name_ref = ref(name) // ref 将参数包裹转换成响应式数据
const btn = () => { // 按钮点击修改名字
name_ref = '我是.' // 将名字内容改为 我是.
}
return { name_ref, btn } // 把页面需要使用的参数和方法抛出去
}
}
</script>

编写完上面的代码保存刷新,可以正常渲染数据,但是点击按钮修改名字的时候,出现问题!

为什么使用过 ref 将数据映射为响应式数据还是报错呢?我们可以先打印一下 ref 包裹后,也就是 name_ref 这个参数,看一下他的结构。



所以说修改代码:

<template>
<div>
<h1>ref reactive 函数</h1>
<h1>姓名:{{name_ref}}</h1>
<el-button type="primary" @click="btn">修改名字</el-button>
</div>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const name = '.'
const name_ref = ref(name)
console.log(name_ref)
const btn = () => {
name_ref.value = '我是.' // 对响应式数据的value进行操作
}
return { name_ref, btn }
}
}
</script>

然后在保存代码刷新页面查看效果。



非常棒,数据完美的修改了。

有一点需要说一下哈,就是在单文件组件中,不必写value,因为setup方法会自动解析,简单的可以理解成 html 代码不需要额外操作 value,但是逻辑层需要。

ref 函数处理复杂数据类型

首先声明:不建议使用 ref 函数处理复杂数据类型(数组、对象等),用 ref 函数处理基本数据类型(数字、字符串等)就可以了。

例如我们写一个案例,创建一个个人信息,放到对象里面展示。

<template>
<div>
<h1>ref reactive 函数</h1>
<h1>姓名:{{name_ref.name}}</h1>
<h1>年龄:{{name_ref.age}}</h1>
</div>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const boy = {
name: '.',
age: 10
}
const name_ref = ref(boy)
console.log(name_ref)
return { name_ref }
}
}
</script>

我们先看一下对象被 ref 函数包裹后的数据结构。

所以说,对象而言,我们修改也是通过 value 进行操作。

<template>
<div>
<h1>ref reactive 函数</h1>
<h1>姓名:{{name_ref.name}}</h1>
<h1>年龄:{{name_ref.age}}</h1>
<el-button type="primary" @click="btn">修改名字</el-button>
</div>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const boy = {
name: '.',
age: 10
}
const name_ref = ref(boy)
console.log(name_ref)
const btn = () => {
name_ref.value.name = '我是.' // 对响应式数据的value进行操作
name_ref.value.age = 11 // 对响应式数据的value进行操作
}
return { name_ref, btn }
}
}
</script>

保存代码,刷新页面,查看效果。



看到名称和年龄都被成功修改了。

当然了,对于数组的操作也是一样的啦!

<template>
<div>
<h1>ref reactive 函数</h1>
<h1>姓名:{{name_ref[0]}}</h1>
<h1>年龄:{{name_ref[1]}}</h1>
<el-button type="primary" @click="btn">修改名字</el-button>
</div>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const boy = ['.', 10]
const name_ref = ref(boy)
const btn = () => {
name_ref.value[0] = '我是.' // 对响应式数据的value进行操作
name_ref.value[1] = 11 // 对响应式数据的value进行操作
}
return { name_ref, btn }
}
}
</script>

保存查看,一样的效果。

ref 函数获取单个DOM元素

和 vue2 一样,可以使用 ref 获取元素,用法和操作数据类型相似。

页面上有一个标签,点击按钮,获取标签的相关数据。

<template>
<div>
<h1>ref reactive 函数</h1>
<p style="color: blue;" ref="boy">我是.</p>
<el-button type="primary" @click="btn">获取元素</el-button>
</div>
</template>
<script>
import { ref, onMounted } from 'vue'
export default {
setup() {
let boy = ref();
const btn = () => {
console.log(boy)
console.log(boy.value)
console.log(boy.value.innerText)
console.log(boy.value.style.color)
}
return {boy, btn }
}
}
</script>

刷新查看运行效果。

其他相关方法

isRef

判断是否为 ref 对象。

<script>
import { ref, isRef } from 'vue'
export default {
setup() {
const a = ref('a')
const b = 'b'
console.log(isRef(a)) // true
console.log(isRef(b)) // false
}
}
</script>

unref

如果参数为 ref,则返回内部值,否则返回参数本身。

val = isRef(val) ? val.value : val

上边代码可以看懂吧?

<script>
import { ref, unref } from 'vue'
export default {
setup() {
const temp = ref(3)
const newTemp = unref(temp) // newTemp 确保现在是数字类型 3
const a = unref(1) // a 确保现在是数字类型 1
console.log(newTemp, a)
}
}
</script>

好了,这是 ref 函数和与其常见的相关的其他函数相关的知识点内容,到此为止吧,有其他的可以自己在研究一下。

reactive 函数介绍

上面说了 ref 函数的基本用法,接下来是 reactive 函数,它的用法与 ref 函数的用法相似,也是将数据变成响应式数据,当数据发生变化时UI也会自动更新。不同的是 ref 用于基本数据类型,而 reactive 是用于复杂数据类型,所以说,不建议用 ref 函数来处理复杂数据类型的原因就是,有 reactive 来处理复杂类型数据。

reactive 函数使用

用完了 ref 函数,那 reactive 函数就很好理解了哈。

ref 函数处理对象

还是, reactive 函数用来处理数组或者是对象,我们还是写一个案例,操作人的基本信息。

我们还是先打印一下用 reactive 函数包裹后的数据结构。

<template>
<div>
<h1>ref reactive 函数</h1>
<p>姓名:{{boy_reactive.name}}</p>
<p>年龄:{{boy_reactive.age}}</p>
</div>
</template>
<script>
import { reactive } from 'vue'
export default {
setup() {
const boy = {
name: '我是.',
age: 10
}
const boy_reactive = reactive(boy)
console.log(boy_reactive)
return { boy_reactive }
}
}
</script>



有打印的结果我们可以看见,这时候的数据就不是被包裹在 value 下面了,所以说我们可以直接获取到。

<template>
<div>
<h1>ref reactive 函数</h1>
<p>姓名:{{boy_reactive.name}}</p>
<p>年龄:{{boy_reactive.age}}</p>
<el-button type="primary" @click="btn">修改信息</el-button>
</div>
</template>
<script>
import { reactive } from 'vue'
export default {
setup() {
const boy = {
name: '我是.',
age: 10
}
const boy_reactive = reactive(boy)
const btn = () => {
boy_reactive.name = '.'
boy_reactive.age = 11
}
return { boy_reactive, btn }
}
}
</script>

保存刷新,查看效果。

ref 函数处理数组

处理数组的方式和处理对象的方式是一样一样的。

直接上代码:

<template>
<div>
<h1>ref reactive 函数</h1>
<p>姓名:{{boy_reactive[0]}}</p>
<p>年龄:{{boy_reactive[1]}}</p>
<el-button type="primary" @click="btn">修改信息</el-button>
</div>
</template>
<script>
import { reactive } from 'vue'
export default {
setup() {
const boy = ['我是.', 10]
const boy_reactive = reactive(boy)
const btn = () => {
boy_reactive[0] = '.'
boy_reactive[1] = 11
}
return { boy_reactive, btn }
}
}
</script>



我们可以看到效果是一样的。

好了,今天内容就到这里吧,该休息了,下篇博客主要说一下 toRef 和 toRefs 函数的使用。

好的,就到这里,拜了个拜!

# vue3 ref 和 reactive 函数的更多相关文章

  1. Vue3.0工程创建 && setup、ref、reactive函数 && Vue3.0响应式实现原理

    1 # 一.创建Vue3.0工程 2 # 1.使用vue-cli创建 3 # 官方文档: https://cli.vuejs.org/zh/guide/creating-a-project.html# ...

  2. vue3函数setUp和reactive函数详细讲解

    1 setUp的执行时机 我们都知道,现在vue3是可以正常去使用methods的. 但是我们却不可以在setUp中去调用methods中的方法. 为什么了??? 我们先了解一下下面这两个生命周期函数 ...

  3. 认真总结Vue3中ref与reactive区别和isRef与isReactive 类型判断

    1.什么是ref? 1.ref和reactive-样 也是用来实现响应式数据的方法 由于reactive必须传递一个对象, 所以导致在企业开发中如果我们只想让某个变量实现响应式的时候会非常麻烦 所以V ...

  4. # Vue3 toRef 和 toRefs 函数

    Vue3 toRef 和 toRefs 函数 上一篇博文介绍了 vue3 里面的 ref 函数和 reactive 函数,实现响应式数据,今天主要来说一下 toRef 函数和 toRefs 函数的基本 ...

  5. 第三十九篇:Vue3 watch(ref和reactive的监视)

    好家伙, 1.vue2中的watch是调用配置项,(只能写一个) vue3中的watch是一个函数(可以写很多个) 2.watch一些用法: 这里是定义的数据 set up(){ let sum =r ...

  6. 熬夜讲解vue3组合API中setup、 ref、reactive的用法

    1.初识setUp的使用 简单介绍下面的代码功能: 使用ref函数,去使用监听某一个变量的变化,并且把它渲染到视图上. setUp函数是组合API的入口函数.这个是非常重要的. setUp可以去监听变 ...

  7. # Vue3 setup 函数

    Vue3 setup 函数 vue2 和 vue3 开发的区别 首先,目前来说 vue3 发布已经有一段时间了,但是呢,由于还处于优化完善阶段,对于 vue3 开发项目的需求不是很高,主要还是以 vu ...

  8. 想知道Vue3与Vue2的区别?五千字教程助你快速上手Vue3!

    从Vue3发布以来,我就一直对其非常感兴趣,就一直想着将其投入公司的生产中,但是开始考虑到很多不确定性就暂时对一些很小的功能进行一些尝试:慢慢的发现组合式Api的形式非常适合开发(个人感觉),尤其是V ...

  9. Vue3响应式系统api 之 ref reactive

    reactive 接收一个普通对象然后返回该普调对象的响应式代理.等同于2.x的  Vue.observable() Vue3中响应数据核心是 reactive , reactive 中的实现是由 P ...

随机推荐

  1. 2021.08.30 前缀函数和KMP

    2021.08.30 前缀函数和KMP KMP算法详解-彻底清楚了(转载+部分原创) - sofu6 - 博客园 (cnblogs.com) KMP算法next数组的一种理解思路 - 挠到头秃 - 博 ...

  2. 2021.08.09 P4868 Preprefix sum(树状数组)

    2021.08.09 P4868 Preprefix sum(树状数组) P4868 Preprefix sum - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 前缀和(pr ...

  3. 国产化之 .NET Core 操作达梦数据库DM8的两种方式

    背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,数据库使用达梦V8,CPU平台的范围包括x64.龙芯.飞腾.鲲鹏等.考虑到这些基础产品对.NET的支持,最终选择了.NET Core ...

  4. 我的树莓派 Raspberry Pi Zero 2W 折腾笔记,记录一些遇到的问题和解决办法

    0x00 前言说明 最近买了一块Raspberry Pi Zero 2W来玩,目的是想搭建一台远程运行的个人服务器,上面放个博客.点个灯啥的.于是就有了这篇文章. 树莓派官网地址:https://ww ...

  5. VS2008的安装

    1.先下载好VS008 方法1:  百度  搜 Visual Studio Team System 2008 Team Suite(90 天试用版) 方法2:直接在地址栏填入  http://www. ...

  6. 项目完成 - 基于Django3.x版本 - 开发部署小结

    前言 最近因为政企部门的工作失误,导致我们的项目差点挂掉,客户意见很大,然后我们只能被动进入007加班状态,忙得嗷嗷叫,直到今天才勉强把项目改完交付,是时候写一个小结. 技术 因为前期需求不明确,数据 ...

  7. BootstrapBlazor实战 Menu 导航菜单使用(1)

    实战BootstrapBlazorMenu 导航菜单的使用, 以及整合Freesql orm快速制作菜单项数据库后台维护页面 demo演示的是Sqlite驱动,FreeSql支持多种数据库,MySql ...

  8. /proc/meminfo 解释

  9. Barbican密钥管理器服务

    Barbican服务介绍 Key Manager 服务 (barbican) 提供机密数据的安全存储.配置和管理.这包括密钥材料,例如对称密钥.非对称密钥.证书和原始二进制数据. Barbican 是 ...

  10. 面试官:RocketMQ是什么,它有什么特性与使用场景?

    哈喽!大家好,我是小奇,一位热爱分享的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 作为一名Java程序员,Roc ...