Vue3 第三节 计算属性,监视属性,生命周期

1.computed计算属性

2.watch监视函数

3.watchEffect函数

4.Vue的生命周期函数

一.computed计算属性

  • 计算属性简写和完整写法
<template>
  <h1>一个人的信息</h1>
  姓:<input type="text" v-model="person.firstName" /><br />
  名:<input type="text" v-model="person.lastName" />
  <span>全名:{{ person.fullName }}</span>
  <br />
  全名:<input type="text" v-model="person.fullName" />
</template>

<script>
import { reactive, computed } from 'vue'
export default {
  name: 'Demo',
  // 数据
  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 name = value.split('-')
        person.firstName = name[0]
        person.lastName = name[1]
      }
    })

    return {
      person
    }
  }
}
</script>

<style>
</style>

二.watch监视函数 

2.1 监视情况分类

 情况① 监视ref定义的响应式数据: 第一个参数是监视的数据,第二个参数是一个回调函数

immediate:一上来就执行,放到第三个参数中

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所定义的全部属性

注意:

  • 此处无法正确的获取oldValue 

  • 强制开启了深度监视,deep属性设置为false无效

    watch(person, (newValue, oldValue) => {
      console.log('person的值变化了')
    }, { deep: false })

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

    watch(() => person.age, (newValue, oldValue) => {
      console.log('person的值变化了', newValue, oldValue)
    })

情况⑤ 监视reactive所定义的响应式数据中的某些属性

    watch([() => person.name, () => person.age], (newValue, oldValue) => {
      console.log('person的值变化了', newValue, oldValue)
    })

情况⑥ 监视的是 reactive 定义对象中的某个属性,deep是有效的

    watch(() => person.job, (newValue, oldValue) => {
      console.log('person的值变化了', newValue, oldValue)
    }, { deep: true })

watch监视整个代码

<template>
  <h2>当前求和为:{{ sum }}</h2>
  <button @click="sum++">点我+1</button>
  <hr />
  <h2>当前的信息为:{{ msg }}</h2>
  <button @click="msg += '!'">修改信息</button>
  <hr />
  <h2>姓名:{{ person.name }}</h2>
  <h2>年龄:{{ person.age }}</h2>
  <h2>薪资:{{ person.job.j1.salary }}</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
        }
      }
    })
    // 情况1 监视ref定义的响应式数据
    // watch(sum, (newValue, oldValue) => {
    //   console.log('sum的值变了', newValue, oldValue)
    // }, { immediate: true })

    // 情况2 监视ref定义的响应式数据
    // watch([sum, msg], (newValue, oldValue) => {
    //   console.log('sum或者msg的值变了', newValue, oldValue)
    // }, { immediate: true })

    // 情况3  监视reactive所定义的全部属性
    // 1.注意:此处无法正确的获取oldValue
    // 2.注意:强制开启了深度监视(deep属性设置为false无效)
    watch(person, (newValue, oldValue) => {
      console.log('person的值变化了')
    }, { deep: false })


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


    // 情况5:监视reactive所定义的响应式数据中的某些属性
    // watch([() => person.name, () => person.age], (newValue, oldValue) => {
    //   console.log('person的值变化了', newValue, oldValue)
    // })

    // 情况6(特殊):监视的是 reactive 定义对象中的某个属性,deep是有效的 
    // watch(() => person.job, (newValue, oldValue) => {
    //   console.log('person的值变化了', newValue, oldValue)
    // }, { deep: true })


    return {
      sum,
      msg,
      person
    }
  }
}
</script>

<style>
</style>

2.2 监视ref参数数据时需要注意的问题

① 监视ref基本数据类型的时候不需要加value

 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修饰的对象类型的时候,需要加value(相当于监视的是ref生成的reactive对象)

    watch(person.value, (newValue, oldValue) => {
      console.log('person被修改了', newValue, oldValue)
    })

如果不写.value,就加深度监视

watch(person, (newValue, oldValue) => {
      console.log('person被修改了', newValue, oldValue)
    }, { deep: true })

三.watchEffect函数

  • watch函数既要指明监视的属性,也要指明监视的回调
  • watchEffect函数不需要指明哪个属性,监视的回调中用到哪个属性,就监视哪个属性
  • watchEffect函数所指定的回调中的数据只要发生变化,则直接重新执行回调
  • watchEffect 有点像computed,但是computed注重计算出来的值,所以必须要写返回值
  • watchEffect更注重的是过程,所以不用写返回值
 watchEffect(() => {
      const x1 = sum.value
      const x2 = person.job.j1.salary
      console.log('watchEffect所指定的回调执行了')
    })

四.Vue3 的生命周期函数

① Vue3.0中可以继续使用Vue2.X中的生命周期钩子,但是有两个被更名

  • beforeDestroy改名为beforeUnmount
  • destroyed改为unmounted

② Vue3.0可以通过配置项的形式使用生命周期钩子

  beforeCreate () {
    console.log('---beforeCreate---')
  },
  created () {
    console.log('---created---')
  },
  beforeMount () {
    console.log('---beforeMount---')
  },
  mounted () {
    console.log('----mounted---')
  },
  beforeUpdate () {
    console.log('---beforeUpdate---')
  },
  updated () {
    console.log('---updated---')
  },
  beforeUnmount () {
    console.log('---beforeUnmount---')
  },
  unmounted () {
    console.log('---unmounted---')
  }

③ Vue3.0提供了组合式API形式的生命周期钩子,与Vue2.x中钩子的对应关系如下

  • beforecreate    =>     setup()
  • created =>  setup()
  • beforeMount =>  onBeforeMount

  • mounted => onMounted

  • beforeUpdate => onBeforeUpdate

  • updated => onUpdated

  • beforeUnmount => onBeforeUnmount

  • unmounted => onUnmounted

import { ref, onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted } from 'vue'
export default {
  name: 'Demo',
  // 数据
  setup () {
    let sum = ref(0)
    onBeforeMount(() => {
      console.log('---onBeforeMount---')
    })
    onMounted(() => {
      console.log('---onMounted---')
    })
    onBeforeUpdate(() => {
      console.log('---onBeforeUpdate---')
    })
    onUpdated(() => {
      console.log('---onUpdated---')
    })
    onBeforeUnmount(() => {
      console.log('---onBeforeUnmount---')
    })

    onUnmounted(() => {
      console.log('---onUnmounted---')
    })

    return {
      sum
    }
    // 
  }

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

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

相关文章

100G光模块的应用案例分析:电信、云计算和大数据领域

100G光模块是一种高速光模块&#xff0c;由于其高速率和低延迟的特性&#xff0c;在电信、云计算和大数据领域得到了广泛的应用。在本文中&#xff0c;我们将深入探讨100G光模块在这三个领域的应用案例。 一、电信领域 在电信领域&#xff0c;100G光模块被广泛用于构建高速通…

什么是应用的贴身防护盾?来看F5洞察风险

从云原生的发展来看&#xff0c;由于云原生技术的革新以及现代应用随之进化&#xff0c;可以清晰地看到云原生吞噬一切的势头&#xff0c;但是云原生也面临着众多挑战。2022 年很多公开调查报告显示&#xff0c;在云原生发展中&#xff0c;CEO/CIO 最关注的就是云原生安全&…

FFmpeg将编码后数据保存成mp4

以下测试代码实现的功能是&#xff1a;持续从内存块中获取原始数据&#xff0c;然后依次进行解码、编码、最后保存成mp4视频文件。 可保存成单个视频文件&#xff0c;也可指定每个视频文件的总帧数&#xff0c;保存多个视频文件。 为了便于查看和修改&#xff0c;这里将可独立的…

SpringBoot整合Sfl4j+logback的实践

一、概述 对于一个web项目来说&#xff0c;日志框架是必不可少的&#xff0c;日志的记录可以帮助我们在开发以及维护过程中快速的定位错误。slf4j,log4j,logback,JDK Logging等这些日志框架都是我们常见的日志框架&#xff0c;本文主要介绍这些常见的日志框架关系和SpringBoot…

自然语言处理: 第六章Transformer- 现代大模型的基石

理论基础 Transformer&#xff08;来自2017年google发表的Attention Is All You Need (arxiv.org) &#xff09;&#xff0c;接上面一篇attention之后&#xff0c;transformer是基于自注意力基础上引申出来的结构&#xff0c;其主要解决了seq2seq的两个问题: 考虑了原序列和目…

拦截器对接口细粒度权限校验

文章目录 一、逻辑分析二、校验规则1.规则类型2.规则划分3.规则配置信息4.规则案例说明5.规则加载 三、拦截器定义1.自定义拦截器2.注册拦截器 四、获取请求参数1.获取get提交方式参数2.获取post提交方式参数&#xff08;1&#xff09;定义RequestWrapper类&#xff08;2&#…

【知网检索】2023年金融,贸易和商业管理国际学术会议(FTBM2023)

随着经济全球化&#xff0c;贸易自由化的进程加快&#xff0c;我国经济对外开放程度不断加深&#xff0c;正在加快融入世界经济一体化当中。当今世界各国竞争过程中&#xff0c;金融、贸易以及商业形态已成为其关键与焦点竞争内容。 2023年金融、贸易和商业管理国际学术会议(F…

科技云报道:向量数据库:AI时代的下一个热点

科技云报道原创。 最近&#xff0c;又一个概念火了——向量数据库。 随着大模型带来的应用需求提升&#xff0c;4月以来多家海外知名向量数据库创业企业传出融资喜讯。 4月28日&#xff0c;向量数据库平台Pinecone宣布获得1亿美元&#xff08;约7亿元&#xff09;B轮融资&am…

尚品汇总结七:商品详情模块(面试专用)

一、业务介绍 订单业务在整个电商平台中处于核心位置&#xff0c;也是比较复杂的一块业务。是把“物”变为“钱”的一个中转站。 整个订单模块一共分四部分组成&#xff1a; 结算页面 在购物车列表页面中,有一个结算的按钮,用户一点击这个按钮时,跳转到结算页,结算页展示了用…

ROS实现机器人移动

开源项目 使用是github上六合机器人工坊的项目。 https://github.com/6-robot/wpr_simulation.git 机器人运动模型 运动模型如下所示&#xff1a;&#x1f447; 机器人运动的消息包&#xff1a; 实现思路&#xff1a;&#x1f447;   为什么要使用/cmd_vel话题。因为这…

2023应急指挥系统总体架构方案 PPT

导读&#xff1a;原文《应急指挥系统总体架构方案PPT》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 完整版领取方式 完整版领取方式&#xff1a; 如需获取完整的电…

【JMeter】 使用Synchronizing Timer设置请求集合点,实现绝对并发

目录 布局设置说明 Number of Simulated Users to Group Timeout in milliseconds 使用时需要注意的点 集合点作用域 实际运行 资料获取方法 布局设置说明 参数说明&#xff1a; Number of Simulated Users to Group 每次释放的线程数量。如果设置为0&#xff0c;等同…

AssetBundle学习

官方文档&#xff1a;AssetBundle 工作流程 - Unity 手册 (unity3d.com) 之前写的博客&#xff1a;AssetBundle学习_zaizai1007的博客-CSDN博客 使用流程图&#xff1a; 1&#xff0c;指定资源的AssetBundle属性 &#xff08;xxxa/xxx&#xff09;这里xxxa会生成目录&…

Gof23设计模式之组合模式

1.定义 ​组合模式又名部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次。这种类型的设计模式属于结构型模式&#xff0c;它创建了对象组的树形结构。 2.结构 组合模式主要包含三种…

【前端实习生备战秋招】—HTML 和 CSS面试题总结(一)

【前端实习生备战秋招】—HTML 和 CSS面试题总结&#xff08;一&#xff09; 1. 你做的页面在哪些流览器测试过&#xff1f;这些浏览器的内核分别是什么? IE:trident内核 Firefox&#xff1a;gecko内核 Safari:webkit内核 Opera:以前是presto内核&#xff0c;Opera现已改用Goo…

Java项目作业~ 创建基于Maven的Java项目,连接数据库,实现对站点信息的管理,即实现对站点的新增,修改,删除,查询操作

需求&#xff1a; 创建基于Maven的Java项目&#xff0c;连接数据库&#xff0c;实现对站点信息的管理&#xff0c;即实现对站点的新增&#xff0c;修改&#xff0c;删除&#xff0c;查询操作。 以下是站点表的建表语句&#xff1a; CREATE TABLE websites (id int(11) NOT N…

element-ui分页编辑器的使用

代码&#xff1a; 准备好初始数据; total: ,page: {pageSize: 1,pageNumber: 10,}, 当前显示在第一页,每页10条数据。 一,页码改变的事件 handleCurrentChange(val) { this.page.pageSizeval 通过传入(this.page) 获取当前页的数据 } 二.页容量改变 handleSizeChange(val) …

c++游戏制作指南(三):c++剧情类文字游戏的制作

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f35f;欢迎来到静渊隐者的csdn博文&#xff0c;本文是c游戏制作指南的一部&#x1f35f; &#x1f355;更多文章请点击下方链接&#x1f355; &#x1f368; c游戏制作指南&#x1f3…

Java基础入门篇——IDEA开发第一个入门程序(五)

一、IDEA层级结构分类 IntelliJ IDEA的项目结构主要分为以下几个层级&#xff1a; Project&#xff1a; 项目Module: 模块Package: 包Class&#xff1a; 类 一个项目里面可以有多个模块&#xff0c;一个模块里面又可以有多个包&#xff0c;而每个包又可以存放多个类文件。比…

Eclipse如何自动添加作者、日期等注释

一、创建类时自动添加注释 1、Window->Preferences 2、Java->Code Syle->Code Templates->Code->New Java files->Edit->要添加的注释->Apply 二、选中要添加的类或者方法通过AltShiftJ快捷键添加 1、Window->Preferences 2、Java->Code Syle…