亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

避免在Vue模板中重復模式

避免在Vue模板中重復模式

慕絲7291255 2022-01-13 10:54:25
我有這個巨大的煩人組件,需要在父模板中重復多次,因為父模板使用的是 v-if。這是組件代碼:<SelectCard  v-for="(channel, index) in category.visibleChannels"  :key="index + '-' + channel.id"  :channel="channel"  :channel-selected="isSelected(channel.id)"  :read-more-details="channelInfoDetails"  @select="onAddChannel"  @deselect="onRemoveChannel"  @read-more-changed="setChannelInfoDetails"/>每次渲染模板時唯一變化的是我循環的數組......這是問題的簡化版本:<template><div    ref="channels"    class="channels"  >    <div v-if="showCategories">      <div        v-for="category in sliderCategories"        :key="category.name"      >        <h3 v-text="category.name" />        <div          v-if="category.showAll"          class="channel-list show-all"          :class="channelListSize"        >          <ul>            <SelectCard looping over category.contents  />          </ul>        </div>        <ChannelSlider          v-else          :category="category"          @visible-updated="setVisibleChannels"        >          <SelectCard looping over category.visibleChannels  />        </ChannelSlider>        <div class="show-all-link">          <a            :class="category.showAll?'arrow-up':'arrow-down'"            class="link"            @keyup.enter="toggleShowAll(category.name, !category.showAll)"            @click="toggleShowAll(category.name, !category.showAll)"            v-text="showAllText(category.showAll)"          />        </div>      </div>    </div>    <div v-else>      <div v-if="showNoSearchResult">        <SomeComponent with some props/>      </div>      <div :class="channelListSize" class="channel-list">        <ul>          <SelectCard looping over updatedChannels  />        </ul>      </div>    </div>    <div      ref="someref"      class="someClass"      :style="{top: channelInfoDetails.top + 'px', position: 'absolute'}"    >      <AnotherComponent with some props/>    </div>  </div></template>所以我的模板變得巨大,因為 SelectCard 代碼有很多道具。有沒有辦法可以將 SelectCard 放入父代碼中的方法中,這樣我就可以使用要使用的數組或其他方法調用函數?還是有其他我不知道的解決方案?
查看完整描述

2 回答

?
FFIVE

TA貢獻1797條經驗 獲得超6個贊

我認為這里沒有您想要的那么簡單的解決方案。但也有一些可能性。


v-bind您可以使用和的對象形式將其略微減小v-on。對于v-bind您需要引入一個方法來返回對象,因為您的道具依賴于channeland index,因此它們需要傳遞給該方法。這會減少一點,但它不是很好。屬性的對象形式is也可能是一個選項。這可能會進一步擠壓它,但會以清晰度為代價。


另一種方法是引入另一個組件,然后為SelectCard. 例如:


<div>

  <div v-if="conditionA">

    <div v-if="conditionA-A">

      <slot />

    </div>

    <div v-else>

      <slot />

    </div>  

  </div>

  <div v-else>

    <div v-if="conditionB-A">

      <slot />

    </div>

    <div v-else>

      <slot />

    </div>  

  </div>

</div>

然后將SelectCardin 作為插槽內容傳遞,并使用計算屬性使數組動態化。


這種方法的一個問題是,您可能會發現自己必須在組件的各個層之間傳遞很多東西才能使其正常工作。


另一種選擇是將所有內容轉換為render函數。您絕對可以使用函數來做您想做的事情,render但這會以不得不放棄使用模板為代價。這是否真的是一個問題將取決于模板其余部分的復雜性。


查看完整回答
反對 回復 2022-01-13
?
胡說叔叔

TA貢獻1804條經驗 獲得超8個贊

將 的所有邏輯v-if's放入一個計算屬性中,該屬性返回您想要傳遞為的正確數組。SelectCard 類似于以下內容的道具:


<SelectCard :arr="arrayToRender"/>

...

computed: {

       arrayToRender(){

           if (ConditionA){ return Array_A}

           if ....

    }


查看完整回答
反對 回復 2022-01-13
  • 2 回答
  • 0 關注
  • 309 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號