Vue3学习(组合式API——reactive()和ref()函数详解)

目录

一、reactive()函数。

(1)介绍与使用。

(2)简单案例演示。

二、ref()函数。

(1)介绍与使用。

(2)简单案例演示。

<1>ref()函数获取响应式对象的本质与底层。

<2>基于简单类型或对象类型数据ref()构建响应式对象演示。

三、reactive()与ref()函数小结。


一、reactive()函数。

(1)介绍与使用。
  • 官方解释:返回一个对象的响应式代理。

  • 基本作用:接收对象类型 数据的参数传入并返回一个响应式对象。之所以学这个函数是因为在Vue中默认的数据并不是响应式的。希望得到的是响应式的数据就需要通过函数reactive()或ref()进行处理。

  • 核心使用步骤:
  • 1、导入reactive()函数。
  • 2、执行reactive()函数并传入类型为对象的初始值,并使用变量接收返回值。
(2)简单案例演示。
  • 代码。
html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <div>{{state}}</div>
        <div>-----------------------</div>
        <div>{{state.count}}</div><button @click="changeCount">count++</button>
    </div>
    <script type="module">
        import { createApp, reactive } from './vue.esm-browser.js'
        createApp({
            setup() {
                //reactive接收一个对象类型的数据,返回一个响应式的对象
                const state = reactive({
                    count: 100
                })
                const changeCount = () => {
                    state.count++
                }
                return {
                    state,
                    changeCount
                }

            }
        }).mount('#app')
    </script>
</body>

</html>

  • 效果。

  • reactive()必须接收对象类型的数据!
  • 如果接收简单类型数据又希望它是响应式,就需要使用函数ref()。

二、ref()函数。

(1)介绍与使用。
  • 官方解释:接受一个内部值,返回一个响应式的、可更改的 ref 对象。此对象只有一个指向其内部值的属性 .value。

  • 基本作用:接收简单类型对象类型 的数据传入,并返回一个响应式的对象

  • 核心使用步骤:
  • 1、导入ref()函数。
  • 2、执行ref()函数并传入初始值(简单类型或对象类型),并使用变量接收ref()函数的返回值。
(2)简单案例演示。
<1>ref()函数获取响应式对象的本质与底层。
  • 本质:在原有传入数据的基础上,外层包了一层对象,包成复杂类型。
  • 底层:包成复杂类型之后,再借助reactive()函数实现了响应式!
  • 脚本中访问数据,需要通过.value。

  • 代码示例。
html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <div>{{state}}</div> <!-- 插值表达式中不需要使用.value -->
    </div>
    <script type="module">
        import { createApp, ref } from './vue.esm-browser.js'
        createApp({
            setup() {
                //ref接收简单类型或对象类型的数据,返回一个响应式的对象
                //本质:在原有传入的数据基础上包了一层对象
                const state = ref(0)
                console.log(state)
                console.log(state.value)
                return {
                    state
                }
            }
        }).mount('#app')
    </script>
</body>

</html>

  • 效果。

<2>基于简单类型或对象类型数据ref()构建响应式对象演示。
  • 代码。
html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <!-- 插值表达式中不需要使用.value -->
        <div>{{state}}</div><button @click="changeCount">count++</button>
        <div>-----------------------</div>
        <div>{{userInfo}}</div>
    </div>
    <script type="module">
        import { createApp, ref } from './vue.esm-browser.js'
        createApp({
            setup() {
                //ref接收简单类型或对象类型的数据,返回一个响应式的对象
                const userInfo = ref({
                    name: 'zs',
                    age: 18
                })
                //本质:在原有传入的数据基础上包了一层对象
                const state = ref(0)
                console.log(state)
                const changeCount = () => {
                    state.value++  //脚本中使用.value访问值
                    console.log(state.value)
                }
                return {
                    state,
                    userInfo,
                    changeCount
                }

            }
        }).mount('#app')
    </script>
</body>

</html>

  • 效果。

三、reactive()与ref()函数小结。

  1. reactive和ref函数的共同特点:使用函数调用的方式生成响应式数据!
  2. reactive不能处理简单类型的数据。
  3. ref参数类型支持更多,但脚本中必须通过.value访问修改。
  4. ref函数内部实现依赖于reactive函数。
  5. 推荐:声明数据统一使用ref(),更加灵活且统一。
相关推荐
musk12123 分钟前
electron 打包太大 试试 tauri , tauri 安装打包demo
前端·electron·tauri
翻滚吧键盘32 分钟前
js代码09
开发语言·javascript·ecmascript
万少1 小时前
第五款 HarmonyOS 上架作品 奇趣故事匣 来了
前端·harmonyos·客户端
OpenGL1 小时前
Android targetSdkVersion升级至35(Android15)相关问题
前端
rzl021 小时前
java web5(黑马)
java·开发语言·前端
Amy.Wang1 小时前
前端如何实现电子签名
前端·javascript·html5
海天胜景1 小时前
vue3 el-table 行筛选 设置为单选
javascript·vue.js·elementui
今天又在摸鱼1 小时前
Vue3-组件化-Vue核心思想之一
前端·javascript·vue.js
蓝婷儿1 小时前
每天一个前端小知识 Day 21 - 浏览器兼容性与 Polyfill 策略
前端
百锦再2 小时前
Vue中对象赋值问题:对象引用被保留,仅部分属性被覆盖
前端·javascript·vue.js·vue·web·reactive·ref