創(chuàng)建base公共組件

公共模塊

1

基礎模塊參照了vant的思路璃氢,使用bem命名規(guī)范。先創(chuàng)建一個命名空間艺配,這個命名空間返回創(chuàng)建組件函數(shù)與生成命名方法油航。在創(chuàng)建組件函數(shù)中創(chuàng)建nameinstall屬性用于注冊vue組件

創(chuàng)建組件函數(shù)

創(chuàng)建base組件

npm run plop
# 輸入組件名稱得到packages/base模塊

在src文件夾中創(chuàng)建create文件夾并創(chuàng)建component.ts文件用于創(chuàng)建組件方法野建。創(chuàng)建組件與要name屬性和install方法來注冊組件

/**
 * Create a basic component with common options
 */
import { App, defineComponent, ComponentOptionsWithObjectProps } from 'vue'

/**
 *
 * @description 創(chuàng)建組件
 * @export createComponent
 * @param {string} name
 * @return {*} defineComponent
 */
export function createComponent (name: string) {
  return function (sfc: ComponentOptionsWithObjectProps) {
    sfc.name = name
    sfc.install = (app: App) => {
      app.component(name as string, sfc)
      app.component(name), sfc)
    }

    return defineComponent(sfc)
  } as typeof defineComponent
}

因為我們組件名字可能包含多個單詞所以我們把他轉換為駝峰命名法所以創(chuàng)建src/format/string.ts文件來導出駝峰命名函數(shù)

// base/src/format/string.ts

const camelizeRE = /-(\w)/g

/**
 *
 * @description 把-換成駝峰命名
 * @export camelize
 * @param {string} str
 * @return {*}  {string}
 */
export function camelize (str: string): string {
  return str.replace(camelizeRE, (_, c) => c.toUpperCase())
}

// base/src/create/component.ts
import { camelize } from '../format/string'
// 修改這句代碼來轉換為駝峰命名法
app.component(camelize(`-${name}`), sfc)

創(chuàng)建create/bem.ts文件生成bem的函數(shù)

Bem 函數(shù)傳入?yún)?shù)與生成的名字

  • b() // 'button'
  • b('text') // 'button__text'
  • b({ disabled }) // 'button button--disabled'
  • b('text', { disabled }) // 'button__text button__text--disabled'
  • b(['disabled', 'primary']) // 'button button--disabled button--primary'
export type Mod = string | { [key: string]: any };
export type Mods = Mod | Mod[];

function gen (name: string, mods?: Mods): string {
  if (!mods) {
    return ''
  }

  if (typeof mods === 'string') {
    return ` ${name}--${mods}`
  }

  if (Array.isArray(mods)) {
    return mods.reduce<string>((ret, item) => ret + gen(name, item), '')
  }

  return Object.keys(mods).reduce(
    (ret, key) => ret + (mods[key] ? gen(name, key) : ''),
    ''
  )
}

/**
 *
 * @description 創(chuàng)建BEM命名空
 * @export
 * @param {string} name
 * @return {*} string
 */
export function createBEM (name: string) {
  return function (el?: Mods, mods?: Mods): Mods {
    if (el && typeof el !== 'string') {
      mods = el
      el = ''
    }

    el = el ? `${name}__${el}` : name

    return `${el}${gen(el, mods)}`
  }
}

export type BEM = ReturnType<typeof createBEM>;

創(chuàng)建create/index.ts文件罗岖,這個文件導出一個函數(shù)這個函數(shù)有一個參數(shù),這個參數(shù)就是創(chuàng)建組件的名字诅蝶,返回一個數(shù)組退个,這個數(shù)組的第一項是創(chuàng)建組件的方法精肃,第二項就是根據(jù)組件名字創(chuàng)建bem命名規(guī)則的函數(shù)

import { createBEM } from './bem'
import { createComponent } from './component'

/**
 *
 *  @description 創(chuàng)建命名空間
 * @export
 * @param {string} name
 * @return {*} [createComponent(name), createBEM(name)]
 */
export function createNamespace (name: string) {
  name = 'two-' + name
  return [createComponent(name), createBEM(name)] as const
}

后續(xù)的公共的東西也會提取到公共base模塊中

原文地址:https://kspf.xyz/archives/142/

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市帜乞,隨后出現(xiàn)的幾起案子司抱,更是在濱河造成了極大的恐慌,老刑警劉巖黎烈,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件习柠,死亡現(xiàn)場離奇詭異,居然都是意外死亡照棋,警方通過查閱死者的電腦和手機资溃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烈炭,“玉大人溶锭,你說我怎么就攤上這事》叮” “怎么了趴捅?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長霹疫。 經(jīng)常有香客問我拱绑,道長,這世上最難降的妖魔是什么丽蝎? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任猎拨,我火速辦了婚禮,結果婚禮上屠阻,老公的妹妹穿的比我還像新娘红省。我一直安慰自己,他們只是感情好国觉,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布吧恃。 她就那樣靜靜地躺著,像睡著了一般蛉加。 火紅的嫁衣襯著肌膚如雪蚜枢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天针饥,我揣著相機與錄音,去河邊找鬼需频。 笑死丁眼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的昭殉。 我是一名探鬼主播苞七,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼藐守,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蹂风?” 一聲冷哼從身側響起卢厂,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惠啄,沒想到半個月后慎恒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡撵渡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年融柬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片趋距。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡粒氧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出节腐,到底是詐尸還是另有隱情外盯,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布翼雀,位于F島的核電站门怪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏锅纺。R本人自食惡果不足惜掷空,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望囤锉。 院中可真熱鬧坦弟,春花似錦、人聲如沸官地。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驱入。三九已至赤炒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間亏较,已是汗流浹背莺褒。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留雪情,地道東北人遵岩。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尘执。 傳聞我的和親對象是個殘疾皇子舍哄,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

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

  • 前端組件人人都在用,人人都在封裝誊锭。目前已知的幾個大型開源組件庫也并沒有給出具體的封裝規(guī)范表悬。但是根據(jù)其開放的組件樣式...
    yolkpie閱讀 2,170評論 0 1
  • 開始之前 構建一個組件庫需要考慮哪些問題 代碼結構 樣式解決方案 組件需求分析和編碼 自建測試用例分析和編碼 代碼...
    梁某人的劍閱讀 1,267評論 0 0
  • 一 . Ext的組件大致可以分成三大類,即基本組件丧靡、工具欄組件蟆沫、表單及元素組件。 基本組件有: xtype Cl...
    獨自堆雪人閱讀 2,028評論 0 0
  • 簡化 Symbol 的訣竅是平衡動態(tài)元素和約束的使用窘行。這樣可以最小化設計系統(tǒng)中所需的Symbol數(shù)量饥追,以便易于維護...
    iris0327閱讀 6,226評論 0 7
  • JSX 知識準備 JSX 并不是一門全新的語言,僅僅是一個語法糖罐盔,允許開發(fā)者在javascript中編寫XML語言...
    艾倫先生閱讀 4,513評論 4 20