当前位置: 首页 > article >正文

Vue3进阶:异步状态示例

在做异步数据请求时,我们常常需要处理不同的状态:加载中、加载成功和加载失败。

如果在每个需要获取数据的组件中都要重复这种模式,那就太繁琐了。让我们把它抽取成一个组合式函数:

// fetch.js
import { ref } from 'vue'

export function useFetch(url) {
  const data = ref(null)
  const error = ref(null)

  fetch(url)
    .then((res) => res.json())
    .then((json) => (data.value = json))
    .catch((err) => (error.value = err))

  return { data, error }
}

现在我们在组件里只需要:

<script setup>
import { useFetch } from './fetch.js'

const { data, error } = useFetch('...')
</script>

接收响应式状态​

useFetch() 接收一个静态 URL 字符串作为输入——因此它只会执行一次 fetch 并且就此结束。如果我们想要在 URL 改变时重新 fetch 呢?为了实现这一点,我们需要将响应式状态传入组合式函数,并让它基于传入的状态来创建执行操作的侦听器。

举例来说,useFetch() 应该能够接收一个 ref:

const url = ref('/initial-url')

const { data, error } = useFetch(url)

// 这将会重新触发 fetch
url.value = '/new-url'

或者接收一个 getter 函数:

// 当 props.id 改变时重新 fetch
const { data, error } = useFetch(() => `/posts/${props.id}`)

我们可以用 watchEffect() 和 toValue() API 来重构我们现有的实现:

// fetch.js
import { ref, watchEffect, toValue } from 'vue'

export function useFetch(url) {
  const data = ref(null)
  const error = ref(null)

  const fetchData = () => {
    // reset state before fetching..
    data.value = null
    error.value = null

    fetch(toValue(url))
      .then((res) => res.json())
      .then((json) => (data.value = json))
      .catch((err) => (error.value = err))
  }

  watchEffect(() => {
    fetchData()
  })

  return { data, error }
}

toValue() 是一个在 3.3 版本中新增的 API。它的设计目的是将 ref 或 getter 规范化为值。如果参数是 ref,它会返回 ref 的值;如果参数是函数,它会调用函数并返回其返回值。否则,它会原样返回参数。它的工作方式类似于 unref(),但对函数有特殊处理。

注意 toValue(url) 是在 watchEffect 回调函数的内部调用的。这确保了在 toValue() 规范化期间访问的任何响应式依赖项都会被侦听器跟踪。

这个版本的 useFetch() 现在能接收静态 URL 字符串、ref 和 getter,使其更加灵活。watch effect 会立即运行,并且会跟踪 toValue(url) 期间访问的任何依赖项。如果没有跟踪到依赖项 (例如 url 已经是字符串),则 effect 只会运行一次;否则,它将在跟踪到的任何依赖项更改时重新运行。


http://www.kler.cn/a/297283.html

相关文章:

  • Docker 学习 Day 1
  • springboot整合Logback
  • 千益畅行,共享旅游卡,引领旅游新潮流
  • “Jmeter-InfluxDB-Grafana“常见错误有哪些如何解决?
  • verilog报错:Illegal concatenation of an unsized constant. and 输入输出位宽不匹配
  • 安全服务面试-2
  • Spring Cloud LoadBalancer
  • 【QT Creator】基本使用
  • 在cscode中通过maven创建java项目
  • 免费 U 盘数据恢复 - 用 4 种免费方法从随身U 盘恢复文件
  • html备忘录
  • 个人信息记录安全:守护数字时代的隐私堡垒
  • smsp__inst_executed_pipe_fp64为什么对不上
  • 【spring】微服务架构中的VO命名
  • OceanBase性能相关
  • Oracle Enterprise Manager:Oracle数据库管理的高效工具
  • IP宿主信息在不同领域的广泛应用
  • Docker入门学习-01
  • WinCC 中对 VBS 进行单步执行调试
  • 一次windows server 服务器病毒分析处理总结