Vue--》vue3中的计算属性与监视的使用讲解

news2024/9/22 7:09:48

computed函数

与Vue2.x中的computed配置功能一致,只不过在Vue3.x中我们需要按需导入该函数。因为Vue3.x是向下兼容Vue2语法的,所以我们可以写成既有 setup 又有 Vue2中的computed函数,如下代码示例:

<template>
  <h1>个人信息</h1>
  姓:<input type="text" v-model="person.firstName"><br><br>
  名:<input type="text" v-model="person.lastName"><br><br>
  全名:<span>{{fullName}}</span>
</template>
<script>
import { reactive } from 'vue';
export default {
  computed:{
    fullName(){
      return this.person.firstName+ '-' + this.person.lastName
    }
  },
  setup(){
    // 数据
    let person = reactive({
      firstName:'张',
      lastName:'三'
    })
    // 返回对象出去
    return {
      person
    }
  }
}
</script>

这种既有Vue2又有Vue3的语法显然是不合适的,从开发者工具我们也看出来,setup和computed并列。如下图所示:

在Vue3的做法是将计算属性按需导入,在setup内部进行使用,如下:

<template>
  <h1>个人信息</h1>
  姓:<input type="text" v-model="person.firstName"><br><br>
  名:<input type="text" v-model="person.lastName"><br><br>
  全名:<span>{{person.fullName}}</span><br><br>
  全面:<input type="text" v-model="person.fullName">
</template>
<script>
import { reactive,computed } from 'vue';
export default {
  setup(){
    // 数据
    let person = reactive({
      firstName:'张',
      lastName:'三'
    })

    // 计算属性的简写方式(只能读)
    // person.fullName = computed(()=>{
    //   return person.firstName+ '-' + person.lastName
    // })

    // 计算属性的完整方式(读写)
    person.fullName = computed({
      get(){
        return person.firstName+ '-' + person.lastName
      },
      set(value){
        const nameStr = value.split('-')
        person.firstName = nameStr[0]
        person.lastName = nameStr[1]
      }
    })
    // 返回对象出去
    return {
      person
    }
  }
}
</script>

watch函数

在Vue3中watch监听ref定义的数据,在按需导入watch后,watch函数能接收三个参数:第一个参数是监视对象;第二个参数是监视的回调函数;第三个是监视的配置属性。如下:

<template>
  <h2>当前的值为:{{num}}</h2>
  <button @click="num++">点击+1</button>
  <br>
  <br>
  <h2>当前的信息为:{{say}}</h2>
  <button @click="say+='!'">加感叹号!</button>
</template>

<script>
import { ref,watch } from 'vue';
export default {
  setup () {
    // 数据
    let num = ref(0)
    let say = ref('Hello World')
    
    watch([num,say],(newValue,oldValue)=>{
      console.log('num或say值变了',newValue,oldValue);
    },{immediate:true})
    // 返回对象
    return {
      num,say,watch
    }
  }
}
</script>

当监视reactive所定义的一个响应式数据的全部属性时,是无法正确的获取到oldValue的,默认是强制开启了深度监听,所以即使你把深度监听关掉也是不奏效的,如下:

<template>
  <h2>姓名:{{person.name}}</h2>
  <h2>年龄:{{person.age}}</h2>
  <h2>秘密:{{person.privacy.secret.msg}}</h2>
  <button @click="person.age+=1">年龄+1</button>
  <button @click="person.privacy.secret.msg+='--被我看到了'">查看秘密</button>
</template>

<script>
import { reactive,watch } from 'vue';
export default {
  setup () {
    // 数据
    let person = reactive({
      name:'张三',
      age:18,
      privacy:{
        secret:{
          msg:'这是我的秘密'
        }
      }
    })
    watch(person,(newValue,oldValue)=>{
      console.log('person变化了',newValue,oldValue);
    },{deep:false})
    // 返回对象
    return {
      person
    }
  }
}
</script>

如果想监视reactive所定义的一个响应式数据中的某个或某些属性,可以通过如下方式进行:

<template>
  <h2>姓名:{{person.name}}</h2>
  <h2>年龄:{{person.age}}</h2>
  <h2>秘密:{{person.privacy.secret.msg}}</h2>
  <button @click="person.name+='-'">修改名字</button>
  <button @click="person.age+=1">年龄+1</button>
</template>

<script>
import { reactive,watch } from 'vue';
export default {
  setup () {
    // 数据
    let person = reactive({
      name:'张三',
      age:18,
      privacy:{
        secret:{
          msg:'这是我的秘密'
        }
      }
    })
    // 监听person中name和age的变化
    watch([()=>person.name,()=>person.age],(newValue,oldValue)=>{
      console.log('person中的name和age变化了',newValue,oldValue);
    })
    // 返回对象
    return {
      person
    }
  }
}
</script>

如果想拿到reactive函数中深层次的属性,即reactive函数中某个对象的属性,这时候就需要借助深度监视 deep 了,而且deep有效,如下:

<template>
  <h2>姓名:{{person.name}}</h2>
  <h2>年龄:{{person.age}}</h2>
  <h2>秘密:{{person.privacy.secret.msg}}</h2>
  <button @click="person.name+='-'">修改名字</button>
  <button @click="person.age+=1">年龄+1</button>
  <button @click="person.privacy.secret.msg+='--'">查看秘密</button>
</template>

<script>
import { reactive,watch } from 'vue';
export default {
  setup () {
    // 数据
    let person = reactive({
      name:'张三',
      age:18,
      privacy:{
        secret:{
          msg:'这是我的秘密'
        }
      }
    })
    // 监听person中name和age的变化
    watch(()=>person.privacy,(newValue,oldValue)=>{
      console.log('person中的privacy变化了',newValue,oldValue);
    },{deep:true}) // 由于监视的是reactive函数定义的某个对象中的属性,deep配置有效

    // 返回对象
    return {
      person
    }
  }
}
</script>

虽然我们监听到了值的变化,但是还是拿不到旧值,所以说白了,对于Vue3中的watch函数来说,在对象中是拿不到旧值的。如下:

watcrEffect函数

watch的套路是:既要指明监视的属性,也要指明监视的回调;watchEffect的套路是:不用指明监视哪个属性,监视的回调中用到哪个属性,那就监视哪个属性。

watchEffect有点像computed :
但computed注重的计算出来的值(回调函数的返回值),所以必须要写返回值。
watchEffect更注重的是过程(回调函数的函数体),所以不用写返回值。
<script>
import { reactive,watchEffect } from 'vue';
export default {
  setup () {
    // 数据
    let person = reactive({
      name:'张三',
      age:18,
      privacy:{
        secret:{
          msg:'这是我的秘密'
        }
      }
    })
    // 监视
    watchEffect(()=>{
      const p1 = person.name
      const p2 = person.privacy.secret.msg
      console.log('watchEffect所指定的回调执行了');
    })
    // 返回对象
    return {
      person
    }
  }
}
</script>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IIC(I2C)协议详解

1.简介IIC,即IC&#xff0c;全称 Inter-Integrated Circuit&#xff0c;字面上的意思是集成电路之间&#xff0c;它其实是IC Bus简称&#xff0c;所以中文应该叫 集成电路总线 &#xff0c;它是一种串行通信总线&#xff0c;使用多主从架构&#xff0c;由飞利浦公司在1980年代为…

魔兽世界服务端源码各个重要文件详细情况说明——魔兽世界开服

魔兽服务端开服源文件各文件翻译很多文件在服务器中我们知道是跟什么有关&#xff0c;但就是不知道其作用是什么。就算我们知道在这些地方中的文件都是有着不小的作用。但是由于不知道各个文件代表的是什么意思所以在面对这些文件的时候都会有无从下手的感觉&#xff0c;所以今…

云渲染市场安全吗?

云渲染虽然在3D制作行业已经日益普及&#xff0c;但仍有人持观望态度&#xff1a;云渲染市场安全吗&#xff1f;使用云渲染是否能够保证我的数据安全、财产安全等问题&#xff0c;今天小编就来跟大家探讨一下这个问题。首先&#xff0c;在解答云渲染市场是否安全这个问题之前&a…

MobarX远程登录虚拟机

环境&#xff1a;宿主机WIN10&#xff0c;virtualBox安装的ubuntu16&#xff1b; 前提条件&#xff1a;宿主机和ubuntu能够互相ping通&#xff1b; 步骤&#xff1a; 第一步&#xff1a;添加网卡类型为“仅主机的网络”&#xff08;MobarX登录Ubuntu需要的网卡&#xff09; …

Session详解,学习Session(包含底层分析和使用)

什么是sessionsession在网络应用中称为“会话控制”&#xff0c;是服务器为了保存用户状态而创建的一个特殊的对象。简而言之&#xff0c;session就是一个对象&#xff0c;用于存储信息。 session和cookie的比较 cookie保存在客户端&#xff0c;session保存在服务端cookie作用于…

2023企业在媒体邀约的过程中应该注意哪些细节

很多企业在发展壮大之后&#xff0c;都会成立自己的品牌公关部&#xff0c;来进行日常公关的维护工作&#xff0c;这就需要邀请大量的媒体资源和媒体人脉来进行邀约&#xff0c;企业通常会邀请那些服务好、资深的媒介机构&#xff0c;进行明确的分工&#xff0c;从而完成每一场…

廉颇未老,VB语言迎来春天,中文编程也绝处逢生

“VB语言过时了&#xff0c;早就淘汰了”&#xff0c;不少程序员认为&#xff0c;如今VB上不了台面。颠覆许多人认知的是&#xff0c;VB&#xff08;Visual Basic&#xff09;作为微软“亲儿子”&#xff0c;借助微软平台在全球用户中仍有着稳固地位&#xff0c;是被大家看轻的…

技术分享 | Redis 之分布式锁

作者&#xff1a;贲绍华 爱可生研发中心工程师&#xff0c;负责项目的需求与维护工作。其他身份&#xff1a;柯基铲屎官。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 引言&#xff1a…

Redis事务

Redis事务官网&#xff1a; http://redis.cn/topics/transactions.html 一、Redis事务的特性 Redis事务可以一次执行多个命令&#xff0c;并且满足以下两个重要的特性 事务是一个单独的隔离操作&#xff1a;事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中&a…

CSS3 calc()函数

CSS3 calc()函数 概述 在CSS3中&#xff0c;我们可以使用calc()函数通过“计算”的方式来定义某一个属性的取值。 使用 语法 属性: calc(表达式);说明 可以使用calc()函数计算元素的width、margin、padding、font-size等。 对于calc()函数&#xff0c;有以下5条运算规则…

我的第一个基于vue-cli的程序

文章目录一 准备环境1.1 node.js安装1.2 安装Vue工具(Vue CLI)第一种安装方式【可能会遇到失败&#xff0c;如果失败请尝试第二种方式】下载的文件的存放位置第二种安装方式安装cnpm二 操作步骤2.0 进行目标文件夹下的命令行窗口2.1 创建项目2.2 成功2.3 运行项目2.4 效果一 准…

力扣1700.无法吃午餐的学生数量

题目描述&#xff1a; 学校的自助午餐提供圆形和方形的三明治&#xff0c;分别用数字 0 和 1 表示。所有学生站在一个队列里&#xff0c;每个学生要么喜欢圆形的要么喜欢方形的。 餐厅里三明治的数量与学生的数量相同。所有三明治都放在一个 栈 里&#xff0c;每一轮&#xff…

戴尔成就300015电脑出现错误代码怎么重新安装系统?

戴尔成就300015电脑出现错误代码怎么重新安装系统&#xff1f;有用户使用这款戴尔成就300015电脑的时候&#xff0c;总是在使用过程中无故的冒出错误代码&#xff0c;导致系统崩溃了。那么这个情况怎么去进行问题的修复呢&#xff1f;一起来看看详细的解决方法分享吧。 准备工作…

【深度学习】如何封装可维护的restiful api

这篇文章是用一个案例的形式尝试解决字段入参多了&#xff0c;在python这种风格的语言下如何维护的问题&#xff01; 文章目录前言1. json 是个好东西2. json 是个坏东西3. json维护数据的适用范围总结4.解决4.1 基础版4.2 进阶版4.2.1 行动4.2.2 精进4.3 另一种选择总结前言 …

立根铸魂 崛起数智时代 GBASE受邀出席操作系统产业峰会2022

2022年12月28日&#xff0c;由openEuler开源社区发起举办的操作系统产业峰会2022/openEuler Summit 2022正式召开。GBASE荣幸受邀参加统信软件“深耕数字化”主题论坛&#xff0c;分享GBase 8c基于鲲鹏生态的创新实践历程和经验。 操作系统产业峰会2022 -南大通用GBase 8c基于鲲…

使用Nordic的nrf52832控制指定从机(一主多从)

一主多从1. 想要实现的功能2. 从机3. 主机3.1 主从机连接个数设置3.2 扫描过滤3.3 连接和断开连接3.4 按键处理3.5 从机读写3.5.1 写3.5.1 读4运行效果1. 想要实现的功能 1.主机能连接多个从机&#xff08;主机作为控制器&#xff0c;从机作为节点&#xff09;。 2.主机能使用…

Java跨域问题

目录 1、跨域问题说明 ​2、跨域解决方案 2.1、局部跨域解决方案 2.1.1、CrossOrigin注解跨域 2.1.2、手动设置响应头 2.2、全局跨域解决方案 2.2.1、实现WebMvcConfigurer接口设置跨域 2.2.2、定义CorsFilter Bean实现跨域 2.2.3、重写ResponseBodyAdvice接口中的bef…

ros的launch文件知识

_node标签&#xff1a; 在指定机器上启动节点respawn"true|false"(可选) 如果节点退出&#xff0c;是否自动重启respawndelay"N"(可选) 如果 respawn 为 true,那么延迟N秒后启动节点required"true|false"(可选) 该节点是否必须&#xff0c;如果…

ZooKeeper 避坑实践:SnapCount 设置不合理导致磁盘爆满,服务不可用

作者&#xff1a;子葵 背景 在 ZooKeeper 的日常使用过程中&#xff0c;一个令人头疼的问题就是节点的磁盘容量问题&#xff0c;如果由于过大的 TPS 或者不适当的清理策略会导致集群中数据文件&#xff0c;日志文件的堆积&#xff0c;最终导致磁盘爆满&#xff0c;Server 宕机…

在线客服系统部署配置邮箱消息通知功能 - 唯一客服(v1kf.com) -开源私有化独立部署在线客服系统源码...

为在线客服系统设置邮件通知具有以下几个好处&#xff1a; 改善客户体验&#xff1a;邮件通知可以让客户实时收到新消息或更新通知&#xff0c;这有助于提高他们对您的服务的整体体验。 提高效率&#xff1a;邮件通知可以帮助提高客服团队的效率&#xff0c;因为它们会在新消息…