一個孤獨的孩子:我該不該將控制流指令寫入通用結(jié)構(gòu)組件中?
控制流指令,如v-if和v-for,如果在較大項目中,就很有可能會創(chuàng)建一些難以閱讀的嵌套代碼。如果在v-if內(nèi)嵌套了v-for ,剛這個特征就更明顯了。
為了程序員的頭發(fā)著想,我希望大家不要編寫具有多級嵌套代碼。
但是,如果你偏要這么干,那么送你一個技巧,可以以輕松地將這些噩夢轉(zhuǎn)變成童話故事。
一個孤獨的子組件
當(dāng)嵌套開始變多時,如果我還想要保持整潔,我的默認(rèn)做法是將代碼提取到一個新組件中。
使用v-for和v-if,我們把指令中的所有東西都轉(zhuǎn)換成它自己的組件。
舉個例子來看看,我們從這個有嵌套的模板開始
- <template>
- <div>
- <h1>{{ title }}</h2>
- <div class="navigation">
- <!-- ... -->
- </div>
- <div v-for="item in list">
- <h2 class="item-title">
- {{ item.title }}
- </h2>
- <p class="item-description">
- {{ item.description }}
- </p>
- </div>
- <footer>
- <!-- ... -->
- </footer>
- </div>
- </template>
接著,我們把 v-for 里面的內(nèi)容提取到一個新的組件中:
- <template>
- <div>
- <h2 class="item-title">
- {{ item.title }}
- </h2>
- <p class="item-description">
- {{ item.description }}
- </p>
- </div>
- </template>
如果我們導(dǎo)入這個新組件,我們會看到它很好地擺脫了所有嵌套:
- <template>
- <div>
- <h1>{{ title }}</h2>
- <div class="navigation">
- <!-- ... -->
- </div>
- <ListItem
- v-for="item in list"
- :item="item"
- />
- <footer>
- <!-- ... -->
- </footer>
- </div>
- </template>
此示例中沒有太多的嵌套,所以單獨為一小部分內(nèi)容做一個組件,有點繁瑣。但是,如果我們有兩個,三個或更多的嵌套級別,則此技巧可以消除嵌套結(jié)構(gòu)并讓代碼更易于理解。
但這里有一個問題:為什么我們不把v-for指令也寫入新的組件中?
我們應(yīng)該把控制流指令放入新的組件中嗎?
假設(shè),我們上面的 v-for 放到新的組件內(nèi),則我們會得到下面的結(jié)構(gòu):
這樣看上去,父組件確實清晰很多。但不幸的是,這種變向的把復(fù)雜度放到了子組件中:
- <template>
- <div>
- <div v-for="item in list">
- <h2 class="item-title">
- {{ item.title }}
- </h2>
- <p class="item-description">
- {{ item.description }}
- </p>
- </div>
- </div>
- </template>
哪種方式更好?
如果你最終的目的就是想減少嵌套數(shù)量,那么這個選擇肯定更糟糕。我們在子組件中添加了額外的嵌套級別,而沒有減少父組件中的嵌套級別。
通常,我會避免將諸如v-if和v-for之類的控制流指令放在這樣的組件的根部,因為它會影響可重用性。
如果只需要一個簡單ListItem 該怎么辦?
假設(shè)使用v-if,如果要使用不同的邏輯在組件之間進(jìn)行切換,或者要使用完全不同的組件怎么辦?
將控制流指令寫小最小通用結(jié)構(gòu)的組件中會限制我們的靈活性,而不會給我們帶來更多的便利性。因此,我傾向于將控制流指令留在這樣的小組件之外。我還嘗試避免將它們放在組件的根部。
一旦你深入了解“底層”的情況,此問題及其解決方案就會顯得更加有優(yōu)勢。
作者:Michael Thiessen 譯者:前端小智 來源:medium 原文:https://www.digitalocean.com/community/tutorials/vuejs-component-slots
洪迪 本文轉(zhuǎn)載自微信公眾號「 大遷世界」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系 大遷世界公眾號。