VUE 3 代码的变化

2021-10-28  本文已影响0人  那年冬季的寒冰

在 Vue2 中如果我需要请求一份数据,并且在loading和error时都展示对应的视图,一般来说,我们会这样写:

<template>
  <div>
    <div v-if="error">failed to load</div>
    <div v-else-if="loading">loading...</div>
    <div v-else>hello {{fullName}}!</div>
  </div>
</template>

<script>
import { createComponent, computed } from 'vue'

export default {
  data() {
    // 集中式的data定义 如果有其他逻辑相关的数据就很容易混乱
    return {
        data: {
            firstName: '',
            lastName: ''
        },
        loading: false,
        error: false,
    },
  },
  async created() {
      try {
        // 管理loading
        this.loading = true
        // 取数据
        const data = await this.$axios('/api/user')
        this.data = data
      } catch (e) {
        // 管理error
        this.error = true
      } finally {
        // 管理loading
        this.loading = false
      }
  },
  computed() {
      // 没人知道这个fullName和哪一部分的异步请求有关 和哪一部分的data有关 除非仔细阅读
      // 在组件大了以后更是如此
      fullName() {
          return this.data.firstName + this.data.lastName
      }
  }
}
</script>

这段代码,怎么样都谈不上优雅,凑合的把功能完成而已,并且对于loadingerror等处理的可复用性为零。

数据和逻辑也被分散在了各个option中,这还只是一个逻辑,如果又多了一些逻辑,多了datacomputedmethods?你如何迅速的分辨清楚这个method是和某两个data中的字段关联起来的?

让我们把这段代码的逻辑照搬到 Vue3 中,

看一下swr在 Vue3 中的表现:

<template>
  <div>
    <div v-if="error">failed to load</div>
    <div v-else-if="loading">loading...</div>
    <div v-else>hello {{fullName}}!</div>
  </div>
</template>

<script>
import { createComponent, computed } from 'vue'
import useSWR from 'vue-swr'

export default createComponent({
  setup() {
      // useSWR帮你管理好了取数、缓存、甚至标签页聚焦重新请求、甚至Suspense...
      const { data, loading, error } = useSWR('/api/user', fetcher)
      // 轻松的定义计算属性
      const fullName = computed(() => data.firstName + data.lastName)
      return { data, fullName, loading, error }
  }
})
</script>


就是这么简单,逻辑更加聚合了。

顺嘴一提, use-swr 的威力可远远不止看到的这么简单,随便举几个它的能力:

间隔轮询
请求重复数据删除
对于同一个 key 的数据进行缓存
对数据进行乐观更新
在标签页聚焦的时候重新发起请求
分页支持
完备的 TypeScript 支持
上一篇下一篇

猜你喜欢

热点阅读