AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

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

來源: 責(zé)編: 時(shí)間:2024-01-22 08:42:34 252觀看
導(dǎo)讀 普通的場景最近在做 Vue3 項(xiàng)目的時(shí)候,在思考一個(gè)小問題,其實(shí)是每個(gè)人都做過的一個(gè)場景,很簡單,看下方代碼:其實(shí)就是一個(gè)普通的不能再普通的循環(huán)遍歷渲染的案例,咱們往下接著看,如果這樣的遍歷在同一個(gè)組件里出現(xiàn)了很多次,比

 普通的場景

最近在做 Vue3 項(xiàng)目的時(shí)候,在思考一個(gè)小問題,其實(shí)是每個(gè)人都做過的一個(gè)場景,很簡單,看下方代碼:PSW28資訊網(wǎng)——每日最新資訊28at.com

PSW28資訊網(wǎng)——每日最新資訊28at.com

其實(shí)就是一個(gè)普通的不能再普通的循環(huán)遍歷渲染的案例,咱們往下接著看,如果這樣的遍歷在同一個(gè)組件里出現(xiàn)了很多次,比如下方代碼:PSW28資訊網(wǎng)——每日最新資訊28at.com

PSW28資訊網(wǎng)——每日最新資訊28at.com

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

PSW28資訊網(wǎng)——每日最新資訊28at.com

然后直接可以引用并使用它,這樣大大減少了代碼量,并且統(tǒng)一管理,提高代碼可維護(hù)性!!!PSW28資訊網(wǎng)——每日最新資訊28at.com

PSW28資訊網(wǎng)——每日最新資訊28at.com

不難受嗎?

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

那么有沒有辦法,可以不抽取成組件呢?我可以在當(dāng)前組件里去提取嗎,而不需要去重新定義一個(gè)組件呢?例如下面的效果:PSW28資訊網(wǎng)——每日最新資訊28at.com

PSW28資訊網(wǎng)——每日最新資訊28at.com

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

想到這,馬上行動(dòng)起來,需要封裝一個(gè) useTemplate來實(shí)現(xiàn)這個(gè)功能:PSW28資訊網(wǎng)——每日最新資訊28at.com

PSW28資訊網(wǎng)——每日最新資訊28at.com

用的不爽

盡管做到這個(gè)地步,我還是覺得用的不爽,因?yàn)闆]有類型提示:PSW28資訊網(wǎng)——每日最新資訊28at.com

PSW28資訊網(wǎng)——每日最新資訊28at.com

PSW28資訊網(wǎng)——每日最新資訊28at.com

我們想要的是比較爽的使用,那肯定得把類型的提示給支持上啊!!!于是給 useTemplate 加上泛型!!加上之后就有類型提示啦~~~~PSW28資訊網(wǎng)——每日最新資訊28at.com

PSW28資訊網(wǎng)——每日最新資訊28at.com

PSW28資訊網(wǎng)——每日最新資訊28at.com

加上泛型后的 useTemplate 代碼如下:PSW28資訊網(wǎng)——每日最新資訊28at.com

PSW28資訊網(wǎng)——每日最新資訊28at.com

完整代碼

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ù)用模板,則拋出錯(cuò)誤        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];};

本文鏈接:http://www.tebozhan.com/showinfo-26-65873-0.html把Vue3模板復(fù)用玩到了極致,少封裝幾十個(gè)組件!

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Prettier + ESLint + Rust = ?? 快,真是太快了!

下一篇: C++泛型編程:解鎖代碼靈活性的奧秘

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 一加Ace2 Pro真機(jī)揭曉 鈦空灰配色質(zhì)感拉滿

    終于,在經(jīng)過了幾波預(yù)熱之后,一加Ace2 Pro的外觀真機(jī)圖在網(wǎng)上出現(xiàn)了。還是博主數(shù)碼閑聊站曝光的,這次的外觀設(shè)計(jì)還是延續(xù)了一加11的方案,只是細(xì)節(jié)上有了調(diào)整,例如新加入了鈦空灰
  • Golang 中的 io 包詳解:組合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是對Reader和Writer接口的組合,
  • 19個(gè) JavaScript 單行代碼技巧,讓你看起來像個(gè)專業(yè)人士

    今天這篇文章跟大家分享18個(gè)JS單行代碼,你只需花幾分鐘時(shí)間,即可幫助您了解一些您可能不知道的 JS 知識,如果您已經(jīng)知道了,就當(dāng)作復(fù)習(xí)一下,古人云,溫故而知新嘛。現(xiàn)在,我們就開始今
  • 騰訊蓋樓,字節(jié)拆墻

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之&ldquo;想重溫暴刷深淵、30+技能搭配暴搓到爽的游戲體驗(yàn)嗎?一起上晶核,即刻暴打!&rdquo;曾憑借直播騰訊旗下代理格斗游戲《DNF》一
  • 大廠卷向扁平化

    來源:新熵作者丨南枝 編輯丨月見大廠職級不香了。俗話說,兵無常勢,水無常形,互聯(lián)網(wǎng)企業(yè)調(diào)整職級體系并不稀奇。7月13日,淘寶天貓集團(tuán)啟動(dòng)了近年來最大的人力制度改革,目前已形成一
  • 7月4日見!iQOO 11S官宣:“雞血版”驍龍8 Gen2+200W快充加持

    上半年已接近尾聲,截至目前各大品牌旗下的頂級旗艦都已悉數(shù)亮相,而下半年即將推出的頂級旗艦已經(jīng)成為了數(shù)碼圈爆料的主流,其中就包括全新的iQOO 11S系
  • 朋友圈可以修改可見范圍了 蘋果用戶可率先體驗(yàn)

    近日,iOS用戶迎來微信8.0.27正式版更新,除了可更換二維碼背景外,還新增了多項(xiàng)實(shí)用功能。在新版微信中,朋友圈終于可以修改可見范圍,簡單來說就是已發(fā)布的朋友圈
  • 與兆芯合作 聯(lián)想推出全新旗艦版筆記本電腦開天N7系列

    聯(lián)想與兆芯合作推出全新聯(lián)想旗艦版筆記本電腦開天 N7系列。這個(gè)系列采用兆芯KX-6640MA處理器平臺,KX-6640MA 處理器是采用了陸家嘴架構(gòu),16nm 工藝,4 核 4 線
  • 華為舉行春季智慧辦公新品發(fā)布會(huì) 首次推出電子墨水屏平板

    北京時(shí)間2月27日晚,華為在巴塞羅那舉行春季智慧辦公新品發(fā)布會(huì),在海外市場推出之前已經(jīng)在中國市場上市的筆記本、平板、激光打印機(jī)等辦公產(chǎn)品,并首次推出搭載
Top