Vue3技术4之watch监视属性、watch时value问题

news2024/12/28 18:25:36

Vue3技术4

  • watch监视属性
    • watch监视ref定义的数据
      • 情况一:监视ref所定义的一个响应式数据
        • App.vue
        • Demo.vue
      • 情况二:监视ref所定义的多个响应式数据
        • App.vue
        • Demo.vue
      • 添加immediate属性
        • Demo.vue
    • watch监视reactive定义的数据
      • 情况一:监视reactive所定义的一个响应式数据的全部属性
        • Demo.vue
      • 情况二:监视reactive所定义的一个响应式数据的某个属性
        • Demo.vue
      • 情况三:监视reactive所定义的一个响应式数据的某些属性
        • Demo.vue
      • 特殊情况
        • Demo.vue
    • 总结
    • watch时value的问题
      • 使用ref生成对象
        • Demo.vue
        • Demo.vue

watch监视属性

watch监视ref定义的数据

情况一:监视ref所定义的一个响应式数据

App.vue

<template>
  <Demo></Demo>
</template>

<script>
import Demo from "@/components/Demo";
export default {
  name: 'App',
  components: {Demo},
}
</script>

Demo.vue

<template>
  <h2>和为:{{sum}}</h2>
  <button @click="sum++">和+1</button>
</template>

<script>
import {ref,watch} from 'vue'
export default {
    name: "Demo",
    setup(){
      //数据
      let sum=ref(0)

      //情况一:监视ref所定义的一个响应式数据
      watch(sum,(newValue,oldValue) => {
        console.log("sum改变了",newValue,oldValue)
      })

      //返回一个对象(常用)
      return{
          sum
      }
    },
}
</script>

<style scoped>

</style>

请添加图片描述

情况二:监视ref所定义的多个响应式数据

App.vue

<template>
  <Demo></Demo>
</template>

<script>
import Demo from "@/components/Demo";
export default {
  name: 'App',
  components: {Demo},
}
</script>

Demo.vue

<template>
  <h2>和为:{{sum}}</h2>
  <button @click="sum++">和+1</button>
  <hr>
  <h2>当前的信息为:{{msg}}</h2>
  <button @click="msg+=''">修改信息</button>
</template>

<script>
import {ref,watch} from 'vue'
export default {
    name: "Demo",
    setup(){
      //数据
      let sum=ref(0)
      let msg=ref('你好啊')

      //情况一:监视ref所定义的一个响应式数据
      watch(sum,(newValue,oldValue) => {
        console.log("sum改变了",newValue,oldValue)
      })

      //情况二:监视ref所定义的多个响应式数据
      watch([sum,msg],(newValue,oldValue) => {
        console.log("sum或msg发生改变了",newValue,oldValue)
      })


      //返回一个对象(常用)
      return{
          sum,
          msg
      }
    },
}
</script>

<style scoped>

</style>

请添加图片描述

添加immediate属性

Demo.vue

<template>
  <h2>和为:{{sum}}</h2>
  <button @click="sum++">和+1</button>
  <hr>
  <h2>当前的信息为:{{msg}}</h2>
  <button @click="msg+=''">修改信息</button>
</template>

<script>
import {ref,watch} from 'vue'
export default {
    name: "Demo",
    setup(){
      //数据
      let sum=ref(0)
      let msg=ref('你好啊')

      //情况一:监视ref所定义的一个响应式数据
      /*watch(sum,(newValue,oldValue) => {
        console.log("sum改变了",newValue,oldValue)
      },{immediate:true})*/

      //情况二:监视ref所定义的多个响应式数据
      watch([sum,msg],(newValue,oldValue) => {
        console.log("sum或msg发生改变了",newValue,oldValue)
      },{immediate:true})


      //返回一个对象(常用)
      return{
          sum,
          msg
      }
    },
}
</script>

<style scoped>

</style>

请添加图片描述

watch监视reactive定义的数据

情况一:监视reactive所定义的一个响应式数据的全部属性

  1. 注意:此处无法正确获取oldValue值
  2. 注意:强制开启深度监视(deep配置无效)

Demo.vue

<template>
  <h2>和为:{{sum}}</h2>
  <button @click="sum++">和+1</button>
  <hr>
  <h2>当前的信息为:{{msg}}</h2>
  <button @click="msg+=''">修改信息</button>
  <hr>
  <h2>个人信息</h2>
  <h2>姓名:{{person.name}}</h2>
  <h2>年龄:{{person.age}}</h2>
  <h2>薪资:{{person.job.j1.salary}}K</h2>
  <button @click="person.name+='~'">修改信息</button>
  <button @click="person.age++">增加年龄</button>
  <button @click="person.job.j1.salary++">涨薪</button>
</template>

<script>
import {reactive, ref, watch} from 'vue'
export default {
    name: "Demo",
    setup(){
      //数据
      let sum=ref(0)
      let msg=ref('你好啊')
      let person=reactive({
        name:'张三',
        age:18,
        job:{
          j1:{
            salary:20
          }
        }
      })

      //情况一:监视ref所定义的一个响应式数据
      /*watch(sum,(newValue,oldValue) => {
        console.log("sum改变了",newValue,oldValue)
      },{immediate:true})*/

      //情况二:监视ref所定义的多个响应式数据
      // watch([sum,msg],(newValue,oldValue) => {
      //   console.log("sum或msg发生改变了",newValue,oldValue)
      // },{immediate:true})

      /*
        情况三:监视reactive所定义的一个响应式数据的全部属性
        1.注意:此处无法正确获取oldValue值
        2.注意:强制开启深度监视(deep配置无效)
      */
      watch(person,(newValue,oldValue) => {
        console.log("person值改变了",newValue,oldValue)
      },{deep:false})  //此处的deep配置无效



      //返回一个对象(常用)
      return{
          sum,
          msg,
          person
      }
    },
}
</script>

<style scoped>

</style>

请添加图片描述

情况二:监视reactive所定义的一个响应式数据的某个属性

Demo.vue

<template>
  <h2>和为:{{sum}}</h2>
  <button @click="sum++">和+1</button>
  <hr>
  <h2>当前的信息为:{{msg}}</h2>
  <button @click="msg+=''">修改信息</button>
  <hr>
  <h2>个人信息</h2>
  <h2>姓名:{{person.name}}</h2>
  <h2>年龄:{{person.age}}</h2>
  <h2>薪资:{{person.job.j1.salary}}K</h2>
  <button @click="person.name+='~'">修改信息</button>
  <button @click="person.age++">增加年龄</button>
  <button @click="person.job.j1.salary++">涨薪</button>
</template>

<script>
import {reactive, ref, watch} from 'vue'
export default {
    name: "Demo",
    setup(){
      //数据
      let sum=ref(0)
      let msg=ref('你好啊')
      let person=reactive({
        name:'张三',
        age:18,
        job:{
          j1:{
            salary:20
          }
        }
      })

      //情况一:监视ref所定义的一个响应式数据
      /*watch(sum,(newValue,oldValue) => {
        console.log("sum改变了",newValue,oldValue)
      },{immediate:true})*/

      //情况二:监视ref所定义的多个响应式数据
      // watch([sum,msg],(newValue,oldValue) => {
      //   console.log("sum或msg发生改变了",newValue,oldValue)
      // },{immediate:true})

      /*
        情况三:监视reactive所定义的一个响应式数据的全部属性
        1.注意:此处无法正确获取oldValue值
        2.注意:强制开启深度监视(deep配置无效)
      */
      /*watch(person,(newValue,oldValue) => {
        console.log("person值改变了",newValue,oldValue)
      },{deep:false})  //此处的deep配置无效*/

      //情况四:监视reactive所定义的一个响应式数据的某个属性
      watch(()=>person.age,(newValue,oldValue) => {
        console.log("person的age属性改变了",newValue,oldValue)
      })



      //返回一个对象(常用)
      return{
          sum,
          msg,
          person
      }
    },
}
</script>

<style scoped>

</style>

请添加图片描述

情况三:监视reactive所定义的一个响应式数据的某些属性

Demo.vue

<template>
  <h2>和为:{{sum}}</h2>
  <button @click="sum++">和+1</button>
  <hr>
  <h2>当前的信息为:{{msg}}</h2>
  <button @click="msg+=''">修改信息</button>
  <hr>
  <h2>个人信息</h2>
  <h2>姓名:{{person.name}}</h2>
  <h2>年龄:{{person.age}}</h2>
  <h2>薪资:{{person.job.j1.salary}}K</h2>
  <button @click="person.name+='~'">修改信息</button>
  <button @click="person.age++">增加年龄</button>
  <button @click="person.job.j1.salary++">涨薪</button>
</template>

<script>
import {reactive, ref, watch} from 'vue'
export default {
    name: "Demo",
    setup(){
      //数据
      let sum=ref(0)
      let msg=ref('你好啊')
      let person=reactive({
        name:'张三',
        age:18,
        job:{
          j1:{
            salary:20
          }
        }
      })

      //情况一:监视ref所定义的一个响应式数据
      /*watch(sum,(newValue,oldValue) => {
        console.log("sum改变了",newValue,oldValue)
      },{immediate:true})*/

      //情况二:监视ref所定义的多个响应式数据
      // watch([sum,msg],(newValue,oldValue) => {
      //   console.log("sum或msg发生改变了",newValue,oldValue)
      // },{immediate:true})

      /*
        情况三:监视reactive所定义的一个响应式数据的全部属性
        1.注意:此处无法正确获取oldValue值
        2.注意:强制开启深度监视(deep配置无效)
      */
      /*watch(person,(newValue,oldValue) => {
        console.log("person值改变了",newValue,oldValue)
      },{deep:false})  //此处的deep配置无效*/

      //情况四:监视reactive所定义的一个响应式数据的某个属性
      /*watch(()=>person.age,(newValue,oldValue) => {
        console.log("person的age属性改变了",newValue,oldValue)
      })*/

      //情况五:监视reactive所定义的一个响应式数据的某些属性
      watch([()=>person.name,()=>person.age],(newValue,oldValue)=>{
        console.log("person的name或age属性改变了",newValue,oldValue)
      })


      //返回一个对象(常用)
      return{
          sum,
          msg,
          person
      }
    },
}
</script>

<style scoped>

</style>

请添加图片描述

特殊情况

Demo.vue

<template>
  <h2>和为:{{sum}}</h2>
  <button @click="sum++">和+1</button>
  <hr>
  <h2>当前的信息为:{{msg}}</h2>
  <button @click="msg+=''">修改信息</button>
  <hr>
  <h2>个人信息</h2>
  <h2>姓名:{{person.name}}</h2>
  <h2>年龄:{{person.age}}</h2>
  <h2>薪资:{{person.job.j1.salary}}K</h2>
  <button @click="person.name+='~'">修改信息</button>
  <button @click="person.age++">增加年龄</button>
  <button @click="person.job.j1.salary++">涨薪</button>
</template>

<script>
import {reactive, ref, watch} from 'vue'
export default {
    name: "Demo",
    setup(){
      //数据
      let sum=ref(0)
      let msg=ref('你好啊')
      let person=reactive({
        name:'张三',
        age:18,
        job:{
          j1:{
            salary:20
          }
        }
      })

      //情况一:监视ref所定义的一个响应式数据
      /*watch(sum,(newValue,oldValue) => {
        console.log("sum改变了",newValue,oldValue)
      },{immediate:true})*/

      //情况二:监视ref所定义的多个响应式数据
      // watch([sum,msg],(newValue,oldValue) => {
      //   console.log("sum或msg发生改变了",newValue,oldValue)
      // },{immediate:true})

      /*
        情况三:监视reactive所定义的一个响应式数据的全部属性
        1.注意:此处无法正确获取oldValue值
        2.注意:强制开启深度监视(deep配置无效)
      */
      /*watch(person,(newValue,oldValue) => {
        console.log("person值改变了",newValue,oldValue)
      },{deep:false})  //此处的deep配置无效*/

      //情况四:监视reactive所定义的一个响应式数据的某个属性
      /*watch(()=>person.age,(newValue,oldValue) => {
        console.log("person的age属性改变了",newValue,oldValue)
      })*/

      //情况五:监视reactive所定义的一个响应式数据的某些属性
      /*watch([()=>person.name,()=>person.age],(newValue,oldValue)=>{
        console.log("person的name或age属性改变了",newValue,oldValue)
      })*/

      //特殊情况
      watch(()=>person.job,(newValue,oldValue) => {
        console.log("person的job变化了",newValue,oldValue)
      },{deep:true})  //此处由于是监视reactive所定义的对象中的某个属性,所以deep配置有效

      //返回一个对象(常用)
      return{
          sum,
          msg,
          person
      }
    },
}
</script>

<style scoped>

</style>

请添加图片描述

总结

  1. 与Vue2.x中watch配置功能一致
  2. 两个小“坑”:
    (1)监视reactive定义的响应式数据时:oldValue无法正确获取,强制开启了深度监视(deep配置失效)
    (2)监视reactive定义的响应式数据中某个属性时:deep配置有效
//情况一:监视ref所定义的一个响应式数据
watch(sum,(newValue,oldValue) => {
  console.log("sum改变了",newValue,oldValue)
},{immediate:true})

//情况二:监视ref所定义的多个响应式数据
watch([sum,msg],(newValue,oldValue) => {
  console.log("sum或msg发生改变了",newValue,oldValue)
},{immediate:true})

/*
  情况三:监视reactive所定义的一个响应式数据的全部属性
  1.注意:此处无法正确获取oldValue值
  2.注意:强制开启深度监视(deep配置无效)
*/
watch(person,(newValue,oldValue) => {
  console.log("person值改变了",newValue,oldValue)
},{deep:false})  //此处的deep配置无效

//情况四:监视reactive所定义的一个响应式数据的某个属性
watch(()=>person.age,(newValue,oldValue) => {
  console.log("person的age属性改变了",newValue,oldValue)
})

//情况五:监视reactive所定义的一个响应式数据的某些属性
watch([()=>person.name,()=>person.age],(newValue,oldValue)=>{
  console.log("person的name或age属性改变了",newValue,oldValue)
})

//特殊情况
watch(()=>person.job,(newValue,oldValue) => {
  console.log("person的job变化了",newValue,oldValue)
},{deep:true}) //此处由于是监视reactive所定义的对象中的某个属性,所以deep配置有效

watch时value的问题

使用ref生成对象

  1. 方法一:使用deep深度监测

Demo.vue

<template>
  <h2>和为:{{sum}}</h2>
  <button @click="sum++">和+1</button>
  <hr>
  <h2>当前的信息为:{{msg}}</h2>
  <button @click="msg+=''">修改信息</button>
  <hr>
  <h2>个人信息</h2>
  <h2>姓名:{{person.name}}</h2>
  <h2>年龄:{{person.age}}</h2>
  <h2>薪资:{{person.job.j1.salary}}K</h2>
  <button @click="person.name+='~'">修改信息</button>
  <button @click="person.age++">增加年龄</button>
  <button @click="person.job.j1.salary++">涨薪</button>
</template>

<script>
import {ref, watch} from 'vue'
export default {
    name: "Demo",
    setup(){
      //数据
      let sum=ref(0)
      let msg=ref('你好啊')
      let person=ref({
        name:'张三',
        age:18,
        job:{
          j1:{
            salary:20
          }
        }
      })

      watch(sum,(newValue,oldValue)=>{
        console.log("sum值发生了改变",newValue,oldValue)
      })

      //对于ref生成的对象类型数据检测,使用deep,或者直接person.value进行监测
      watch(person,(newValue,oldValue)=>{
        console.log("person值发生了改变",newValue,oldValue)
      },{deep:true})

      



      //返回一个对象(常用)
      return{
          sum,
          msg,
          person
      }
    },
}
</script>

<style scoped>

</style>

请添加图片描述

  1. 方法二:使用person.value解决

Demo.vue

<template>
  <h2>和为:{{sum}}</h2>
  <button @click="sum++">和+1</button>
  <hr>
  <h2>当前的信息为:{{msg}}</h2>
  <button @click="msg+=''">修改信息</button>
  <hr>
  <h2>个人信息</h2>
  <h2>姓名:{{person.name}}</h2>
  <h2>年龄:{{person.age}}</h2>
  <h2>薪资:{{person.job.j1.salary}}K</h2>
  <button @click="person.name+='~'">修改信息</button>
  <button @click="person.age++">增加年龄</button>
  <button @click="person.job.j1.salary++">涨薪</button>
</template>

<script>
import {ref, watch} from 'vue'
export default {
    name: "Demo",
    setup(){
      //数据
      let sum=ref(0)
      let msg=ref('你好啊')
      let person=ref({
        name:'张三',
        age:18,
        job:{
          j1:{
            salary:20
          }
        }
      })

      watch(sum,(newValue,oldValue)=>{
        console.log("sum值发生了改变",newValue,oldValue)
      })

      //对于ref生成的对象类型数据检测,使用deep,或者直接person.value进行监测
      /*watch(person,(newValue,oldValue)=>{
        console.log("person值发生了改变",newValue,oldValue)
      },{deep:true})*/


      watch(person.value,(newValue,oldValue)=>{
        console.log("person值发生改变啦~~~~",newValue,oldValue)
      })




      //返回一个对象(常用)
      return{
          sum,
          msg,
          person
      }
    },
}
</script>

<style scoped>

</style>

请添加图片描述

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

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

相关文章

直播带货冲击实体生意,杭州四季青打响禁止直播带货第一枪

最近&#xff0c;“杭州四季青部分市场禁止直播”的话题冲上热搜。 身处“直播电商之城”杭州的“中国服装行业第一街”杭州四季青的部分市场&#xff0c;打响了“驱逐直播第一枪”&#xff01; 杭州四季青部分市场内为什么要明令禁止直播&#xff0c;直播卖货对实体商户带来了…

华锐3d虚拟数字人提供哪些智能化服务?

虚拟数字人的诞生是互联网时代的产物&#xff0c;它的出现为数字化经济提供了全新解决方案。数字化技术和网络使人类得以进入以“智能机器数据算法”为主线的新生态之中。 广州华锐互动作为专业的AI虚拟数字人开发商&#xff0c;拥有成熟的技术团队和一流的解决方案&#xff0…

零售数据分析操作篇15:用总聚合做销售分析

上一讲讲了内存计算筛选&#xff0c;又可称之为自定义计算成员筛选&#xff0c;即当某列是通过自定义计算成员得到的时候&#xff0c;还要想利用其作为筛选条件&#xff0c;就需要用到自定义计算成员筛选功能。 上一讲还给大家出了道作业&#xff0c;就是&#xff1a;想知道哪…

RHCE-DNS服务器

主机名称解析服务器配置 要求&#xff1a; 1、建立DNS服务器&#xff0c;负责解析的域为openedu.com&#xff1b; 建立DNS首先需要在服务器端配置主配置文件&#xff1a; &#xff08;1&#xff09;临时关闭防火墙和selinux&#xff1a;systemctl stop firewalld&#xff1b;…

靶机精讲之HackademicRTB1

主机发现 nmap扫描 端口扫描 只有80端口开放 UDP扫描 web渗透 服务扫描 脚本扫描 DOS攻击漏洞 枚举漏洞 查看web端 进行目录爆破 点击 点击后发现地址结构像有目录爆破 接上面枚举漏洞 复制那枚举目录到web 接目录爆破 apeache服务器 查看内容管理系统是否是自建的 在库搜索…

【rustdesk】rust入门及 windows尝试编译

rustup 微软建议用vs code开发 下载了64位的版本: vs code 插件 rust-analyer 介绍Better TOML,用于更好的展示.toml文件Error Lens, 更好的获得错误展示 One Dark Pro, 非常好看的Vscode主题 CodeLLDB, debugger程序 安装

2023年工商管理在职研究生择校、择专业指南

工商管理在职研究生是许多管理岗位从业者提升职业素质、竞争力的重要途径。 工商管理在职研究生学习的内容更加专业、深入&#xff0c;涵盖的领域更加广泛&#xff0c;通过学习&#xff0c;可以提高专业素养&#xff0c;掌握更深入的理论和实务知识&#xff0c;拓宽人脉&#…

爆爆爆!!Deep Mind与Google Brain合并,成立 Google DeepMind 新部门

图&#xff5c;2010-2023&#xff0c;从 DeepMind 到 Google DeepMind&#xff0c;再到 DeepMind&#xff0c;再到 Google DeepMind 来源: 学术头条 微信号&#xff1a;SciTouTiao 或许是深深感受到了来自 OpenAI 与微软一起给到的巨大压力&#xff0c;以及加速实现通用人工智…

基于 VITA57.4 标准的 8 路 500MSPS/1GSPS/1.25GSPS 采样率 14 位 AD 采集 FMC 子卡模块

板卡概述 FMC148 是一款基于 VITA57.4 标准的 JESD204B 接口 FMC 子卡模块&#xff0c;该模块可以实现 8 路 14-bit、500MSPS/1GSPS/1.25GSPS ADC 采集功能。该板卡 ADC 器件采用 ADI 公司的 AD9680 芯片,全 功率-3dB 模拟输入带宽可达 2GHz。该 ADC 与 FPGA 的主机接口通 …

【PyQt】QGraphicsItem的setPos和transformation的平移并不等效

1. 结论 今天才知道&#xff0c;改变图元的位置的两个方法&#xff1a; setPos() 和 transform.translate() 的本质是不同的&#xff01; 2. 缘由 在调试代码时&#xff0c;获取某个位置不在原点的图元的坐标总是返回(0,0)&#xff0c;百思不得其解&#xff0c;后仔细研究发…

prometheus监控之pushgateway

prometheus监控之pushgateway 文章目录 prometheus监控之pushgatewaypushgateway是什么pushgateway使用场景架构图安装pushgateway配置说明 prometheus配置pushgateway的使用数据推送默认格式入门操作较为复杂数据的推送一次性推送多个指标(命令行方式)一次性推送多条数据&…

QML地图绘制虚线

QML提供了MapPolyline用于在地图上绘制线段&#xff0c;该线段是实线&#xff0c;因此我使用Canvas自定义绘制的方式在地图上绘制线段&#xff0c;如图&#xff1a; 鼠标在地图上点击后&#xff0c;在点击位置添加图标 &#xff0c;当有多个图标被添加到地图上后&#xff0c;计…

让你立刻学会指针

☃️个人主页&#xff1a;fighting小泽 &#x1f338;作者简介&#xff1a;目前正在学习C语言和数据结构 &#x1f33c;博客专栏&#xff1a;C语言学习 &#x1f3f5;️欢迎关注&#xff1a;评论&#x1f44a;&#x1f3fb;点赞&#x1f44d;&#x1f3fb;留言&#x1f4aa;&am…

NumberPicker分析(三)

NumberPicker分析(三) 这一节主要用来分析NumberPicker的事件处理及滚动 NumberPicker继承自LinearLayout&#xff0c;是一个ViewGroup&#xff0c;ViewGroup事件处理的顺序大致如下&#xff1a; dispatchTouchEventonInterceptTouchEventonTouchEvent 另外&#xff0c;源码中…

ADSP21489之CCES开发笔记(十)

ADI21489定时器设计思路&#xff1a; 1、配置Power management control register. 2、定义时钟中断调用函数接口及实现。。 3、指定时钟中断间隔。 4、启用时钟timer。 demo代码实现2~4,如下代码 #include <services/int/adi_int.h> #include <stdio.h> #include &…

consul集群搭建教程 - 单机器集群

简言 1. 上一篇博客我们讲了consul多机器集群的部署&#xff0c;consul集群搭建教程 - 多机集群_YZF_Kevin的博客-CSDN博客 2. 很多同学没有多个机器&#xff0c;只想在单台机器上实验下consul集群&#xff0c;所以这篇博客我们讲单台机器的consul集群部署 3. consul的各个版…

mapreduce打包提交执行wordcount案例

文章目录 一、源代码1. WordCountMapper类2. WordCountReducer类3. WordCountDriver类4. pom.xml 二、相关操作和配置1. 项目打包2. 带参测试3. 上传打包后的jar包和测试文档4. 增大虚拟内存5.启动集群6.在hdfs上创建输入文件夹和上传测试文档Hello.txt7. 利用jar包在hdfs实现文…

TX-LCN:分布式事务框架

文章目录 概念LCN模式创建父工程parent创建子工程TxManager: 管理事务创建子工程: Eureka Server 注册中心创建子工程: book: 被远程调用方创建子工程: student: 远程调用方 TCC模式在lcn的基础上创建子工程: redistest在student 调用 redistest 概念 TX-LCN由两大模块组成&am…

设计模式:行为型模式 - 策略模式

文章目录 1.概述2.结构3.案例实现4.优缺点5.使用场景6.JDK源码解析 1.概述 先看下面的图片&#xff0c;我们去旅游选择出行模式有很多种&#xff0c;可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为一个程序猿&#xff0c;开发需要选择一款开发工具&#xff0c;当然…

基于SpringBoot医养中心管理系统

有需要请私信或看评论链接哦 可远程调试 SpringBoot医养中心管理系统 一 介绍 基于SpringBoot医养中心管理系统-登录角色分为用户和管理员。用户登录后可查看个人信息/家人情况&#xff0c;生活情况和收费标准。管理员登录后台可进行账号管理&#xff0c;健康管理&#xff0c…