成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

把Vue3模板復(fù)用玩到了極致,少封裝幾十個組件!

開發(fā)
最近在做 Vue3 項目的時候,在思考一個小問題:有沒有辦法,可以不抽取成組件呢?我可以在當(dāng)前組件里去提取嗎,而不需要去重新定義一個組件呢?

 普通的場景

最近在做 Vue3 項目的時候,在思考一個小問題,其實是每個人都做過的一個場景,很簡單,看下方代碼:

其實就是一個普通的不能再普通的循環(huán)遍歷渲染的案例,咱們往下接著看,如果這樣的遍歷在同一個組件里出現(xiàn)了很多次,比如下方代碼:

這個時候我們應(yīng)該咋辦呢?誒!很多人很快就能想出來了,那就是把循環(huán)的項抽取出來成一個組件,這樣就能減少很多代碼量了,比如我抽取成 Item.vue 這個組件:

然后直接可以引用并使用它,這樣大大減少了代碼量,并且統(tǒng)一管理,提高代碼可維護性!??!

不難受嗎?

但是我事后越想越難受,就一個這么丁點代碼量的我都得抽取成組件,那我不敢想象以后我的項目組件數(shù)會多到什么地步,而且組件粒度太細,確實也增加了后面開發(fā)者的負擔(dān)~

那么有沒有辦法,可以不抽取成組件呢?我可以在當(dāng)前組件里去提取嗎,而不需要去重新定義一個組件呢?例如下面的效果:

useTemplate 代碼實現(xiàn)

想到這,馬上行動起來,需要封裝一個 useTemplate來實現(xiàn)這個功能:

用的不爽

盡管做到這個地步,我還是覺得用的不爽,因為沒有類型提示:

我們想要的是比較爽的使用,那肯定得把類型的提示給支持上?。。。∮谑墙o useTemplate 加上泛型?。〖由现缶陀蓄愋吞崾纠瞺~~~

加上泛型后的 useTemplate 代碼如下:

完整代碼

import { defineComponent, shallowRef } from 'vue';

import { camelCase } from 'lodash';
import type { DefineComponent, Slot } from 'vue';

// 將橫線命名轉(zhuǎn)大小駝峰
function keysToCamelKebabCase(obj: Record<string, any>) {
  const newObj: typeof obj = {};
  for (const key in obj) newObj[camelCase(key)] = obj[key];
  return newObj;
}

export type DefineTemplateComponent<
  Bindings extends object,
  Slots extends Record<string, Slot | undefined>,
> = DefineComponent<object> & {
  new (): { $slots: { default(_: Bindings & { $slots: Slots }): any } };
};

export type ReuseTemplateComponent<
  Bindings extends object,
  Slots extends Record<string, Slot | undefined>,
> = DefineComponent<Bindings> & {
  new (): { $slots: Slots };
};

export type ReusableTemplatePair<
  Bindings extends object,
  Slots extends Record<string, Slot | undefined>,
> = [DefineTemplateComponent<Bindings, Slots>, ReuseTemplateComponent<Bindings, Slots>];

export const useTemplate = <
  Bindings extends object,
  Slots extends Record<string, Slot | undefined> = Record<string, Slot | undefined>,
>(): ReusableTemplatePair<Bindings, Slots> => {
  const render = shallowRef<Slot | undefined>();

  const define = defineComponent({
    setup(_, { slots }) {
      return () => {
        // 將復(fù)用模板的渲染函數(shù)內(nèi)容保存起來
        render.value = slots.default;
      };
    },
  }) as DefineTemplateComponent<Bindings, Slots>;

  const reuse = defineComponent({
    setup(_, { attrs, slots }) {
      return () => {
        // 還沒定義復(fù)用模板,則拋出錯誤
        if (!render.value) {
          throw new Error('你還沒定義復(fù)用模板呢!');
        }
        // 執(zhí)行渲染函數(shù),傳入 attrs、slots
        const vnode = render.value({ ...keysToCamelKebabCase(attrs), $slots: slots });
        return vnode.length === 1 ? vnode[0] : vnode;
      };
    },
  }) as ReuseTemplateComponent<Bindings, Slots>;

  return [define, reuse];
};
責(zé)任編輯:趙寧寧 來源: 前端之神
相關(guān)推薦

2022-08-14 09:00:00

JWT 令牌憑證微服務(wù)

2020-10-29 07:17:37

雪崩系統(tǒng)服務(wù)

2025-05-13 08:20:00

Vue3前端動效組件庫

2025-06-06 10:12:12

2022-06-20 19:39:31

微服務(wù)registry通信

2021-03-31 10:36:33

Python面試題開發(fā)

2021-09-18 10:07:23

開發(fā)技能代碼

2025-02-25 08:51:19

2021-05-25 13:52:46

設(shè)計師作品面試

2022-04-16 21:32:03

GitHub攻擊OAuth

2020-07-06 11:25:10

設(shè)計師圖像列表布局

2021-08-21 15:11:31

微信內(nèi)存功能

2024-01-16 12:46:00

Vue3API開發(fā)

2024-12-01 00:52:04

2024-07-30 08:59:22

2021-12-06 10:07:48

開源項目Vue3

2023-06-26 08:20:02

openapi格式注解

2024-09-25 08:09:22

Java新增特性版本發(fā)布

2020-11-12 08:32:14

Vue3模板優(yōu)化

2022-09-20 11:00:14

Vue3滾動組件
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 手机av免费在线 | 午夜ww | 国产黄色大片在线免费观看 | 99精品免费久久久久久日本 | 国产欧美一区二区三区久久手机版 | 日韩一区二区三区在线视频 | 毛片免费看 | 亚洲一区二区三区免费在线观看 | 国产一级电影在线 | 国产高清视频在线观看 | 精品日韩一区 | 午夜精品久久久 | 成人影院一区二区三区 | 亚洲一区二区三区免费观看 | 国产精品美女久久久久久不卡 | 中文字幕 国产精品 | 国产成人精品久久二区二区91 | 日韩免费三级 | 美女在线观看国产 | 国产精品伦理一区 | 久久免费国产 | 欧美激情一区二区 | 免费观看av网站 | 国产精品精品久久久 | 污视频在线免费观看 | 国产精品国产a | 在线一区视频 | 成人国产毛片 | 视频一区二区中文字幕日韩 | 99国内精品久久久久久久 | 欧美精品一区二区三区一线天视频 | 成人网视频 | 久久综合久久自在自线精品自 | 久久久tv | 九九九视频 | 日韩av一区二区在线观看 | 超碰在线人人 | 中文字幕在线观看日韩 | 1级毛片 | 欧美日韩精品中文字幕 | 国产片一区二区三区 |