vue使用列表渲染 實現(xiàn)瀑布流布局

最近一個vue項目需要瀑布流布局亿乳,最終結(jié)合自己的需求使用了vuev-for實現(xiàn)了汇荐,整理了一下狂丝。

結(jié)構(gòu)示意圖

(用 Process 在線畫圖工具畫的)

eg01.jpg
說明
  • 外層容器的box高度不固定
  • 每列col的寬度可自定義
  • 列數(shù)可自定義管嬉,取決于有幾個數(shù)據(jù)dataList地技,每個列的數(shù)據(jù)對應(yīng)一個``dataList`
  • 頁面布局結(jié)構(gòu)代碼
  <div class="box">
    <div class="col" ref="col1">
      <transition-group name="list">
        <div class="item" v-for="item in dataList1" :key="item.id">{{item.text}}</div>
      </transition-group>
    </div>
    <div class="col" ref="col2">
      <transition-group name="list">
        <div class="item" v-for="item in dataList2" :key="item.id">{{item.text}}</div>
      </transition-group>
    </div>
    <div class="col" ref="col3">
      <transition-group name="list">
        <div class="item" v-for="item in dataList3" :key="item.id">{{item.text}}</div>
      </transition-group>
    </div>
    <div class="col" ref="col4">
      <transition-group name="list">
        <div class="item" v-for="item in dataList4" :key="item.id">{{item.text}}</div>
      </transition-group>
    </div>
  </div>

加載數(shù)據(jù)

  • 使用axios
/** main.js*/
import Vue from 'vue'
import App from './App.vue'
import axios from 'axios'

Vue.prototype.$http = axios

new Vue({
  el: '#app',
  render: h => h(App)
})

  • 當(dāng)組件mounted時獲取數(shù)據(jù),獲取到數(shù)據(jù)后執(zhí)行mountMenu()方法柴底,mountMenu()方法將會通過selectCol()選擇當(dāng)前高度最小的列婿脸,并把數(shù)據(jù)push到對應(yīng)的dataList中,``mountMenu()`會在每次執(zhí)行時遞歸調(diào)用柄驻,直到遍歷完所有的數(shù)據(jù)
/** 數(shù)據(jù)實例*/
[
  {
    id:1002,
    text:"mountMenu()中調(diào)用了this.$nextTick()目的是等待當(dāng)前DOM渲染完成后在繼續(xù)執(zhí)行狐树,否則在獲取最小高度的列時,每次獲取到的高度都為0(vm.nextTick()vue官方文檔)"
  }
]
  • <span style='color:red;font-weight:bold'>重要信息</span>:mountMenu()中調(diào)用了this.$nextTick()目的是等待當(dāng)前DOM渲染完成后在繼續(xù)執(zhí)行凿歼,否則在獲取最小高度的列時褪迟,每次獲取到的高度都為0(<a href="https://cn.vuejs.org/v2/api/#vm-nextTick" target="_blank">vm.nextTick()vue官方文檔</a>)
export default {
  data() {
    return {
      mainMenuList: [],
      dataList1: [],
      dataList2: [],
      dataList3: [],
      dataList4: [],
    }
  },
  mounted() {
    this.$http({ url: 'http://localhost:6060/paragraph', method: 'get' }).then(res => {
      this.mainMenuList = res.data
      this.mountMenu()
    })
  },
  methods: {
    mountMenu(arg) {
      var temp = this.mainMenuList
      var index = arg || 0
      var refName = this.selectCol()
      if (temp.length > index) {
        this[refName].push(this.mainMenuList[index])
        this.$nextTick(() => {
          this.mountMenu(index + 1)
        })
      }
    },
    selectCol() {
      var getHeight = (ref) => {
        return this.$refs[ref].offsetHeight
      }
      var height1 = getHeight('col1')
      var height2 = getHeight('col2')
      var height3 = getHeight('col3')
      var height4 = getHeight('col4')
      switch (Math.min(height1, height2, height3, height4)) {
        case height1:
          return 'dataList1'
          break
        case height2:
          return 'dataList2'
          break
        case height3:
          return 'dataList3'
        case height4:
          return 'dataList4'
          break
      }
    },
  }
}
  • ie瀏覽器的BUG:上述代碼在ie瀏覽器(ie 9/10/11)中會遇到動畫的bug,目前我的解決方案就是js判斷瀏覽器答憔,在ie中禁用過渡動畫(
    [doge]
    )
computed: {
    isIe() {
      var tmp = window.navigator.userAgent.indexOf("MSIE") >= 1
        || !!window.ActiveXObject
        || "ActiveXObject" in window
      return tmp ? "" : "list"
    }
}
<transition-group :name="isIe">
  <div class="item" v-for="item in dataList1" :key="item.id">{{item.text}}</div>
</transition-group>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末味赃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子虐拓,更是在濱河造成了極大的恐慌心俗,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異城榛,居然都是意外死亡揪利,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門狠持,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疟位,“玉大人,你說我怎么就攤上這事喘垂√鹂蹋” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵正勒,是天一觀的道長得院。 經(jīng)常有香客問我,道長章贞,這世上最難降的妖魔是什么祥绞? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮鸭限,結(jié)果婚禮上蜕径,老公的妹妹穿的比我還像新娘。我一直安慰自己里覆,他們只是感情好丧荐,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著喧枷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弓坞。 梳的紋絲不亂的頭發(fā)上隧甚,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音渡冻,去河邊找鬼戚扳。 笑死,一個胖子當(dāng)著我的面吹牛族吻,可吹牛的內(nèi)容都是我干的帽借。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼超歌,長吁一口氣:“原來是場噩夢啊……” “哼砍艾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起巍举,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤脆荷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜓谋,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡梦皮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了桃焕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剑肯。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖观堂,靈堂內(nèi)的尸體忽然破棺而出退子,到底是詐尸還是另有隱情,我是刑警寧澤型将,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布寂祥,位于F島的核電站,受9級特大地震影響七兜,放射性物質(zhì)發(fā)生泄漏丸凭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一腕铸、第九天 我趴在偏房一處隱蔽的房頂上張望惜犀。 院中可真熱鬧,春花似錦狠裹、人聲如沸虽界。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽莉御。三九已至,卻和暖如春俗冻,著一層夾襖步出監(jiān)牢的瞬間礁叔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工迄薄, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留琅关,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓讥蔽,卻偏偏與公主長得像涣易,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子冶伞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 前端開發(fā)面試題 面試題目: 根據(jù)你的等級和職位的變化新症,入門級到專家級,廣度和深度都會有所增加碰缔。 題目類型: 理論知...
    怡寶丶閱讀 2,580評論 0 7
  • 簡介 在 vue 的官方文檔中有一個 API 叫做 nextTick账劲,將回調(diào)延遲到下次 DOM 更新循環(huán)之后執(zhí)行。...
    西施老師閱讀 1,452評論 0 0
  • vue 2.X 深入響應(yīng)式原理的異步更新隊列中說明如下: 只要偵聽到數(shù)據(jù)變化,Vue 將開啟一個隊列瀑焦,并緩沖在同一...
    指尖跳動閱讀 9,442評論 1 11
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,097評論 1 32
  • 【轉(zhuǎn)載】CSDN - 張林blog http://blog.csdn.net/XIAOZHUXMEN/articl...
    竿牘閱讀 3,488評論 1 14