最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析在Vue中watch使用的必要性及其優(yōu)化

 更新時間:2023年12月22日 08:22:22   作者:ssshooter  
這篇文章主要來和大家深入討論一下在Vue開發(fā)中是否有必要一定用watch,如果換成watcheffect會如何,文中的示例代碼講解詳細(xì),需要的可以參考下

場景

代碼大概如下,刪除了很多無關(guān)內(nèi)容。

<template>
  <div>
    <SearchBar @search="handleSearch" />
    <Pagination
      v-model:page="pagination.page"
      :page-size="pagination.pageSize"
      :total="pagination.total"
    />
  </div>
</template>
<script setup lang="ts">
  import { reactive, ref, watch, inject, computed } from 'vue'
  import SearchBar from '@/components/SearchBar.vue'

  const route = useRoute()
  const pagination = reactive({
    page: 1,
    pageSize: isPublic.value ? 10 : 9,
    total: 0,
  })
  const keyword = ref('')
  const fetchList = async () => {
    loading.value = true
    const res = await connect.get(`/api/${route.params.type}`, {
      params: {
        pageSize: pagination.pageSize,
        page: pagination.page,
        name: keyword.value,
      },
    })
    pagination.total = res.total
    loading.value = false
  }
  watch(
    () => route.params.type,
    async () => {
      pagination.page = 1
      fetchList()
    },
    { immediate: true }
  )
  watch(
    () => pagination.page,
    async () => {
      fetchList()
    }
  )
  watch(
    () => keyword.value,
    async () => {
      if (pagination.page === 1) fetchList()
      else {
        pagination.page = 1
      }
    }
  )
  const handleSearch = (val: string) => {
    keyword.value = val
  }
  const handleDelete = async (item: MindMapItem) => {
    await confirmModal.value?.confirm()
    await connect.delete('/api/map/' + item._id)
    fetchList()
  }
</script>

本來只有 2 個 watch,今天新功能加了個關(guān)鍵詞搜索,又得多 watch 一個 keyword.value。

于是這里變成了 3 個 watch,而且里面有邏輯,甚至是相互依賴的邏輯。

上面的代碼沒寫完,但是整理一下,最終目標(biāo)是這樣的:

  • 請求參數(shù)有三個變量:route.params.type、keyword 和 pagination
  • route.params.type 改變時需要重置 pagination 和 keyword,然后重新請求
  • keyword 改變時需要重制 pagination,然后重新請求
  • pagination 改變時需要重新請求

watch 真的好?

如果繼續(xù)用 watch,因為需要重置 pagination 和 keyword,硬生生把三個 watch 寫成了個像是任務(wù)委托一樣的效果,例如 keyword.value 修改時如果 page 是 1 就直接請求,否則修改 page 再讓 page 的 watch 觸發(fā)請求。

watch(
  () => keyword.value,
  async () => {
    if (pagination.page === 1) fetchList()
    else {
      pagination.page = 1
    }
  }
)

這么耦合真的好嗎?這不好。我勸自己耗子尾汁,好好反思。

得出的結(jié)論是:watch 不是好文明,能不用 watch,就別用 watch。

這不是我第一次對 watch 有意見,在工作中我就見過很多復(fù)雜組件動則 5 個以上的 watch,有的里面還有復(fù)雜邏輯。

重點是啥,還沒注釋……watch 天然就容易讓人不寫注釋,給人一種“啊,這個值變了,運行下面的邏輯是理所當(dāng)然的吧。”,那你問問兩個月后的自己,是不是真的這樣?你自己寫的 watch 你自己看得懂嗎?一個值變了就觸發(fā)邏輯,但問題是,它變的原因可多了。

所以 watch 生而在語義上不明確,它只解釋了對值的依賴,沒有解釋依賴的原因。

watchEffect 呢?

上面的例子,假如把 fetchList 寫成 watchEffect,其實還是一樣的問題,需要在里面額外加 if else 處理重置邏輯。不過邏輯集中在一個 watchEffect 大概還是比分散在 N 個 watch 里好。

總結(jié)

總結(jié)一下,watch 或者 watchEffect 有其用武之地,但最好滿足以下的條件:

  • 變動觸發(fā)點大于 2 個才考慮 watch(只有一個觸發(fā)機會的話,什么時候用,什么時候跑就好了)
  • 所有場景全都適用同一個處理邏輯
  • 與其他 watch 沒耦合

不過如果沒有事件機制來觸發(fā)的話,那就只能 watch 了。

優(yōu)化后

<template>
  <div>
    <SearchBar @search="handleSearch" />
    <Pagination
      v-model:page="pagination.page"
      @update:page="fetchList"
      :page-size="pagination.pageSize"
      :total="pagination.total"
    />
  </div>
</template>
<script setup lang="ts">
  import { reactive, ref, watch, inject, computed } from 'vue'
  import SearchBar from '@/components/SearchBar.vue'

  const route = useRoute()
  const pagination = reactive({
    page: 1,
    pageSize: isPublic.value ? 10 : 9,
    total: 0,
  })
  const keyword = ref('')
  const fetchList = async () => {
    // 省略
  }
  watch(
    () => route.params.type,
    async () => {
      keyword.value = ''
      pagination.page = 1
      fetchList()
    },
    { immediate: true }
  )
  const handleSearch = (val: string) => {
    keyword.value = val
    pagination.page = 1
    fetchList()
  }
  const handleDelete = async (item: MindMapItem) => {
    await confirmModal.value?.confirm()
    await connect.delete('/api/map/' + item._id)
    fetchList()
  }
</script>

修改后,只保留 route.params.type 的 watch,不會發(fā)生沖突,另外兩個通過事件觸發(fā)。至于觸發(fā)事件也不用額外寫 @change,直接用 @update:xxx 就可以了。

這樣只有易讀的重置邏輯,沒有 if else!清爽!

到此這篇關(guān)于淺析在Vue中watch使用的必要性及其優(yōu)化的文章就介紹到這了,更多相關(guān)Vue watch內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue之讀取并解析ini文件中的內(nèi)容

    Vue之讀取并解析ini文件中的內(nèi)容

    這篇文章主要介紹了Vue之讀取并解析ini文件中的內(nèi)容,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Vue組件通信深入分析

    Vue組件通信深入分析

    對于vue來說,組件之間的消息傳遞是非常重要的,用vue可以是要組件復(fù)用的,而組件實例的作用域是相互獨立,這意味著不同組件之間的數(shù)據(jù)無法互相引用,一般來說,組件之間可以有幾種關(guān)系,下面是我對組件之間消息傳遞的常用方式的總結(jié)
    2022-08-08
  • Vue常用的修飾符及應(yīng)用場景解讀

    Vue常用的修飾符及應(yīng)用場景解讀

    這篇文章主要介紹了Vue常用的修飾符及應(yīng)用場景解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • vue實現(xiàn)自定義顏色選擇器

    vue實現(xiàn)自定義顏色選擇器

    這篇文章主要為大家詳細(xì)介紹了如何使用vue實現(xiàn)一個自定義顏色選擇器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-04-04
  • vue+swiper實現(xiàn)側(cè)滑菜單效果

    vue+swiper實現(xiàn)側(cè)滑菜單效果

    這篇文章主要為大家詳細(xì)介紹了vue+swiper實現(xiàn)側(cè)滑菜單效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • vue工程如何為組件自動注入全局樣式文件

    vue工程如何為組件自動注入全局樣式文件

    這篇文章主要介紹了vue工程如何為組件自動注入全局樣式文件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue渲染器如何對節(jié)點進行掛載和更新

    Vue渲染器如何對節(jié)點進行掛載和更新

    這篇文章主要介紹了Vue 的渲染器是如何對節(jié)點進行掛載和更新的,文中通過代碼示例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-05-05
  • vue如何利用axios調(diào)用后臺api接口

    vue如何利用axios調(diào)用后臺api接口

    這篇文章主要介紹了vue如何利用axios調(diào)用后臺api接口問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • vue項目中的.env文件加載方式

    vue項目中的.env文件加載方式

    在Vue項目中,通過.env文件配置環(huán)境變量,支持不同環(huán)境下加載不同配置,Vite通過import.meta.env向應(yīng)用暴露環(huán)境變量,支持基本URL、開發(fā)環(huán)境和生產(chǎn)環(huán)境識別等,.env文件可設(shè)置環(huán)境優(yōu)先級,修改后需重啟生效,TypeScript可通過增加文件獲取智能提示
    2024-10-10
  • vue實現(xiàn)給當(dāng)前元素添加樣式,其他元素?zé)o樣式問題

    vue實現(xiàn)給當(dāng)前元素添加樣式,其他元素?zé)o樣式問題

    這篇文章主要介紹了vue實現(xiàn)給當(dāng)前元素添加樣式,其他元素?zé)o樣式問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05

最新評論

南开区| 开封市| 新野县| 双流县| 利津县| 历史| 定边县| 黎城县| 石阡县| 防城港市| 纳雍县| 焦作市| 清水县| 清流县| 海丰县| 闽清县| 洛宁县| 临清市| 容城县| 汶川县| 上犹县| 宁陕县| 贡嘎县| 剑川县| 余江县| 斗六市| 奉节县| 庄河市| 望城县| 元氏县| 宾川县| 宁晋县| 新乡县| 当雄县| 安康市| 马公市| 唐海县| 建湖县| 南宁市| 新绛县| 肥西县|