Vue组合式函数(二)封装一个请求

简介: Vue组合式函数(二)封装一个请求

前言


上一章我们封装了一个useMouse的组合式函数,他没有接收任何的参数。今天我们就来封装一个可以接受参数的组合式函数。就拿我们平常开发中与后端请求数据的接口调用为例,当我们需要请求一个列表的数据的时候,往往会有四个状态:请求中、请求数据为空、请求数据不为空和请求错误。请求错误这里就不代码实例,因为我们这里常常通过一个警告弹窗来解决。下面我们就来看看这个组合式函数如何实现吧。


useFetch


正常不使用组合式函数的话,我们会这样写:


<script setup>
import { ref } from 'vue'
const data = ref(null)
fetch('...')
  .then((res) => res.json())
  .then((json) => (data.value = json))
</script>
<template>
  <div v-if="!data">Loading...</div>
  <div v-if="data.length">
    <span>这里有n条列表数据</span>
  </div>
  <div v-else></div>
</template>
复制代码


我们可以看到关于fetch请求那块,如果每次在不同组件调用接口请求数据的时候都这么写的话,是非常繁琐的,那我们就可以把其封装为一个组合式函数:


// fetch.js
import { ref } from 'vue'
export function useFetch(url) {
  const data = ref(null)
  fetch(url)
    .then((res) => res.json())
    .then((json) => (data.value = json))
  return { data }
}
复制代码


然后在组件中引入即可使用:


<script setup>
import { useFetch } from './fetch.js'
const { data } = useFetch('...')
</script>
复制代码


观察上面的代码你可以发现useFetch接收一个url的字符串作为输入,使用的时候需要我们每次进行调用。所以基于这一点,我们可以再一次进行优化,让他同时可以接受一个ref作为输入,这样就可以监听url进行响应式的请求了。


// fetch.js
import { ref, isRef, unref, watchEffect } from 'vue'
export function useFetch(url) {
  const data = ref(null)
  function doFetch() {
    // 每次请求的时候初始化状态
    data.value = null
    error.value = null
    // 通过unref()解包ref可以更好的监听
    fetch(unref(url))
      .then((res) => res.json())
      .then((json) => (data.value = json))
  }
  // 判断输入的url是否是ref,并进行的监听或直接调用
  if (isRef(url)) {
    watchEffect(doFetch)
  } else {
    doFetch()
  }
  return { data }
}
复制代码


这样我们即完成了可以接受静态的url,也完成了结果ref的url。


注意:如果我们通过watchEffect()来监听ref时,一定要用unref()来进行结构,这样有利于其正确的跟踪。或者使用watch() 显式地监听相应的ref。

相关文章
|
3天前
|
存储 缓存 JavaScript
谈谈你对vue的了解
谈谈你对vue的了解
14 3
|
4天前
|
JavaScript API
Vue axjx 跨域请求
Vue应用中解决跨域问题可通过配置代理服务器。方法一是设置`devServer.proxy`到目标服务器端口,如`http://localhost:3000`,然后使用axios发送请求。方法二是为多个代理配置,如`/api`和`/api2`,分别指向不同端口,利用`pathRewrite`重写路径。请求时需加上相应前缀,如`/api/index`。
13 1
|
4天前
|
JavaScript 前端开发 Java
JavaSE精选-Vue
JavaSE精选-Vue
7 1
|
4天前
|
JavaScript
Vue父子组件传值
<!-- 父组件向子组件传地值 -->
15 2
|
5天前
|
JavaScript Java
Vue : v-if, v-show
Vue : v-if, v-show
13 0
Vue : v-if, v-show
|
5天前
|
JavaScript 前端开发
Vue : 监视属性
Vue : 监视属性
9 0
|
5天前
|
缓存 JavaScript
Vue: 事件修饰符, 键盘事件, 鼠标事件,计算属性
Vue: 事件修饰符, 键盘事件, 鼠标事件,计算属性
22 2
|
11天前
|
缓存 监控 JavaScript
探讨优化Vue应用性能和加载速度的策略
【5月更文挑战第17天】本文探讨了优化Vue应用性能和加载速度的策略:1) 精简代码和组件拆分以减少冗余;2) 使用计算属性和侦听器、懒加载、预加载和预获取优化路由;3) 数据懒加载和防抖节流处理高频事件;4) 图片压缩和选择合适格式,使用CDN加速资源加载;5) 利用浏览器缓存和组件缓存提高效率;6) 使用Vue Devtools和性能分析工具监控及调试。通过这些方法,可提升用户在复杂应用中的体验。
30 0
|
12天前
|
JavaScript 前端开发
vue(1),小白看完都会了
vue(1),小白看完都会了
|
5天前
|
JavaScript 安全
一文彻底学会vue的组件通信
Vue组件通信包括父向子通过`props`传递数据,如`&lt;Student :name=&quot;18&quot;&gt;&lt;/Student&gt;`,子组件通过`$emit`触发自定义事件与父组件通信,如`this.$emit(&#39;myEvent&#39;, this.name)`。此外,使用全局事件总线(`Vue.prototype.$bus`)可在多级组件间通信,通过`$on`订阅和`$emit`发布事件。还有消息订阅与发布模式,利用`pubsub-js`库实现更灵活的组件交互。
11 0
一文彻底学会vue的组件通信