Vue基础(3)监听数据

1. 监听 ref

xml 复制代码
<script setup>
import { ref, watch} from 'vue'

const count = ref(0)
watch(count, (newValue, oldValue) => {
  console.log(`count changed from ${oldValue} to ${newValue}`)
})
</script>

<template>
  <button @click="count++">{{ count }}</button> 
</template>

2. 监听 reactive

不能直接监听响应式对象的属性值,而是需要用一个返回该属性的 getter 函数。

xml 复制代码
<script setup>
import { reactive, watch} from 'vue'

const state = reactive({count: 0})
watch(() => state.count, (newValue, oldValue) => {
  console.log(`count changed from ${oldValue} to ${newValue}`)
})
</script>

<template>
  <button @click="state.count++">{{ state.count }}</button> 
</template>

3. 可选配置对象

  • deep:当设置为 true 时,监听器会进行深度监听。即当监听的数据源(对象或数组)内部的属性值发生变化时,监听器也会触发回调函数。
xml 复制代码
<script setup>
import { reactive, watch} from 'vue'

const state = reactive({good: {count: 2, price: 20}})
watch(() =>state.good, (newValue, oldValue) => {		// newValue和oldValue相同
	console.log(`count changed from ${oldValue.count } to ${newValue.count}`)	// 点击之后打印'from 3 to 3'
}, {deep: true})	// 没有配置deep: true时,点击count变化但是没有打印日志
</script>

<template>
  <span>{{ state.good }}</span>
  <button @click="state.good.count++">+</button> 
</template>
  • immediate:当设置为 true 时,监听器会在初始化时立即执行一次回调函数,即不需要等待被监听的数据源发生变化。
xml 复制代码
<script setup>
import { reactive, watch} from 'vue'

const state = reactive({good: {count: 2, price: 20}})
watch(() =>state.good, (newValue, oldValue) => {		
	console.log(newValue)		// Proxy(Object) {count: 2, price: 20}
	console.log(oldValue)		// undefined
}, {immediate: true})	 // 初始化时打印一次
</script>

<template>
  <span>{{ state.good }}</span>
  <button @click="state.good.count++">+</button> 
</template>
  • once:当设置为 true 时,监听器只会在第一次数据变动时触发回调函数,之后即使被监听的数据源再次发生变化,也不会再次触发回调函数。

4. watchEffect

与 watch 相比,watchEffect 不需要明确指定要监听的数据源,它会立刻执行一次函数,并自动跟踪该函数中使用的所有响应式引用和计算属性,当它们变化时重新运行该函数。

js 复制代码
watchEffect( () => {
  console.log(count.value)
})
相关推荐
匹马夕阳14 分钟前
Vue 3中导航守卫(Navigation Guard)结合Axios实现token认证机制
前端·javascript·vue.js
你熬夜了吗?15 分钟前
日历热力图,月度数据可视化图表(日活跃图、格子图)vue组件
前端·vue.js·信息可视化
我想学LINUX1 小时前
【2024年华为OD机试】 (A卷,100分)- 微服务的集成测试(JavaScript&Java & Python&C/C++)
java·c语言·javascript·python·华为od·微服务·集成测试
screct_demo1 小时前
詳細講一下在RN(ReactNative)中,6個比較常用的組件以及詳細的用法
javascript·react native·react.js
桂月二二6 小时前
探索前端开发中的 Web Vitals —— 提升用户体验的关键技术
前端·ux
CodeClimb7 小时前
【华为OD-E卷 - 第k个排列 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
沈梦研7 小时前
【Vscode】Vscode不能执行vue脚本的原因及解决方法
ide·vue.js·vscode
hunter2062068 小时前
ubuntu向一个pc主机通过web发送数据,pc端通过工具直接查看收到的数据
linux·前端·ubuntu
qzhqbb8 小时前
web服务器 网站部署的架构
服务器·前端·架构
刻刻帝的海角8 小时前
CSS 颜色
前端·css