Vue-响应式数据

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

vue3可以使用ref、reactive去定义响应式数数据。

知识点汇总

  • 使用ref需要先引入ref,import {ref} from 'vue'
  • 在模板 template 中使用了添加ref 的响应式数据,变量的后面不用添加.value
  • 所有js代码里面,去操作res包裹的东西,必须要加上 .value
  • 使用ref包裹的变量,都变成了对象,其中不带下划线的value 是提供我们自己使用的。
  • ref可以定义基本类型、对象类型的响应式数据。

这个value中就是真正的变量数据。

Person.vue组件中的代码:

<template>
    <div class="person">
        <!-- 模板里面不用 name.value,自动帮你加上.value -->
        <h2>姓名:{{name}}</h2>
        <h2>年龄:{{age}}</h2>
        <h2>地址:{{address}}</h2>
        <button @click="changeName">修改名字</button> 
        <button @click="changeAge">增加年龄</button>
        <button @click="showTel">查看联系方式</button>
    </div>
</template>

<script setup lang="ts" name="Person">
    //引入ref,所有js代码里面,去操作res包裹的东西,必须要加上 .value
    import {ref} from 'vue' 

    //数据
    let name = ref('张三') // 注意ref是函数
    let age = ref(18) 
    let tel = 13888888888
    let address = '河北 . 邯郸'
    console.log(1,name)
    console.log(2,age)

    //方法
    function changeName(){
        name.value = 'zhang-san' 
        console.log(1,name.value)
    } 
    function changeAge(){
        age.value += 1
        console.log(2,age.value) 
    } 
    function showTel(){
        alert(tel)
    } 
</script>

<style scoped>
    .person{
        background-color: skyblue;
        box-shadow: 0 0 10px;
        border-radius: 10px;
        padding: 20px;
    }
    button{
        margin: 0 5px;
    }
</style>

二、reactive创建对象类型的响应式数据

reactive用于定义对象类型的数据

知识点汇总:

  • 使用reactive()可以把对象类型的数据变成响应式的。
  • 数组也是对象,也可以使用reactive()去包裹数组。
  • reactive定义的对象类型的响应式数据是深层次的。
  • reactive只能定义对象类型的响应式数据。
<template>
    <div class="person">

       <h2>一辆{{car.brand}}价值{{car.price}}</h2>
       <button @click="changePrice">修改汽车的价格</button> 
        <hr>
        <ul>                        <!--:” 就是把 “g.id” 当成js表达式去解析-->
            <li v-for="g in games" :key="g.id">{{g.name}}</li>
        </ul>
        <button @click="changeFirstGame">修改第一个游戏的名字</button>
        
        <hr>
        <h2>测试:{{obj.a.b.c}}</h2>
        <button @click="changeC">修改第一个 c 的数字</button>
    </div>
</template>

<script setup lang="ts" name="Person">
    //引入reactive
    import {reactive} from 'vue'

    //使用 reactive 把car对象 变成响应式的
    //使用reactive(对象类型) 将对象类型的数据  变成响应式的
    let car = reactive({brand:'奔驰',price:100})
    console.log(car) //打印出来对象类型的数据存放在 Target 中
    
    //定义数组,数组也是对象
    //使用reactive(数组) 将数组类型的数据 变成响应式的
    let games = reactive([
        {id:'hjhdjshj01',name:'穿越火线'},
        {id:'hjhdjshj02',name:'王者荣耀'},
        {id:'hjhdjshj03',name:'原神'},
    ])

    //reactive定义的对象类型的响应式数据是深层次的
    let obj = reactive({
        a:{
            b:{
                c:666
            }
        }
    })

    //方法
    function changePrice(){
        car.price += 10
    }

    function changeFirstGame(){
        games[0].name = '恐龙快打'
    }

    //reactive定义的对象类型的响应式数据是深层次的
    function changeC(){
        obj.a.b.c = 777
    }
</script>

<style scoped>
    .person{
        background-color: skyblue;
        box-shadow: 0 0 10px;
        border-radius: 10px;
        padding: 20px;
    }
    button{
        margin: 0 5px;
    }
</style>

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

注意: 使用ref处理对象类型的数据时在js代码中不要忘了加上 .value

ref 处理对象类型的数据底层用的是reactive

<script setup lang="ts" name="Person">
    let car = ref({brand:'奔驰',price:100})
    let car1 = reactive({brand:'奔驰',price:100})
    console.log(car)
    console.log(car1)
</script>

<template>
    <div class="person">

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

<script setup lang="ts" name="Person">
    //引入 ref
    import {ref} from 'vue'

    //使用 ref 把car对象 变成响应式的
    let car = ref({brand:'奔驰',price:100})

    //定义数组,数组也是对象
    let games = ref([
        {id:'hjhdjshj01',name:'穿越火线'},
        {id:'hjhdjshj02',name:'王者荣耀'},
        {id:'hjhdjshj03',name:'原神'},
    ])


    //方法
    function changePrice(){
        car.value.price += 10
    }

    function changeFirstGame(){
        games.value[0].name = '恐龙快打'
    }
 
</script>

<style scoped>
    .person{
        background-color: skyblue;
        box-shadow: 0 0 10px;
        border-radius: 10px;
        padding: 20px;
    }
    button{
        margin: 0 5px;
    }
</style>

四、ref对比reactive

通过Volar插件自动添加 .value

勾选上 Dot Value

如果sum是被 ref() 包裹的数据赋予的,输入sum 便会自动填充.value

知识总结:

  1. reactive 重新分配一个新对象,会失去响应式(可以使用Object.assign去整体替换)。
  2. Object.assign(obj1,obj2,obj3),表示把 obj2、obj3 中的每一组key-value组合都加在 obj1上,obj1原先的内容会被覆盖。
  3. 对于用 reactive 包裹的对象,如果要整体修改对象需要使用Object.assign(obj1,obj2,obj3)
  4. 如果用的是 ref 包裹的对象,可以直接使用对象进行赋值。也是响应式的。
  5. ref 带 .value 必然是响应式的。

代码示例:

<template>
    <div class="person">

       <h2>一辆{{car.brand}}价值{{car.price}}</h2>
       <button @click="changeBrand">修改汽车的品牌</button>
       <button @click="changePrice">修改汽车的价格</button> 
       <button @click="changeCar">修改汽车</button> 

       <hr>
       <h2>当前求和为:{{sum}}</h2>
       <button @click="changeSum">点我sum+1</button>
    </div>
</template>

<script setup lang="ts" name="Person">
    //引入 ref、reactive
    import {ref,reactive} from 'vue'

    //数据
    let car = ref({brand:'奔驰',price:100})
    let sum = ref(0)

    //方法
    function changePrice(){
        car.value.price += 10
    }

    function changeBrand(){
        car.value.brand = '宝马'
    }

    function changeCar(){
      // 对于 reactive 来说
      // car = {brand:'奥拓',price:1}  //这样修改不了
      // car = reactive({brand:'奥拓',price:1}) //这样也是修改不了的。
      
      // 只有这种写法,才能响应式的修改 car 对象中的内容
      // Object.assign(obj1,obj2,obj3)
      // 把 obj2、obj3 中的每一组key-value组合都加在 obj1,obj1原先的内容会被覆盖
      // Object.assign(car,{brand:'奥拓',price:1}) //reactive的写法
      // 如果用的是 ref 可以直接修改
      car.value = {brand:'奥拓',price:1} 
      // ref 带 .value 必然是响应式的。

    }

    function changeSum(){
        sum.value += 1
       // sum = ref(9)  //这样是不行的
    }
 
</script>

<style scoped>
    .person{
        background-color: skyblue;
        box-shadow: 0 0 10px;
        border-radius: 10px;
        padding: 20px;
    }
    button{
        margin: 0 5px;
    }
</style>

refreactive 的使用建议

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

五、toRefs与toRef

toRefs()、toRef(),就是把一个响应式对象给解构出来,并且解构出来的数据也具备响应式。

代码示例:

<template>
    <div class="person">
        <h2>姓名:{{name}}</h2>
        <h2>年龄:{{age}},{{nl}}</h2>
        <button @click="changeName">修改姓名</button>
        <button @click="changeAge">修改年龄</button>
    </div>
</template>

<script setup lang="ts" name="Person">
    import {reactive,toRefs,toRef} from 'vue'
    
    //数据
    let person = reactive({
        name:'张三',
        age:18 
    })

    //toRefs 的作用: 就是 把一个reactive定义的对象 变成 一个ref定义的对象
    //toRefs(person):此时的 name 和 age 就是响应式的了。
    let {name,age} = toRefs(person)
    
    // let {name,age} = person 相当于以下代码
    // let name = person.name
    // let age = person.age
    // 此时自定义的 name、age 不是响应式的 而 person.name、person.age 这两个是响应式
    
    //toRef
    // 第一个参数是响应式对象,第二个参数是变量名
    let nl = toRef(person,'age')
    console.log(nl) //nl 也是一个 响应式 数据

    // 方法
    function changeName(){
        name.value += '~'
        //自定义 name 里面的值 和 person.name里面的值都会发生改变
        console.log(name.value,person.name)
    }

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

</script>

<style scoped>
    .person{
        background-color: skyblue;
        box-shadow: 0 0 10px;
        border-radius: 10px;
        padding: 20px;
    }
    button{
        margin: 0 5px;
    }
</style>

power by 尚硅谷

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/285370.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

27、web攻防——通用漏洞SQL注入Tamper脚本Base64Jsonmd5

文章目录 数字型&#xff1a;0-9。http;//localhost:8081/blog/news.php?id1 字符型&#xff1a;a-z、中文&#xff0c;需要闭合符号。http;//localhost:8081/blog/news.php?idsimple 搜索型&#xff1a;在字符型的基础上加入了通配符%。http;//localhost:8081/blog/news.…

大数据机器学习GAN:生成对抗网络GAN全维度介绍与实战

文章目录 大数据机器学习GAN&#xff1a;生成对抗网络GAN全维度介绍与实战一、引言1.1 生成对抗网络简介1.2 应用领域概览1.3 GAN的重要性 二、理论基础2.1 生成对抗网络的工作原理2.1.1 生成器生成过程 2.1.2 判别器判别过程 2.1.3 训练过程训练代码示例 2.1.4 平衡与收敛 2.2…

Gin 集成 prometheus 客户端实现注册和暴露指标

前言 当我们构建一个 Web 应用程序时&#xff0c;了解应用程序的性能和行为是非常重要的。Prometheus 是一个流行的开源监控系统&#xff0c;它提供了强大的指标收集和查询功能&#xff0c;可以帮助我们监控应用程序的各个方面。 在 Gin 中集成 Prometheus 可以让我们更方便地监…

vue中的内置指令v-model的作用和常见使用方法以及自定义组件上的用法

一、v-model是什么 v-model是Vue框架的一种内置的API指令&#xff0c;本质是一种语法糖写法&#xff0c;它负责监听用户的输入事件以更新数据&#xff0c;并对一些极端场景进行一些特殊处理。在Vue中&#xff0c;v-model是用于在表单元素和组件之间创建双向数据绑定的指令。它…

0基础学习VR全景平台篇第134篇:720VR全景,云台调整节点

相机、云台和脚架全套设备组装完成后需要进行调校才能开始拍摄。这一节&#xff0c;我们将主要介绍云台调整的两个内容&#xff1a;对中心靶、调三点一线。&#xff08;后附调校原理&#xff09; 云台部件名称 一、调节准备 &#xff08;一&#xff09;对于安装好的云台 1.检…

NAO.99b海潮模型的详解教程

NAO.99b模型是由日本国家天文台开发的全球潮汐模式&#xff0c;基于二维非线性浅水方程。该模型具有较高的分辨率&#xff0c;网格间距为0.50.5&#xff0c;网格数为720360&#xff0c;覆盖的经度范围为0.25&#xff5e;359.75E&#xff0c;纬度范围为89.75S&#xff5e;89.75N…

web前端导航条练习(包含弹性盒)

<!DOCTYPE html> <html lang"en"><head><meta charset"utf-8"><!--设置最佳适配窗口--><meta name"viewpoint" content"widthdevice-width,initial-scale1.0"><meta http-equiv"X-UA-&qu…

Maya-UE xgen-UE 毛发导入UE流程整理

首先声明&#xff1a;maya建议用2022版本及一下&#xff0c;因为要用到Python 2 ,Maya2023以后默认是Python3不再支持Python2; 第一步&#xff1a;Xgen做好的毛发转成交互式Groom 第二步&#xff1a;导出刚生成的交互式Groom缓存&#xff0c;需要设置一下当前帧&#xff0c;和…

Vue3复习笔记

目录 挂载全局属性和方法 v-bind一次绑定多个值 v-bind用在样式中 Vue指令绑定值 Vue指令绑定属性 动态属性的约束 Dom更新时机 ”可写的“计算属性 v-if与v-for不建议同时使用 v-for遍历对象 数组变化检测 事件修饰符 v-model用在表单类标签上 v-model还可以绑定…

钱数加s还是不加s?

语法 看有没有数字 有数字&#xff1a;无s 没数字&#xff1a;有s 案例

迅为龙芯2K1000开发板虚拟机 ubuntu 更换下载源

Ubuntu 系统软件的下载安装我们通常使用命令“apt-get” &#xff0c; 该命令可以实现软件自动下载&#xff0c; 安装&#xff0c; 配置。 该命令采用客户端/服务器的模式&#xff0c; 我们的 Ubuntu 系统作为客户端&#xff0c; 当需要下载软件的时候就向服务器发起请求&#…

(十)上市企业实施IPD成功案例分享之——IBM

集成产品开发&#xff08;Integrated Product Development&#xff0c;简称IPD&#xff09;是一套产品开发的模式、理念与方法。IPD的思想来源于美国PRTM公司出版的《产品及生命周期优化法》。IPD强调以市场和客户需求作为产品开发的驱动力&#xff0c;IPD将产品开发作为一项投…

SCT2601,可替代LMR16006X/MP2459/MP2456;4.5V-60V Vin,0.6A,高效降压DCDC转换器

•宽输入范围&#xff1a;4.5V-60V •高达0.6A的连续输出电流 •0.765V2.5%反馈参考电压 •集成500mΩ高压侧MOSFET •低静态电流为80uA •轻负载下的脉冲跳过模式&#xff08;PSM&#xff09; •最小接通时间80ns •内置6ms软启动时间 •开关频率为700KHz •可编程输入电压欠压…

pendulum,一个超酷的 Python 库!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超酷的 Python 库 - pendulum。 Github地址&#xff1a;https://github.com/sdispater/pendulum 日期和时间处理在许多应用程序中都是常见的任务&#xff0c;然而&#xff0c;Python标准库中的…

2024年Mac专用投屏工具AirServer 7 .27 for Mac中文版

AirServer 7 .27 for Mac中文免费激活版是一款Mac专用投屏工具&#xff0c;能够通过本地网络将音频、照片、视频以及支持AirPlay功能的第三方App&#xff0c;从 iOS 设备无线传送到 Mac 电脑的屏幕上&#xff0c;把Mac变成一个AirPlay终端的实用工具。 目前最新的AirServer 7.2…

.net8 AOT编绎-跨平台调用C#类库的新方法-函数导出

VB.NET AOT无法编绎DLL,微软的无能&#xff0c;正是你的机会 .net8 AOT编绎-跨平台调用C#类库的新方法-函数导出 1&#xff0c;C#命令行创建工程&#xff1a;dotnet new classlib -o CSharpDllExport 2&#xff0c;编写一个静态方法&#xff0c;并且为它打上UnmanagedCallersO…

Ubuntu开机自启动文件

开机自启动文件 Ubuntu 系统启动时运行的文件 /etc/rc.local 创建/etc/rc.local文件 sudo touch /etc/rc.local给rc.local添加可执行权限 sudo chmod 777 /etc/rc.local编辑/etc/rc.local文件&#xff0c;将start.py脚本的运行写入 sudo vim /etc/rc.local#!/bin/bash # d…

python多环境管理工具——pyenv-win安装与使用教程

目录 pyenv-win简介 pyenv-win安装 配置环境变量 pyenv的基本命令 pyenv安装py环境 pyenv安装遇到问题 pycharm测试 pyenv-win简介 什么是pyenv-win&#xff1a; 是一个在windows系统上管理python版本的工具。它是pyenv的windows版本&#xff0c;旨在提供类似于unix/li…

基于图论的图像分割 python + PyQt5

数据结构大作业&#xff0c;基于图论中的最小生成树的图像分割。一个很古老的算法&#xff0c;精度远远不如深度学习算法&#xff0c;但是对于代码能力是一个很好的锻炼。 课设要求&#xff1a; &#xff08; 1 &#xff09;输入&#xff1a;图像&#xff08;例如教室场景图&a…

LeetCode74二分搜索优化:二维矩阵中的高效查找策略

题目描述 力扣地址 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&…