vue3的api解读-watch

news/2024/10/18 7:52:08/

目录

副作用(Side Effect)

纯粹计算背后的效果【我们做UI时非常需要】

副作用的封装(伪代码)

副作用失效(Invalidate)问题

API:WatchEffect

Coding:WatchEffect【演示代码】

/src/examples/WatchExamplese.tsx【watchEffect】

API:Watch

Coding:Watch

/src/examples/WatchExamplese.tsx【watch】

小结


副作用(Side Effect)

  • 副作用是计算之外的行为
  • view = f(props)with effect[]
function SomeComponent(a, b) {window.location.href = '...' // 副作用const c = ref(0) // 副作用watchEffect(..) // 副作用return <div>{a+b+c.value}</div>
}

纯粹计算背后的效果【我们做UI时非常需要】

  • 点击Tab时,切换了`activeKey`,同时改变当前url(history.replace)
  • 删除文件时操作目录结构,同时写入磁盘

副作用的封装(伪代码)

根据数据变化,触发副作用

function HomePage {watch(activeKey, () => {history.repace(...)    })return () => {return <tabs>...</tabs>    }
}

副作用失效(Invalidate)问题

  • 快速切换页面的场景
const currentIndex = ref("")
// 点击打开A
currentIndex.value = "A"
// 点击打开B
currentIndex.value = "B"
// A还没打开,就继续执行打开B,这时候就是A副作用失效

API:WatchEffect

  • 目标:监听副作用,并封装副作用
  • 监听哪些副作用?
    • reactive值变化(track,tigger)
    • 页面渲染
  • watchEffect会依赖用到的reactive值(类似渲染函数)

Coding:WatchEffect【演示代码】

  • 常规用法
  • watchEffect的依赖收集
  • 执行时机
  • 副作用失效问题

/src/examples/WatchExamplese.tsx【watchEffect】

import { ref, defineComponent, watchEffect, onUnmounted } from 'vue'
export const WatchExample01 = defineComponent({setup() {// 常规用法const count = ref(0)// effect (效果)?? --副作用(side effect)// 提供副作用,封装副作用,也在依赖副作用,会先执行一次,收集依赖watchEffect(() => { // 副作用中用到了,才能追踪到// watchEffect的依赖收集console.log('im running...') // 单写打印,不会执行,因为没有依赖副作用,追踪不到// console.log('im running...', count.value) // 会执行,因为有依赖document.title = "count:" + count.value // 会执行,因为有依赖// history.replaceState({}, "", "/count/" + count.value)})return () => {return <div><button onClick={() => {count.value++}}>+</button>{count.value}</div>}}
})
export const WatchExample02 = defineComponent({setup() {// 执行时机const count = ref(0)// effect (效果)?? --副作用(side effect)// 提供副作用,封装副作用,也在依赖副作用,会先执行一次,收集依赖watchEffect(() => { // 副作用中用到了,才能追踪到console.log('im running...') // 单写打印,不会执行,因为没有依赖副作用,追踪不到// console.log('im running...', count.value) // 会执行,因为有依赖// document.title = "count:" + count.value // 会执行,因为有依赖// history.replaceState({}, "", "/count/" + count.value)}, {flush: "sync" // post 后于render执行; pre 先于render执行; sync先于render执行})// 执行时间线 sync【同步依赖变化第一时间执行】 
// ... tick【vue闲时执行】 ... pre ... render ... postreturn () => {console.log('render...')return <div><button onClick={() => {count.value++}}>+</button>{count.value}</div>}}
})
export const WatchExample03 = defineComponent({setup() {// 副作用失效问题const count = ref(0)// effect (效果)?? --副作用(side effect)// 提供副作用,封装副作用,也在依赖副作用,会先执行一次,收集依赖watchEffect((onInvalidate) => { // 副作用中用到了,才能追踪到console.log(count.value)let I = setInterval(() => {count.value++}, 1000)// onInvalidate第二次执行时会清除前一次的I,关于副作用失效的问题onInvalidate(() => {// 如果没有它的话,会越来越快clearInterval(I)})// console.log('im running...') // 单写打印,不会执行,因为没有依赖副作用,追踪不到})// 执行时间线 sync【同步依赖变化第一时间执行】 ... tick【vue闲时执行】 ... pre ... render ... postreturn () => {return <div>{count.value}</div>}}
})
export const WatchExample04 = defineComponent({setup() {// 副作用失效问题const count = ref(0)let I = setInterval(() => {count.value++}, 1000)onUnmounted(() => { // 组件卸载时候执行的钩子clearInterval(I)})// effect (效果)?? --副作用(side effect)// 提供副作用,封装副作用,也在依赖副作用,会先执行一次,收集依赖// const stop = watchEffect((onInvalidate) => { // 副作用中用到了,才能追踪到//   console.log(count.value)//   let I = setInterval(() => {//     count.value++//   }, 1000)//   // onInvalidate第二次执行时会清除前一次的I,关于副作用失效的问题//   onInvalidate(() => {// 如果没有它的话,会越来越快//     clearInterval(I)//   })//   // console.log('im running...') // 单写打印,不会执行,因为没有依赖副作用,追踪不到// })// stop() // 只执行一次// 执行时间线 sync【同步依赖变化第一时间执行】 ... tick【vue闲时执行】 ... pre ... render ... postreturn () => {return <div>{count.value}</div>}}
})

API:Watch

  • 目标:监听某个reactive值的副作用/监听某个属性变化
  • 有针对性的监听语义更明确(推荐不用watchEffect)

Coding:Watch

  • 监听某个reactive值,封装副作用
  • 监听属性变化。依赖问题
  • 执行时机的问题

/src/examples/WatchExamplese.tsx【watch】

import { ref, defineComponent, watch } from 'vue'export const WatchExample05 = defineComponent({// 监听某个reactive值,封装副作用setup() {const count = ref(0)// 指定响应式值的监听,不需要如watchEffect开始执行一次进行依赖收集watch(count, () => {console.log('count', count)})setTimeout(() => {count.value++}, 1000)return () => <div>{count.value}</div>}
})
export const WatchExample06 = defineComponent({setup() {const a = ref(0)const b = ref(0)// const c = ref(a.value + b.value)watch([a, b], (x, y) => {// c.value = a.value + b.value // 第二种写法// x是旧值,y是新值console.log(x, y)})setInterval(() => {a.value += 0.2}, 500)setInterval(() => {b.value += 0.7}, 500)return () => <div>{a.value + b.value}{/* {c.value} */}</div>}
})
export const WatchExample07 = defineComponent({// 监听属性变化。依赖问题setup() {const greetings = ref("hello")setTimeout(() => {greetings.value = "world!"}, 1000)return () => {return <div><Item text={greetings.value} /></div>}}
})
// const Item = ({ text }: {
//   text: string
// }) => {
//   return <div>{text}</div>
// }
// 需要text变化时进行计算
const Item = defineComponent({props: {text: {type: String}},setup(props) {// 子组件监听属性变化// const textRef = ref(props.text) // watch(textRef, ()=>{不执行,setup只执行一次})// let x = 1// watch(()=> x, ()=>{不触发,不是响应式值,vue不知道怎么触发})watch(() => props.text, (to, from) => {console.log("prop changed to", to, "old value is", from)})// setTimeout(() => {//   x = 2// }, 1000)return () => {return <div>{props.text}</div>}}
})
export const WatchExample08 = defineComponent({// 执行时机的问题setup() {const c = ref(0)watch(c, () => { // 存在调度时间,会延迟一个周期执行console.log("herep---------")}, {"immediate": true // 通常不会设置// 设置为true,表示c变化之后,马上执行,例如c是某个事件的开关})return () => {return <div onClick={() => {c.value++}}>{c.value}</div>}}
})

小结

  • 为什么不推荐用watchEffect?watch语法很有针对性,明确指出响应式值,减少耦合
  • 如何理解watch依赖副作用又触发副作用?watch监听响应式值变动,执行我们写的副作用,依赖的是vue这个渲染引擎,页面内容渲染也是副作用

http://www.ppmy.cn/news/248305.html

相关文章

【虚拟机】常用的9款虚拟机软件

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;善假于物&#…

RestCloud-新一代(智能)全域数据集成平台

新一代智能全域数据集成平台 一、介绍1.1 企业级数据集成架构面临的痛点1.2 RestCloud说明1.3 重构企业数据融合架构&#xff0c;解决各种复杂、即时、高合规的数据集成需求1.4 (智能)全域数据集成平台1.5 300数据及应用连接器轻松汇聚全域数据 二、产品简介2.1 功能特性2.2 产…

基于双视角图表示算法的双向人职匹配偏好建模推荐系统构建

基于双视角图表示算法的双向人职匹配偏好建模推荐系统构建 文章目录 基于双视角图表示算法的双向人职匹配偏好建模推荐系统构建1. 传统推荐系统模型2. 协同过滤算法3. 基于双视角图表示学习算法的模型构建3.1 数据输入3.2 双视角交互图的构建3.3 混合偏好传播策略3.4 对于双向意…

简单的建立一个网络电视直播软件

网上有很多的软件或者网站都有网络电视直播的功能&#xff0c;电视台非常的丰富&#xff0c;不仅是卫视台&#xff0c;甚至是省市台&#xff0c;国外电视台都有&#xff0c;其实建立这样的一个软件非常简单。 其实整个网络电视就是一个WebBrowser中显示一个HTML网页就行了&…

智能电视聚好看连接服务器失败,最新海信电视网络故障解决方法汇总!新老用户值得收藏!...

智能电视标准不统一&#xff0c;所以使用起来也会繁琐&#xff0c;在使用过程中会遇到各种问题和操作上的麻烦。本文收集整理了一些关于海信电视使用中遇到一些网络方面的故障&#xff0c;并且一一给出解决方案。希望能够帮助到大家解决问题。 故障现象一&#xff1a; “聚好看…

1、网络硬件和软件

1.1、使用计算机网络 引言&#xff1a; 大量互相独立但彼此连接的计算机共同完成计算任务——这些系统被称为计算机网络。如何设计并组织这些网络是本书的主题。计算机与分布式系统的关键差别在于&#xff1a;由一组独立计算机组成的分布式系统呈现给用户的是一个关联系统。最…

新电视显示服务器失败,电视网络连接失败原因是什么

现在很多的家庭都会购买网络电视&#xff0c;网络电视使用起来非常方便&#xff0c;能够观看在线的电视或者是电影。在使用的过程当中&#xff0c;如果出现电视网络连接失败的情况&#xff0c;可能导致的原因也有很多。下面就由小编来为大家介绍一下&#xff0c;希望能够起到一…

用什么软件测试电视盒子真假,几十款电视盒子软件,只挑出6款神作,可消除一切看视频的阻碍!...

Hello&#xff0c;大家好&#xff0c;我是小喵。 支付宝搜索“321994”&#xff0c;领红包喽&#xff01; 之前推荐了太多太多手机看视频的软件&#xff0c;每次发完软件之后&#xff0c;很多人都在后台留言&#xff1a;“这款软件电视盒子能用吗&#xff1f;” 其实&#xff0…