前端組件抽取

前言

純菜雞記錄

業(yè)務(wù)場景

[圖片上傳失敗...(image-ed53dd-1658375271104)]

  • 拆分思路:
  1. 根據(jù)業(yè)務(wù),可以分成 nav(面包屑+樹狀導(dǎo)航)势就、page(內(nèi)容展示);根據(jù)內(nèi)容展示的不同,還可以繼續(xù)拆分
  2. 根據(jù)項目結(jié)構(gòu)问裕,可以分為xxx.vue(頁面)、data_xx.ts(接口)孵坚、use_xx.ts(邏輯)粮宛,還有其他文件,如常量管理卖宠、路由管理巍杈、鑒權(quán)管理等
  • 拆分方向:

拆分足夠細(xì),盡量使用函數(shù)式編程(有很多方向扛伍,只是選擇了其中的一種)

  • 以拆分nav(面包屑+樹狀導(dǎo)航)為例

文件結(jié)構(gòu):

[圖片上傳失敗...(image-670478-1658375271104)]

/*
* bread-crumb.vue
* 面包屑頁面:包含頁面需要的數(shù)據(jù)以及跳轉(zhuǎn)功能
* data_nav.ts
* nav(面包屑+樹狀導(dǎo)航)相關(guān)接口文件及簡單數(shù)據(jù)處理
* index.vue
* nav(面包屑+樹狀導(dǎo)航)入口頁面(布局筷畦、提供各個子頁面所需的數(shù)據(jù)
* interface.ts
* typescript相關(guān)接口定義等
* tree.vue和tree_menu.vue
* 樹狀導(dǎo)航:包含頁面需要的數(shù)據(jù)以及跳轉(zhuǎn)功能
* use_base.ts
* 組裝全局所需的一些字段,如 id 等
* use_nav.ts
* 組裝nav(面包屑+樹狀導(dǎo)航)所需的數(shù)據(jù)
* use_router.ts
* 跳轉(zhuǎn)功能封裝
*/
  • 不同業(yè)務(wù)模塊之間的數(shù)據(jù)交互(在交互設(shè)計上刺洒,需要盡可能做到功能分離化)

在nav(面包屑+樹狀導(dǎo)航)模塊定義:

/**
 * use_base.ts
 * 基本信息鉤子:暴露了基本數(shù)據(jù)base鳖宾,并且provide了可供全局使用的數(shù)據(jù)和方法
 */
import { provide, computed } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { BASE, BASE_ID_OPEN } from './constant'

function fmtId(v?: string) {
  return v || ''
}


export function useBase() {
  const router = useRouter()
  const route = useRoute()


  const base = computed(() => {
    return {
      id: fmtId(route.query.id as string),
      parentId: fmtId(route.query.parentId as string)
    }
  })

  provide(BASE, base)

  provide(BASE_ID_OPEN, (id: string) => {
    router.push({ query: { id } })
  })


  return {
    base
  }
}

在內(nèi)容展示模塊使用:

// use_main.ts
import { computed, ComputedRef, inject, watch } from 'vue'
import { BASE, CHAIN, BASE_ID_OPEN } from './constant'
import { TribeData } from './interface'

export function useMain() {
  const base = inject<ComputedRef<{ id: string, parentId: string }>>(BASE, computed(() => ({
    id: '',
    parentId: ''
  })))

  const openId = inject<(id: string) => void>(BASE_ID_OPEN)

  const updateChain = (name: string) => {
    const lastChainItem = chain.value[chain.value.length - 1]
    lastChainItem.label = name
  }

  return {
    base,
    openId,
    chain,
    updateChain
  }
}

這樣,在內(nèi)容展示模塊就可以使用這些基本信息和方法了逆航。

補充:
最近遇到了這樣一個場景(如下圖)

[圖片上傳失敗...(image-4f9ae9-1658375271104)]

頁面上的表格和彈窗中的表格其實會調(diào)同一個接口鼎文,由于頁面上可操作這個表格,進行新增因俐、編輯和刪除等拇惋,而彈窗中的表格是全量數(shù)據(jù)(先不談?wù)故緝?yōu)化)

因此,為保證彈窗中的表格數(shù)據(jù)要與頁面的保持一致抹剩,需要每彈出一次彈窗就要調(diào)一下全量數(shù)據(jù)的接口撑帖。

但是根據(jù)需求分析,有一些狀態(tài)下澳眷,頁面表格是不可操作狀態(tài)的胡嘿,也就意味著,彈窗數(shù)據(jù)不會發(fā)生變化钳踊,此時衷敌,就可以將請求返回的數(shù)據(jù)緩存起來,不必每次點擊查看就發(fā)起請求了箍土。

// use_cache.ts

import { computed, ref, watch, reactive } from 'vue'

import { getXXX } from './data_XXX'
import { showError } from '@/XXX'
import type { IXXX } from './interface'

// 頁面數(shù)據(jù)緩存池
export const poolList: Record<number, IXXX[]> = {}

// 用于顯示更多信息
export function useCache() {
  // 是否發(fā)請求
  const noCache = ref<boolean>(true)
  // 區(qū)分?jǐn)?shù)據(jù)緩存池中不同數(shù)據(jù)的標(biāo)識
  const cacheId = ref<number | undefined>()

  const cache = reactive<Array<ISpecFunc>>([])

  async function echo() {
    const id = cacheId.value
    if (id === undefined) { return }
    if (noCache.value && !(poolList[id])) {
      try {
        const ret = await getXXX({
          id,
          current: -1
        })
        poolList[id] = ret.list
        Object.assign(cache, ret.list)
      } catch (err) {
        showError(err)
      }
    }
  }

  return {
    noCache,
    cacheId,
    cache,
    echo
  }
}

// 彈窗
<script lang="ts" setup>

import { watch, computed } from 'vue'

import { useCache } from './use_cache'

const { noCache, cacheId, cache, echo } = useSpecCache()

const props = defineProps<{
  noCache: boolean
  specId: number | undefined
  visible: boolean
}>()
watch(
  () => props.visible,
  (val) => {
    if (val) {
      noCache.value = props.noCache
      cacheId.value = props.specId as number
      echo()
    }
  }
)
const isVisible = computed(() => props.visible)

const emit = defineEmits<{
  (event: 'close'): void,
}>()

const onclose = () => {
  emit('close')
}
</script>

<template>
  <el-dialog
    v-model="isVisible"
    width="860px"
    @close="onclose"
  >
      ...
  </el-dialog>
</template>

如果后臺配合的話逢享,還可以做的更多,比如后臺返回一個數(shù)據(jù)id吴藻,記錄這份數(shù)據(jù)的更新瞒爬,每一次更新都會改變這個字段,這樣就可以將這個字段與cacheId組合起來區(qū)分?jǐn)?shù)據(jù)緩存池中的不同數(shù)據(jù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沟堡,一起剝皮案震驚了整個濱河市侧但,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌航罗,老刑警劉巖禀横,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異粥血,居然都是意外死亡柏锄,警方通過查閱死者的電腦和手機酿箭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趾娃,“玉大人缭嫡,你說我怎么就攤上這事√疲” “怎么了妇蛀?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長笤成。 經(jīng)常有香客問我评架,道長,這世上最難降的妖魔是什么炕泳? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任纵诞,我火速辦了婚禮,結(jié)果婚禮上喊崖,老公的妹妹穿的比我還像新娘挣磨。我一直安慰自己,他們只是感情好荤懂,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布茁裙。 她就那樣靜靜地躺著,像睡著了一般节仿。 火紅的嫁衣襯著肌膚如雪晤锥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天廊宪,我揣著相機與錄音矾瘾,去河邊找鬼。 笑死箭启,一個胖子當(dāng)著我的面吹牛壕翩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播傅寡,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼放妈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了荐操?” 一聲冷哼從身側(cè)響起芜抒,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎托启,沒想到半個月后宅倒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡屯耸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年拐迁,在試婚紗的時候發(fā)現(xiàn)自己被綠了蹭劈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡唠亚,死狀恐怖链方,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情灶搜,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布工窍,位于F島的核電站割卖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏患雏。R本人自食惡果不足惜鹏溯,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淹仑。 院中可真熱鬧丙挽,春花似錦、人聲如沸匀借。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吓肋。三九已至凳怨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間是鬼,已是汗流浹背肤舞。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留均蜜,地道東北人李剖。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像囤耳,于是被迫代替她去往敵國和親篙顺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容