Vue3.0教程004:ref和reactive对比

news/2025/1/31 6:27:49 标签: javascript, vue.js, 前端

文章目录

    • 3.4 ref创建基本类型的响应式数据
    • 3.5 reactive创建对象类型响应数据
    • 3.6 ref创建对象类型的响应式数据
    • 3.7 ref对比reactive

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

script中引入ref

import {ref} from 'vue';

需要哪个数据是响应式的,就用ref包裹哪个数据:

// 数据
let name = ref('张三'); // 此时的name是响应式的
let age = ref(18); // 此时的age是响应式的

注意:这个时候通过方法修改nameage的值的时候,不能通过name='李四'age += 实现,会报错,因为真实的值是存放在value中的,需要通过name.valueage.value来实现。但是模板中不需要通过{{name.value}}实现,因为模板会自动获取.value值。

在这里插入图片描述

修改nameage的方法

function changeName() {
    name.value = '李四';
}

function changeAge() {
    age.value += 1;
}

刷新浏览器,可以实现nameage的修改:

在这里插入图片描述

注意:这里强调的是基本类型响应式数据。

  • 因为name='张三'age=18都是基本类型。

3.5 reactive创建对象类型响应数据

引入reactive

import {reactive} from "vue";

ref类似,哪个数据是响应数据,就用reactive包裹:

let car = reactive({
        brand: '凯迪拉克',
        price: 100,
    })

    let games = reactive([
        {
            id: '01',
            name: '王者荣耀'
        },
        {
            id: '02',
            name: '冲就完事模拟器'
        }
    ])

完整代码:

<template>
    <div class="car">
        <h2>一辆{{car.brand}},价值{{car.price}}</h2>
        <button @click="changePrice">修改汽车价格</button>
        <br />
        <h2>游戏列表</h2>
        <ul>
            <li v-for="game in games" :key="game.id">
                {{game.name}}
            </li>
        </ul>
        <button @click="changeFirstGameName">修改第一个游戏名字</button>
    </div>
</template>

<!--配置组件名-->
<script lang="ts">
// JS/TS
export default {
    name: 'Car',
}
</script>

<!--配置组合式API-->
<script lang="ts" setup>
    import {reactive} from "vue";

    let car = reactive({
        brand: '凯迪拉克',
        price: 100,
    })

    let games = reactive([
        {
            id: '01',
            name: '王者荣耀'
        },
        {
            id: '02',
            name: '冲就完事模拟器'
        }
    ])

    console.log(car);

    function changePrice(){
        car.price += 10;
    }

    function changeFirstGameName(){
        games[0].name = '魂斗罗';
    }
</script>

<style scoped>
/* 样式 */
.car {
    background-color: skyblue;
    box-shadow: 0 0 10px;
    border-radius: 10px;
    padding: 20px;
}

button {
    margin: 0 5px;
}

li{
    font-size: 20px;
}
</style>

实现效果:

在这里插入图片描述

注意:reactive只能定义对象类型的响应式数据。

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

值得注意的是,【修改汽车价格】和【修改游戏名字】的函数中,要使用.value修改属性的值:

function changePrice(){
    car.value.price += 10;
}

function changeFirstGameName(){
    games.value[0].name = '魂斗罗';
}

完整代码:

<template>
    <div class="car">
        <h2>一辆{{car.brand}},价值{{car.price}}</h2>
        <button @click="changePrice">修改汽车价格</button>
        <br />
        <h2>游戏列表</h2>
        <ul>
            <li v-for="game in games" :key="game.id">
                {{game.name}}
            </li>
        </ul>
        <button @click="changeFirstGameName">修改第一个游戏名字</button>
    </div>
</template>

<!--配置组件名-->
<script lang="ts">
// JS/TS
export default {
    name: 'Car',
}
</script>

<!--配置组合式API-->
<script lang="ts" setup>
    import {ref} from "vue";

    let car = ref({
        brand: '凯迪拉克',
        price: 100,
    })

    let games = ref([
        {
            id: '01',
            name: '王者荣耀'
        },
        {
            id: '02',
            name: '冲就完事模拟器'
        }
    ])

    function changePrice(){
        car.value.price += 10;
    }

    function changeFirstGameName(){
        games.value[0].name = '魂斗罗';
    }
</script>

<style scoped>
/* 样式 */
.car {
    background-color: skyblue;
    box-shadow: 0 0 10px;
    border-radius: 10px;
    padding: 20px;
}

button {
    margin: 0 5px;
}

li{
    font-size: 20px;
}
</style>

3.7 ref对比reactive

宏观角度看:

  1. ref用来定义:基本类型数据、对象类型数据
  2. reactive用来定义:对象类型数据

区别:

  1. ref创建的变量必须使用.value
  2. reactive重新分配一个新对象,会失去响应式

使用原则:

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

http://www.niftyadmin.cn/n/5838394.html

相关文章

“星门计划对AI未来的意义——以及谁将掌控它”

“星门计划对AI未来的意义——以及谁将掌控它” 图片由DALL-E 3生成 就在几天前&#xff0c;唐纳德特朗普宣布了“星门计划”&#xff0c;OpenAI随即跟进&#xff0c;分享了更多细节。他们明确表示&#xff0c;计划在未来四年内投资5000亿美元&#xff0c;在美国为OpenAI构建一…

Deepseek本地部署(ollama+open-webui)

ollama 首先是安装ollama&#xff0c;这个非常简单 https://ollama.com/ 下载安装即可 open-webui 这个是为了提供一个ui&#xff0c;毕竟我们也不想在cmd和模型交互&#xff0c;很不方便。 第一&#xff0c;需要安装python3.11&#xff0c;必须是3.11&#xff08;其他版…

windows10 配置使用json server作为图片服务器

步骤1&#xff1a;在vs code中安装json server, npm i -g json-server 注意&#xff1a;需要安装对应版本的json server&#xff0c;不然可能会报错&#xff0c;比如&#xff1a; npm i -g json-server 0.16.3 步骤2&#xff1a;出现如下报错&#xff1a; json-server 不是…

【Postman接口测试】Postman的安装和使用

在软件测试领域&#xff0c;接口测试是保障软件质量的关键环节之一&#xff0c;而Postman作为一款功能强大且广受欢迎的接口测试工具&#xff0c;能够帮助测试人员高效地进行接口测试工作。本文将详细介绍Postman的安装和使用方法&#xff0c;让你快速上手这款工具。 一、Pos…

基于阿里云百炼大模型Sensevoice-1的语音识别与文本保存工具开发

基于阿里云百炼大模型Sensevoice-1的语音识别与文本保存工具开发 摘要 随着人工智能技术的不断发展&#xff0c;语音识别在会议记录、语音笔记等场景中得到了广泛应用。本文介绍了一个基于Python和阿里云百炼大模型的语音识别与文本保存工具的开发过程。该工具能够高效地识别东…

oracle中使用in 和 not in 查询效率分析

在Oracle数据库中&#xff0c;IN和NOT IN的查询效率受多种因素影响&#xff0c;以下是关键点总结和优化建议&#xff1a; 1. IN 的效率 优化方式&#xff1a; IN 通常会被优化为 OR条件 或 半连接&#xff08;Semi-Join&#xff09;&#xff0c;如果子查询关联到外部表&#x…

[免费]微信小程序智能商城系统(uniapp+Springboot后端+vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序智能商城系统(uniappSpringboot后端vue管理端)&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序智能商城系统(uniappSpringboot后端vue管理端) Java毕业设计_哔哩哔哩_bilibili 项目介绍…

Excel 技巧22 - Ctrl+D 向下复制(★★),复制同间距图形

本文讲Excel中CtrlD 向下复制的用法。 这个是我特别喜欢和常用的功能&#xff0c;操作简单&#xff0c;功能强大。 1&#xff0c;CtrlD向下复制 1-1&#xff0c;单个单元格复制 最为常用的就是一个单元格的&#xff0c;就像下面这样的&#xff0c;也不用选中&#xff0c; 就…