国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

vue3組件二次封裝Ui處理

這篇具有很好參考價(jià)值的文章主要介紹了vue3組件二次封裝Ui處理。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

vue 組件二次封裝Ui處理

vue 組件二次封裝Ui處理

在Vue開發(fā)中,我們常常需要使用UI框架提供的組件。但是UI框架的組件可能并不符合我們的需求,這時(shí)候就需要進(jìn)行二次封裝。下面是一些關(guān)于Vue組件二次封裝Ui處理的技巧:

常規(guī)時(shí)候咱們使用組件的props、events、slot等屬性的傳遞

子組件代碼:

<template>
  <div class="my-input">
    <el-input></el-input>
  </div>
</template>

<script setup>
export default {
  props:[]
}
</script>

<style scoped>
.my-input {
  transition: 0.3s;
}
.my-input:hover,
.my-input:focus-within {
  filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.3));
}
</style>

父組件使用:

<my-input v-model="value"></my-input>

如果使用props接收弊端:

  1. 基本上組件不會(huì)只有一兩個(gè)屬性,屬性多的話接收的數(shù)據(jù)量多,需要寫大量的無用代碼
  2. 如果存在多級(jí)組件嵌套傳值,又是重復(fù)代碼,并且維護(hù)性差

$attrs 和$listeners 解決數(shù)據(jù)穿透問題

因?yàn)関ue2和vue3有些不同咱分開講:

vue2的介紹和使用:

vue3組件二次封裝Ui處理

上面感覺很難懂:簡(jiǎn)單來說就是**$attrs** 接收傳遞過來的props的值。**$listeners** 當(dāng) inheritAttrs:true 繼承除props之外的所有屬性;inheritAttrs:false 只繼承class屬性

vue2的代碼:

father.vue 組件:

<template>
   <child :name="name" :age="age" :infoObj="infoObj" @updateInfo="updateInfo" @delInfo="TodelInfo" />
</template>
<script>
    import Child from '../components/child.vue'

    export default {
        name: 'father',
        components: { Child },
        data () {
            return {
                name: 'zhangyangguang',
                age: 24,
                infoObj: {
                    from: '濟(jì)南',
                    job: 'policeman',
                    hobby: ['reading', 'writing', 'skating']
                }
            }
        },
        methods: {
            updateInfo() {
                console.log('update info');
            },
            TodelInfo() {
                console.log('delete info');
            }
        }
    }
</script>

child.vue 組件:

<template>
    <son :height="height" :weight="weight" @addInfo="addInfo" v-bind="$attrs" v-on="$listeners"  />
    // 通過 $listeners 將父作用域中的事件,傳入 grandSon 組件,使其可以獲取到 father 中的事件
</template>
<script>
    import Son from '../components/Son.vue'
    export default {
        name: 'child',
        components: { Son },
        props: ['name'],
        data() {
          return {
              height: '183cm',
              weight: '76kg'
          };
        },
        created() {
            console.log(this.$attrs); 
       // 結(jié)果:age, infoObj, 因?yàn)楦附M件共傳來name, age, infoObj三個(gè)值,由于name被 props接收了,所以只有age, infoObj屬性
            console.log(this.$listeners); // updateInfo: f, TodelInfo: f
        },
        methods: {
            addInfo () {
                console.log('add info')
            }
        }
    }
</script>

son.vue 組件:

<template>
    <div>
        {{ $attrs }} --- {{ $listeners }}
    <div>
</template>
<script>
    export default {
        ... ... 
        props: ['weight'],
        created() {
            console.log(this.$attrs); // age, infoObj, height 
            console.log(this.$listeners) // updateInfo: f, TodelInfo: f, addInfo: f
            this.$emit('updateInfo') // 可以觸發(fā) father 組件中的updateInfo函數(shù)
        }
    }
</script>

一般不常用,可讀性不是很好。但是組件嵌套層比較深,props很繁瑣,可以使用。

vue3的使用和介紹:
vue3組件二次封裝Ui處理
vue3組件二次封裝Ui處理

代碼:

<template>
  <div class="my-input">
    <el-input v-bind="$attrs"></el-input>
  </div>
</template>

<script setup></script>

<style scoped>
.my-input {
  transition: 0.3s;
}
.my-input:hover,
.my-input:focus-within {
  filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.3));
}
</style>

直接 通過**$attrs** 接收屬性和方法。后面在詳細(xì)介紹vue3的Attributes

這樣到這里已經(jīng)解決屬性和方法的問題了。

解決傳值和方法問題,還有一個(gè)slot插槽

比如elementPlus的input 有如下插槽:
vue3組件二次封裝Ui處理

初步解決方法:

封裝組件里定義對(duì)應(yīng)數(shù)量的插槽然后再次傳遞

<template>
  <div class="my-input">
    <el-input v-bind="$attrs">
      <template #prefix>
        <slot name="prefix"></slot>
      </template>
      <template #suffix>
        <slot name="suffix"></slot>
      </template>
      <template #prepend>
        <slot name="prepend"></slot>
      </template>
      <template #append>
        <slot name="append"></slot>
      </template>
    </el-input>
  </div>
</template>

<script setup></script>

<style scoped>
.my-input {
  transition: 0.3s;
}
.my-input:hover,
.my-input:focus-within {
  filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.3));
}
</style>

這里定義了四個(gè)插槽然后再次傳遞,確實(shí)解決了插槽問題。但是使用的組件不一定會(huì)使用全部的插槽。如果使用一個(gè)那咱們封裝的組件就把其他插槽給傳遞了過去。這樣很不保險(xiǎn),并且也不對(duì)

解決思路:父級(jí)傳遞幾個(gè)插槽,咱就傳遞幾個(gè)給子組件,不全部傳遞

進(jìn)階解決方法:使用$slots

vue3組件二次封裝Ui處理

也就是說**$slots**可以獲取父級(jí)組件傳遞的插槽。

vue3代碼:

<template>
  <div class="my-input">
    <el-input v-bind="$attrs">
      <template v-for="(val, name) in $slots" #[name]="slotData">
        <slot :name="name" v-bind="slotData || {}"></slot>
      </template>
    </el-input>
  </div>
</template>

<script>
export default {
  created() {
    console.log(this.$slots);
  },
};
</script>

<style scoped>
.my-input {
  transition: 0.3s;
}
.my-input:hover,
.my-input:focus-within {
  filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.3));
}
</style>

這樣就是父級(jí)傳遞啥那就傳遞啥插槽。到此解決了插槽問題。

到這里還有個(gè)最難的**ref 問題:**

因?yàn)閞ef只能作用于當(dāng)前無法作用到孫組件

對(duì)于ref傳遞問題vue無法解決。但是咱可以換一個(gè)思路。使用ref無非是為了使用孫組件暴露的一些方法。那咱就可以吧孫組件的方法提取到子組件

說白了吧孫組件的方法提取到當(dāng)前實(shí)例

代碼:

<template>
  <div class="my-input">
    <el-input ref="inp" v-bind="$attrs">
      <template v-for="(val, name) in $slots" #[name]="slotData">
        <slot :name="name" v-bind="slotData || {}"></slot>
      </template>
    </el-input>
  </div>
</template>

<script>
export default {
  created() {
    console.log(this.$slots);
  },
  mounted() {
    console.log(this.$refs.inp);
    const entries = Object.entries(this.$refs.inp);
    for (const [key, value] of entries) {
      this[key] = value;
    }
  },
};
</script>

<style scoped>
.my-input {
  transition: 0.3s;
}
.my-input:hover,
.my-input:focus-within {
  filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.3));
}
</style>

這樣就完美解決了組件的Ui封裝。

以上是一些關(guān)于Vue組件二次封裝Ui處理的技巧。通過二次封裝,我們可以更好地滿足我們的需求,提高開發(fā)效率。文章來源地址http://www.zghlxwxcb.cn/news/detail-413336.html

到了這里,關(guān)于vue3組件二次封裝Ui處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • element ui多選下拉組件(el-select)tag數(shù)量過多處理解決辦法(二次封裝)

    element ui多選下拉組件(el-select)tag數(shù)量過多處理解決辦法(二次封裝)

    如下圖所示,當(dāng)標(biāo)簽選擇過多時(shí),會(huì)占用過多空間 期待效果:超過n行就自動(dòng)省略,并可以進(jìn)行展開收起,下圖是實(shí)現(xiàn)后的效果圖 實(shí)現(xiàn)分析: 通過extends繼承el-select組件 將select源碼的template部分粘貼到封裝的組件中,以此來操作展開、收起等需要操作dom的部分 監(jiān)聽selected(已選擇

    2024年02月13日
    瀏覽(26)
  • vue3封裝element-ui-plus組件

    vue3封裝element-ui-plus組件

    最近看視頻學(xué)習(xí)封裝公共組件,將學(xué)習(xí)的內(nèi)容記錄以下,方便以后cv。 下面跟未來的自己說: ? ? ? ? 先說思路再放代碼嗷,我怕你以后忘了。要cv直接往最后拉。 思路: ? ? ? ? 其實(shí)主要是通過slot去接收父組件傳遞過來的模板。父組件引用了組件件,往里面?zhèn)髁藗€(gè)表單,

    2024年02月09日
    瀏覽(16)
  • Vue3+element-ui + TS封裝全局分頁組件

    本文介紹了如何使用Vue3、element-ui和TypeScript封裝一個(gè)全局分頁組件。 在開始之前,你需要安裝以下環(huán)境: Vue3 element-ui TypeScript 這個(gè)分頁組件提供以下功能: 支持自定義每頁顯示條數(shù) 支持自定義跳轉(zhuǎn)到指定頁碼 支持顯示總頁數(shù)和總條數(shù) 支持自定義樣式 分頁組件結(jié)構(gòu) 分頁組

    2024年02月12日
    瀏覽(24)
  • vue+element-ui el-table組件二次封裝實(shí)現(xiàn)虛擬滾動(dòng),解決數(shù)據(jù)量大渲染DOM過多而卡頓問題

    vue+element-ui el-table組件二次封裝實(shí)現(xiàn)虛擬滾動(dòng),解決數(shù)據(jù)量大渲染DOM過多而卡頓問題

    某些頁面不做分頁時(shí),當(dāng)數(shù)據(jù)過多,會(huì)導(dǎo)致頁面卡頓,甚至卡死 一、固定一個(gè) 可視區(qū)域 的大小并且其大小是不變的,那么要做到性能最大化就需要盡量少地渲染 DOM 元素,而這個(gè)最小值也就是可視范圍內(nèi)需要展示的內(nèi)容,而可視區(qū)域之外的元素均可以不做渲染。 二、如何計(jì)

    2024年02月10日
    瀏覽(18)
  • vue3 + vite自定義封裝vue + element-ui 表格組件,發(fā)布到npm包的全過程。

    vue3 + vite自定義封裝vue + element-ui 表格組件,發(fā)布到npm包的全過程。

    當(dāng)我們項(xiàng)目中用到的表格太多的話,就會(huì)導(dǎo)致我們的代碼量一直增加,所以我們要封裝一個(gè)公共得組件,通過傳參引入來使用,下面這篇文章主要給大家介紹了關(guān)于vue3+vite自定義封裝vue組件發(fā)布到npm包的相關(guān)資料,需要的朋友可以參考下。 提示我們要安裝 create-vite@4.1.0 得依賴

    2024年02月02日
    瀏覽(26)
  • element ui 表格組件與分頁組件的二次封裝

    element ui 表格組件與分頁組件的二次封裝

    目錄 效果圖? 組件封裝 ?parseTime函數(shù) debounce?函數(shù) render通用渲染模版 頁面使用 【擴(kuò)展】vue 函數(shù)式組件 函數(shù)式組件特點(diǎn): 函數(shù)式組件的優(yōu)點(diǎn): 【擴(kuò)展】vue中的render函數(shù) 一、初步認(rèn)識(shí)render函數(shù) 二、為什么使用render函數(shù) 三、render函數(shù)的解析 【擴(kuò)展】添加操作欄顯示權(quán)限 結(jié)構(gòu)

    2024年02月08日
    瀏覽(26)
  • Vue-組件二次封裝

    Vue-組件二次封裝

    本次對(duì) el-input 進(jìn)行簡(jiǎn)單封裝進(jìn)行演示 封裝很簡(jiǎn)單,就給激活樣式的邊框(主要是功能) 本次封裝主要使用到vue自帶的幾個(gè)對(duì)象 $attrs:獲取綁定在組件上的所有屬性 $listeners: 獲取綁定在組件上的所有函數(shù)方法 $slots: 獲取應(yīng)用在組件內(nèi)的所有插槽 element 的input組件有很多屬性,

    2024年02月14日
    瀏覽(22)
  • Vue3中搜索表單的二次封裝

    最近使用Vue3+ElementPlus開發(fā)項(xiàng)目,從整體上構(gòu)思組件的封裝。能寫成組件的內(nèi)容都進(jìn)行封裝,方便多個(gè)地方使用。 受AntDesign的啟發(fā),在項(xiàng)目中有搜索表單+table+分頁的地方可以封裝為一個(gè)組件,只需要對(duì)組件傳入table的列,組成一個(gè)配置項(xiàng),通過配置可以顯示搜索表單、table項(xiàng)的

    2024年02月11日
    瀏覽(85)
  • element-ui中二次封裝一個(gè)帶select的form組件
  • Vue3和TypeScript下基于Axios的二次封裝教程

    Vue3和TypeScript下基于Axios的二次封裝教程

    學(xué)習(xí)如何在Vue3項(xiàng)目中使用TypeScript和Axios進(jìn)行二次封裝,實(shí)現(xiàn)更靈活的網(wǎng)絡(luò)請(qǐng)求處理。詳細(xì)教程包括攔截器設(shè)置和類型擴(kuò)展。

    2024年02月05日
    瀏覽(584)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包