Vue中對(duì)組件二開解決思路以及方案
一、背景
在對(duì)antdv、element、自定義組件二開過(guò)程中,最困擾的問(wèn)題如下:??
- 組件那么多屬性我如何傳遞,props? v-model?屬性多的話透?jìng)饔悬c(diǎn)呆。
- 組件提供的多個(gè)事件怎么調(diào)用?emit? 事件多的情況下代碼冗余。
- 組件提供的方法怎么調(diào)用?ref 父子間并不能透?jìng)?。但這個(gè)在react里很方便。
- solt怎么處理,一個(gè)個(gè)自己定義透?jìng)鲉幔孔饔糜虿宀?、具名插槽很多的話怎么處理?/li>
這個(gè)是準(zhǔn)備去做二開UI組件的時(shí)候,遇到的幾個(gè)不能一下子就能打開思路的問(wèn)題;
二、解決思路以及方案
前兩個(gè)問(wèn)題比較簡(jiǎn)單,利用$attts和$listeners兩個(gè)組件屬性就能解決。
a. $attts :繼承所有的父組件屬性 (除了 prop 傳遞的屬性、class 和 style ) **,一般用在子組件的子元素上;
b $listeners:它是一個(gè)對(duì)象,里面包含了作用在這個(gè)組件上的所有監(jiān)聽(tīng)器,你就可以配合v-on="$listeners"將所有的事件監(jiān)聽(tīng)器指向這個(gè)組件的某個(gè)特定的子元素。(相當(dāng)于子組件繼承父組件的事件)
<templete>
<div>
<div>{{ text }}</div>
<el-input v-bind="$attts" v-on="$listeners" placeholder="請(qǐng)輸入內(nèi)容"></el-input>
</div>
</templete>
<script>
export default {
props:{
text:String,
}
mounted(){
console.log(this.$attrs)
}
}
</script>
<templete>
<div>
<child type="text" v-model="input" text @blur="onBlur"></div>
</div>
</templete>
<script>
export default {
data() {
return {
input: '',
text:'子組件的props'
}
},
methods:{
onBlur(){
// ...
}
}
}
</script>
關(guān)于調(diào)用子組件中的方法(子組件拿不到父組件的ref),網(wǎng)上也看到了很多方案,從便捷度來(lái)說(shuō),我個(gè)人更傾向于將方法直接綁定在組件實(shí)例上。
tips:** 善用object中的entries**,返回Array<[key:string, value:any?]>類型的二維數(shù)組
<templete>
<div>
<child ref="childRef" type="text" v-model="input" text @blur="onBlur"></div>
</div>
</templete>
<script>
export default {
data() {
return {
input: '',
text:'子組件的props'
}
},
mounted(){
console.log(this.$ref.childRef)
},
methods:{
onBlur(){
// ...
}
}
}
</script>
<templete>
<div>
<div>{{ text }}</div>
<el-input ref="inpRef" v-bind="$attts" v-on="$listeners" placeholder="請(qǐng)輸入內(nèi)容"></el-input>
</div>
</templete>
<script>
export default {
props:{
text:String,
}
mounted(){
console.log(this.$attrs)
// 綁定ref到組件實(shí)例上
const entries = Object.entries(this.$ref.inpRef)
for(const [key, value] of entries){
this[key] = value;
}
}
</script>
插槽主要用的$slots,這邊對(duì)作用域插槽數(shù)據(jù)做了兜底,不然會(huì)報(bào)錯(cuò);
tips: 在vue模版中遍歷對(duì)象**,會(huì)拿到* value、name*兩個(gè)值
<templete>
<div>
<child ref="childRef" type="text" v-model="input" text @blur="onBlur">
<template slot="prepend">Http://</template>
</child>
</div>
</templete>
<script>
export default {
data() {
return {
input: '',
text:'子組件的props'
}
},
mounted(){
console.log(this.$ref.childRef)
},
methods:{
onBlur(){
// ...
}
}
}
</script>
<templete>
<div>
<div>{{ text }}</div>
<el-input ref="inpRef" v-bind="$attts" v-on="$listeners" placeholder="請(qǐng)輸入內(nèi)容">
<templete v-for="(value, name) in $slot" #[name]="slotData">
<slot :name="name" v-bind = "slotData || {}"></slot>
</templete>
</el-input>
</div>
</templete>
<script>
export default {
props:{
text:String,
}
mounted(){
console.log(this.$attrs)
// 綁定ref到組件示例上
const entries = Object.entries(this.$ref.inpRef)
for(const [key, value] of entries){
this[key] = value;
}
}
</script>
到此這篇關(guān)于Vue中對(duì)組件二開解決思路以及方案的文章就介紹到這了,更多相關(guān)Vue組件二開內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談ElementUI el-select 數(shù)據(jù)過(guò)多解決辦法
下拉框的選項(xiàng)很多,上萬(wàn)個(gè)選項(xiàng)甚至更多,這個(gè)時(shí)候如果全部把數(shù)據(jù)放到下拉框中渲染出來(lái),瀏覽器會(huì)卡死,體驗(yàn)會(huì)特別不好,本文主要介紹了ElementUI el-select 數(shù)據(jù)過(guò)多解決辦法,感興趣的可以了解一下2021-09-09
解決在el-dialog中無(wú)法正確獲取DOM的問(wèn)題
這篇文章主要介紹了解決在el-dialog中無(wú)法正確獲取DOM的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
vue2.0路由切換后頁(yè)面滾動(dòng)位置不變BUG的解決方法
下面小編就為大家分享一篇vue2.0路由切換后頁(yè)面滾動(dòng)位置不變BUG的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
vue如何通過(guò)id從列表頁(yè)跳轉(zhuǎn)到對(duì)應(yīng)的詳情頁(yè)
這篇文章主要介紹了vue如何通過(guò)id從列表頁(yè)跳轉(zhuǎn)到對(duì)應(yīng)的詳情頁(yè) ,需要的朋友可以參考下2018-05-05
前端+接口請(qǐng)求實(shí)現(xiàn)vue動(dòng)態(tài)路由
在Vue應(yīng)用中,結(jié)合前端和后端接口請(qǐng)求實(shí)現(xiàn)動(dòng)態(tài)路由,可根據(jù)用戶權(quán)限動(dòng)態(tài)生成路由,提高安全性與靈活性,本文就來(lái)介紹一下前端+接口請(qǐng)求實(shí)現(xiàn)vue動(dòng)態(tài)路由,感興趣的可以了解一下2024-09-09
解讀計(jì)算屬性和watch監(jiān)聽(tīng)的區(qū)別及說(shuō)明
計(jì)算屬性是基于它們的依賴進(jìn)行緩存的,只有在它的相關(guān)依賴發(fā)生改變時(shí)才會(huì)重新求值,而watch則是一個(gè)更為通用的監(jiān)聽(tīng)器,它可以在數(shù)據(jù)變化時(shí)執(zhí)行異步操作或開銷較大的操作2025-01-01
Vue.js上下滾動(dòng)加載組件的實(shí)例代碼
本篇文章主要介紹了Vue.js上下滾動(dòng)加載組件的實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07

