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

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

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

 普通的場(chǎng)景

最近在做 Vue3 項(xiàng)目的時(shí)候,在思考一個(gè)小問(wèn)題,其實(shí)是每個(gè)人都做過(guò)的一個(gè)場(chǎng)景,很簡(jiǎn)單,看下方代碼:

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

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

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

不難受嗎?

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

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

useTemplate 代碼實(shí)現(xiàn)

想到這,馬上行動(dòng)起來(lái),需要封裝一個(gè) useTemplate來(lái)實(shí)現(xiàn)這個(gè)功能:

用的不爽

盡管做到這個(gè)地步,我還是覺(jué)得用的不爽,因?yàn)闆](méi)有類(lèi)型提示:

我們想要的是比較爽的使用,那肯定得把類(lèi)型的提示給支持上啊!!!于是給 useTemplate 加上泛型!!加上之后就有類(lèi)型提示啦~~~~

加上泛型后的 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)容保存起來(lái)
        render.value = slots.default;
      };
    },
  }) as DefineTemplateComponent<Bindings, Slots>;

  const reuse = defineComponent({
    setup(_, { attrs, slots }) {
      return () => {
        // 還沒(méi)定義復(fù)用模板,則拋出錯(cuò)誤
        if (!render.value) {
          throw new Error('你還沒(méi)定義復(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é)任編輯:趙寧寧 來(lái)源: 前端之神
相關(guān)推薦

2020-10-29 07:17:37

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

2022-08-14 09:00:00

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

2025-05-13 08:20:00

Vue3前端動(dòng)效組件庫(kù)

2022-06-20 19:39:31

微服務(wù)registry通信

2025-06-06 10:12:12

2021-03-31 10:36:33

Python面試題開(kāi)發(fā)

2025-02-25 08:51:19

2021-09-18 10:07:23

開(kāi)發(fā)技能代碼

2022-04-16 21:32:03

GitHub攻擊OAuth

2021-05-25 13:52:46

設(shè)計(jì)師作品面試

2024-12-01 00:52:04

2020-07-06 11:25:10

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

2021-08-21 15:11:31

微信內(nèi)存功能

2024-01-16 12:46:00

Vue3API開(kāi)發(fā)

2024-07-30 08:59:22

2021-12-06 10:07:48

開(kāi)源項(xiàng)目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滾動(dòng)組件
點(diǎn)贊
收藏

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

主站蜘蛛池模板: www.9191.com| 久久精品国产精品青草 | 欧美一区二区三区在线看 | 中文字幕免费 | 久久精品av | 九九热在线视频观看这里只有精品 | 国产目拍亚洲精品99久久精品 | 国产免费av在线 | 精品日韩一区 | 亚洲一区在线日韩在线深爱 | 国产一区二区在线91 | 国产精品久久久久久久久久三级 | 中文字幕三区 | 欧美精品第一页 | 91色视频在线观看 | 成人a免费| 久久精品免费一区二区三 | 国产成人精品免费视频大全最热 | 国产在线一区二区三区 | 欧美一区二区视频 | 国产精品1区 | 国产一二三区电影 | 久久精品二区 | 一区二区精品 | 亚洲 中文 欧美 日韩 在线观看 | 丁香五月缴情综合网 | 亚洲欧洲在线视频 | 一区二区三区欧美大片 | 伊人无码高清 | 日本一区视频在线观看 | 午夜看看| 国产乱码精品一区二区三区五月婷 | 免费一区 | 国产精品揄拍一区二区久久国内亚洲精 | 日韩一级欧美一级 | 一区二区三区亚洲 | 91最新在线视频 | 91在线第一页 | 久久出精品 | 久久久精品一区 | 国产精品久久久久久久久免费樱桃 |