首页 > 其他分享 >Vue3——计算属性和监听

Vue3——计算属性和监听

时间:2024-12-23 17:19:37浏览次数:3  
标签:newVal car 监视 watch person oldVal Vue3 监听 属性

一、computed

作用:根据已有的数据计算出新数据,具有缓存性(如果依赖的计算数据不更新就只执行一次,更新再执行)

只读写法:

let fullName = computed(() => {
  return 计算结果;
})

可读可写:

let fullName = computed({
  get() {
     return 计算结果;
  },
  set(newVal) {
    // newVal是触发时传进来的参数
    ...修改数据以达到修改计算属性的效果 
  }
})

二、watch

作用:监视数据的变化

特点:Vue3中的watch只能监视以下四种数据:

1.ref定义的数据

  情况一:监视【ref】定义的【基本类型】数据

  let sum = ref(0);
  // 监视 情况一:监视【ref】定义的【基本类型】数据
  watch(sum, (newVal, oldVal) => {
    console.log('sum变化了',newVal, oldVal);
  })

  情况二:监视【ref】定义的【对象类型】数据

  let person = ref({
    name: '张三',
    age: 18,
  })

  // 监视 此时监视的是对象的地址值,只有对象地址改变时才会触发,如果想监听对象内部属性的变化,需要配置第三个参数对象:deep: true
  // immediate: true  无论person是否变化,都先执行一次里面的回调函数(第二个参数)
  watch(person, (newVal, oldVal) => {
    // 这里的newVal和oldVal值是否一致要看情况,他们指向的地址是person
    // 如果改变了地址,比如person.value = xxx,就会有不同的newVal和oldVal值,因为指向的地址不是一个
    // 如果只改变了里面的属性,那newVal和oldVal指向的地址是一个,所以改变后newVal和oldVal都只能查询到最新的值,看起来newVal和oldVal就是一样的
    console.log('person改变了', newVal, oldVal);
  }, {deep: true, immediate: true})

  延伸:停止监视写法

  const stopWatch = watch(sum, (newVal, oldVal) => {
    console.log('sum变化了',newVal, oldVal);
    if (newVal >= 10) {
      stopWatch();
    }
  })

2.reactive定义的数据

  情况一:监视【reactive】定义的【对象类型】数据(默认开启深度监视,因为reactive的局限性,不能重新分配一个新对象)

  let person = reactive({
    name: '张三',
    age: 18,
  }) 
  // 监视 reactive的响应式数据时默认开启深度监视,且不能通过deep:false来关闭
  watch(person, (newVal, oldVal) => {
    console.log('person改变了', newVal, oldVal);
  })

3.函数返回一个值

  扩展:若是要监听【对象中的某一属性】,可以将这个属性写成【getter函数】(即返回一个值的函数)

  例如:对以下person中的不同属性进行监听

  let person = reactive({
    name: '张三',
    age: 18,
    car: {
      c1: '奔驰',
      c2: '宝马'
    }
  }) 

  ①若该属性值不是【对象类型】,需要写成函数形式,如下:

  watch(() => person.name, (newVal, oldVal) =>{
    console.log('person.name发生了变化', newVal, oldVal);
  })  

  ②若该属性值是【对象类型】,可直接编,也可以写成函数,建议写成函数

    -直接编写,只能监视内部属性的变化,对整个car的修改无法监视,因为person.car指的就是当前的person.car,一旦更改就找不到了

  watch(person.car, (newVal, oldVal) => {
    console.log('person.car发生了变化', newVal, oldVal);
  })

    -函数式编写,只能监视person.car地址的变化,无法监视内部属性变化,可以通过配置deep:true解决(同ref监视对象类型一样)

  watch(() => person.car, (newVal, oldVal) => {
    console.log('person.car发生了变化', newVal, oldVal);
  }, {deep: true})  

4.一个包含上述内容的数组

  情况一:监听上述多个数据

  let person = reactive({
    name: '张三',
    age: 18,
    car: {
      c1: '奔驰',
      c2: '宝马'
    }
  })

  // 监视
  watch([() => person.name, () => person.car.c1], (newVal, oldVal) => {
    // newVal和oldVal是name和c1的值
    console.log('person.car发生了变化', newVal, );
  }, {deep: true})

三、watchEffect

介绍:立即运行的一个函数(启动即会执行一次),同时响应式地追踪其依赖(可以灵活监控用到的数据),并在依赖更改时重新执行该函数

watch和watchEffect的区别

1.都能监听响应式数据的变化,但是方式不同

2.watch:要明确指出监视的数据

3.watchEffect:不用明确指出监视的数据(函数中用到哪些属性,那就监视哪些属性)

watch和watchEffect分别实现:

  let temp = ref(10);
  let height = ref(0);
// 通过watch监听实现 watch([temp, height], (value) => { const [newTemp, newHeight] = value; if(newTemp >= 60 || newHeight >= 80) { console.log(value); } }) // 通过watchEffect监听实现(更方便) watchEffect(() => { /** * 有一个小Bug,一旦temp值大于60之后,再去点击height增加按钮无法输出条件语句内的内容, * 是因为||运算符一旦前面条件满足就不会再执行||后面的语句,因此无法在temp条件满足的情况下去监听height * 解决办法:在watchEffect再使用一下height.value即可监听,或者使用其他运算符 */ if (temp.value >= 60 || height.value >= 80) { console.log('达到要求'); } })

标签:newVal,car,监视,watch,person,oldVal,Vue3,监听,属性
From: https://www.cnblogs.com/wyl-k/p/18624516

相关文章

  • Vue3——定义响应式数据
    一、ref和reactiveref:可定义基本类型数据和对象类型数据reactive:只能定义对象类型数据区别:·ref创建的变量在script中使用时必须加上.value(可以使用volar插件自动添加.value,步骤:vscode设置->扩展->Vue->勾选DotValue)·reactive重新分配一个新对象,会失去响应式(可以......
  • Vue3封装一个Element的自定义上传组件
    封装一个ElementPlus的自定义上传组件写在前面,工作中要封装一个文件上传组件,想着以后肯定也能用得到,就给记录了下来文章通篇借鉴的是这位大佬的,有需要的可以去看看https://blog.51cto.com/u_15295608/3527047直接上代码:先看样式:就是这样子了!!!,这是个弹窗的形式,有空我再整......
  • SLD 中 ColorMap的 type属性
    SLD中ColorMap的type属性在ColorMap中,type属性定义了渲染方式,有以下几种类型:1.ramp含义:使用颜色渐变表示数据值的范围。特性:渐变效果是连续的,数据值之间的颜色平滑过渡。适用于连续数据(如温度、海冰浓度等)。示例:<ColorMaptype="ramp"><ColorMapEnt......
  • 基于Vue3+uni-app的组合技术栈开发的多端电商平台设计与实现 毕业设计-附源码15304
    摘要本论文针对使用Vue3和uni-app构建多端电商平台的技术实践进行了深入研究。首先,论文介绍了Vue3和uni-app的基本概念和特点,解释了它们在多端开发中的优势和应用场景。随后,论文详细阐述了电商平台的设计与实现过程,包括需求分析、架构设计、页面布局、数据交互等关键步骤......
  • vue-监听滚动函数
    import{onDeactivated,onMounted,onUnmounted,ref}from'vue';import{throttle}from'underscore'//监听滚动位置执行回调函数//console.log(throttle)//exportdefaultfunctionuseScroll(reachBottomCB){//constscrollListenerHandler=()......
  • dotnet 简单聊聊 Skia 里的 SKFontMetrics 的各项属性作用
    熟悉文本排版的伙伴也许对于字体的Metrics概念不陌生,在Skia里面提供的SKFontMetrics就包含了从字体信息里面所获取的多项信息。只是略微有所不同的是Skia多加了对字体大小的加工,即SKFontMetrics获取到的属性已经是和SKFont的Size相关如下图所示,是我绘制的示意图......
  • 2024-12-21:从魔法师身上吸取的最大能量。用go语言,在一个神秘的地牢里,有 n 名魔法师排
    2024-12-21:从魔法师身上吸取的最大能量。用go语言,在一个神秘的地牢里,有n名魔法师排成一列。每位魔法师都有一个能量属性,有的提供正能量,而有的则会消耗你的能量。你被施加了一种诅咒,吸收来自第i位魔法师的能量后,你会立即被传送到第(i+k)位魔法师。在这个过程中,你会......
  • 项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(二)
    文章目录一、登录功能实现1、前端实现1.1创建登录组件1.2安装和配置ElementPlus1.3安装axios和调用后端接口2、后端实现2.1创建数据表和准备数据2.2配置MYSQL配置信息2.3登录功能实现2.3.1创建实体类2.3.2创建登录服务接口及实现2.3.3创......
  • Vue3--Vite和Pinia
    一、PNPMpnpm是Node.js的替代包管理器。它是npm的直接替代品,但速度更快、效率更高。为什么效率更高?当您安装软件包时,我们会将其保存在您机器上的全局存储中,然后我们会从中创建一个硬链接(pnpm通过硬链接的方式保证了相同的包不会被重复下载,比如说我们已经在A中下载过一......
  • 父组件传给子组件 props里的属性不能在子组件中修改
    父组件传递数据给子组件props里的属性不能在子组件中修改问题:dialog对话框只能打开一次子组件<template><div><el-button@click="edit">编辑</el-button><!--Form--><el-dialogtitle="收货地址":visible.sync="dialogFormVisible&qu......