亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

手把手教你用jsx封裝Vue中的復(fù)雜組件(網(wǎng)易云音樂(lè)實(shí)戰(zhàn)項(xiàng)目需求)

HitenDev / 2327人閱讀

摘要:終極解決方案所以我們要統(tǒng)一環(huán)境,直接使用渲染我們的組件,文檔可以參照音樂(lè)標(biāo)題歌手專輯時(shí)長(zhǎng)省去一些細(xì)節(jié)注意需要放在中,的透?jìng)饕膊灰耍@樣我們?cè)谕獠肯胧褂玫囊恍傩院褪录疟容^方便。

背景介紹

最近在做vue高仿網(wǎng)易云音樂(lè)的項(xiàng)目,在做的過(guò)程中發(fā)現(xiàn)音樂(lè)表格這個(gè)組件會(huì)被非常多的地方復(fù)用,而且需求比較復(fù)雜的和靈活。

預(yù)覽地址 源碼地址 圖片預(yù)覽

歌單詳情

播放列表

搜索高亮

需求分析

它需要支持:

hideColumns參數(shù), 自定義需要隱藏哪些列。

highLightText,傳入字符串,數(shù)據(jù)中命中的字符串高亮。

首先 看一下我們平常的table寫法。

  
      
      
      
      
      
      
    

這是官網(wǎng)的寫法,假設(shè)我們傳入了 hideColumns: ["index", "name"],我們需要在模板里隱藏的話`

  
    
    
    
    
    
    
  

這種代碼非常笨,所以我們肯定是接受不了的,我們很自然的聯(lián)想到平常用v-for循環(huán),能不能套用在這個(gè)需求上呢。
首先在data里定義columns

data() {
    return {
      columns: [{
        prop: "index",
        label: "",
        width: "50"
      }, {
        prop: "artistsText",
        label: "歌手"
      }, {
        prop: "albumName",
        label: "專輯"
      }, {
        prop: "durationSecond",
        label: "時(shí)長(zhǎng)",
        width: "100",
      }]
    }
}

然后我們?cè)赾omputed中計(jì)算hideColumns做一次合并

  computed: {
    showColumns() {
      const { hideColumns } = this
      return this.columns.filter(column => {
        return !this.hideColumns.find((prop) => prop === column.prop)
      })
    },
  },

那么模板里我們就可以簡(jiǎn)寫成


    
  

注意 v-bind="column" 這行, 相當(dāng)于把column中的所有屬性混入到table-column中去,是一個(gè)非常簡(jiǎn)便的方法。

script配合template的解決方案

這樣需求看似解決了,很美好。

但是我們忘了非常重要的一點(diǎn),slotScopes這個(gè)東西!

比如音樂(lè)時(shí)長(zhǎng)我們需要format一下,

 
     
 

但是我們現(xiàn)在把columns都寫到script里了,和template分離開來(lái)了,我暫時(shí)還不知道有什么方法能把sciprt里寫的模板放到template里用,所以先想到一個(gè)可以解決問(wèn)題的方法。就是在template里加一些判斷。


    
  

又一次的需求看似解決了,很美好。

高亮文字匹配需求分析


但是新需求又來(lái)了?。「鶕?jù)傳入的 highLightText 去高亮某些文字,我們分析一下需求

雞你太美這個(gè)歌名,我們?cè)谒阉骺蜉斎?b>雞你
我們需要把

雞你太美

轉(zhuǎn)化為

  
    雞你
    太美
 

我們?cè)趖emplate里找到音樂(lè)標(biāo)題這行,寫下這端代碼:

methods: {
    genHighlight(text) {
       return xxx
    }
}

我發(fā)現(xiàn)無(wú)從下手了, 因?yàn)閖sx最終編譯成的是return vnode的方法,genHighlight執(zhí)行以后返回的是vnode,但是你不能直接把vnode放到template里去。

jsx終極解決方案

所以我們要統(tǒng)一環(huán)境,直接使用jsx渲染我們的組件,文檔可以參照

babel-plugin-transform-vue-jsx


vuejs/jsx

data() {
    const commonHighLightSlotScopes = {
      scopedSlots: {
        default: (scope) => {
          return (
            {this.genHighlight(scope.row[scope.column.property])}
          )
        }
      }
    }
    return {
      columns: [{
        prop: "name",
        label: "音樂(lè)標(biāo)題",
        ...commonHighLightSlotScopes
      }, {
        prop: "artistsText",
        label: "歌手",
         ...commonHighLightSlotScopes
      }, {
        prop: "albumName",
        label: "專輯",
        ...commonHighLightSlotScopes
      }, {
        prop: "durationSecond",
        label: "時(shí)長(zhǎng)",
        width: "100",
        scopedSlots: {
          default: (scope) => {
            return (
              {this.$utils.formatTime(scope.row.durationSecond)}
            )
          }
        }
      }]
    }
  },
  methods: {
    genHighlight(title = "") {
      ...省去一些細(xì)節(jié)
      const titleSpan = matchIndex > -1 ? (
        
          {beforeStr}
          {hitStr}
          {afterStr}
        
      ) : title;
      return titleSpan;
    },
  },
 render() {
    const tableAttrs = {
      attrs: this.$attrs,
      on: {
        ...this.$listeners,
        ["row-click"]: this.onRowClick
      },
      props: {
        ["table-cell-class-name"]: this.tableCellClassName,
        data: this.songs
      },
      style: { width: "99.9%" }
    }
    return this.songs.length ? (
      
        {this.showColumns.map((column, index) => {
          const { scopedSlots, ...columnProps } = column
          return (
            
            
          )
        })}
      
    ) : null
 }

注意$listeners需要放在on中,attrs的透?jìng)饕膊灰?,這樣我們?cè)谕獠肯胧褂胑l-table的一些屬性和事件才比較方便。
可以看到代碼中模板的部分少了很多重復(fù)的判斷,維護(hù)性和擴(kuò)展性都更強(qiáng)了,jsx可以說(shuō)是復(fù)雜組件的終極解決方案。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/106233.html

相關(guān)文章

  • 前方來(lái)報(bào),八月最新資訊--關(guān)于vue2&3的最佳文章推薦

    摘要:哪吒別人的看法都是狗屁,你是誰(shuí)只有你自己說(shuō)了才算,這是爹教我的道理。哪吒去他個(gè)鳥命我命由我,不由天是魔是仙,我自己決定哪吒白白搭上一條人命,你傻不傻敖丙不傻誰(shuí)和你做朋友太乙真人人是否能夠改變命運(yùn),我不曉得。我只曉得,不認(rèn)命是哪吒的命。 showImg(https://segmentfault.com/img/bVbwiGL?w=900&h=378); 出處 查看github最新的Vue...

    izhuhaodev 評(píng)論0 收藏0
  • 庫(kù),組件,框架 - 收藏集 - 掘金

    摘要:哈哈,我理解,架構(gòu)就是骨架,如下圖所示譯年月個(gè)有趣的和庫(kù)前端掘金我們創(chuàng)辦的使命是讓你及時(shí)的了解開發(fā)中最新最酷的趨勢(shì)。 翻譯 | 上手 Webpack ? 這篇就夠了! - 掘金譯者:小 boy (滬江前端開發(fā)工程師) 本文原創(chuàng),轉(zhuǎn)載請(qǐng)注明作者及出處。 原文地址:https://www.smashingmagazine.... JavaSrip... 讀 Zepto 源碼之代碼結(jié)構(gòu) - ...

    tommego 評(píng)論0 收藏0
  • 把手你用Vue.js封裝Form組件

    摘要:到此,和組件的代碼如下在組件中設(shè)置了數(shù)組來(lái)保存組件中的表單實(shí)例,方便接下來(lái)獲取表單實(shí)例來(lái)判斷各個(gè)表單的校驗(yàn)情況并在生命周期中就綁定兩個(gè)監(jiān)聽事件和用于添加和移除表單實(shí)例。 前言: 在日常使用vue開發(fā)WEB項(xiàng)目中,經(jīng)常會(huì)有提交表單的需求。我們可以使用 iview 或者 element 等組件庫(kù)來(lái)完成相關(guān)需求;但我們往往忽略了其中的實(shí)現(xiàn)邏輯,如果想深入了解其中的實(shí)現(xiàn)細(xì)節(jié),本文章從0到1,手...

    gitmilk 評(píng)論0 收藏0
  • 手摸手,帶你用vue擼后臺(tái) 系列三(實(shí)戰(zhàn)篇)

    摘要:社區(qū)的認(rèn)可目前已經(jīng)是相關(guān)最多的開源項(xiàng)目了,體現(xiàn)出了社區(qū)對(duì)其的認(rèn)可。監(jiān)聽事件手動(dòng)維護(hù)列表這樣我們就簡(jiǎn)單的完成了拖拽排序。 完整項(xiàng)目地址:vue-element-admin 系類文章一:手摸手,帶你用vue擼后臺(tái) 系列一(基礎(chǔ)篇)系類文章二:手摸手,帶你用vue擼后臺(tái) 系列二(登錄權(quán)限篇)系類文章三:手摸手,帶你用vue擼后臺(tái) 系列三(實(shí)戰(zhàn)篇)系類文章四:手摸手,帶你用vue擼后臺(tái) 系列...

    Channe 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<