Taro 瀑布流組件

小程序Taro瀑布流

PS 本例使用Taro和TaroUI
Demo:https://github.com/Noelia1997/waterfall-com-taro

效果:

image-20200622203911231.png
這兩天試了很多種做瀑布流布局的方法,第一種是用flex布局卷员,這種方法只能整齊的排列大小相同的圖片栽烂,不能做到瀑布流的效果介蛉。
image-20200622204437537.png
第二種是根據(jù)序號(hào)的奇偶來(lái)選擇是放在左邊還是右邊,但是如果某列一直放很長(zhǎng)的圖片量承,依舊無(wú)法達(dá)到瀑布流的效果。
image-20200622204537939.png

在網(wǎng)上進(jìn)行了搜索,找到了微信小程序的瀑布流demo裙犹,邏輯有點(diǎn)混亂尽狠,閱讀不夠流暢。

但是通過(guò)閱讀作者的相關(guān)代碼叶圃,知道了兩件事袄膏。

一是:微信小程序<image/>中有一個(gè)屬性bindload,對(duì)應(yīng)在Taro中是onLoad掺冠。

image-20200622204901564.png

注意這個(gè)屬性是在圖片載入完畢時(shí)得到參數(shù)的沉馆!并且最坑的是如果循環(huán)渲染Image的話,如下面:

            goodsList.map((item, index) => {
              return (
                <Image onLoad={this.onImageLoad} id={index} src={item.image}></Image>
              )
            })

它在循環(huán)結(jié)束以后把所有的圖片根據(jù)圖片的大小排序德崭,小的先執(zhí)行它的bindload斥黑,大的得等等,如果圖片的大小相等接癌,隨機(jī)選擇心赶,無(wú)語(yǔ)。下圖是每次調(diào)用onLoad打印出的id數(shù)據(jù)缺猛,可以看出是隨機(jī)且無(wú)序的缨叫。

image-20200622215902529.png

為了讓每次load圖片時(shí)獲得有序的數(shù)組,我們不對(duì)第一次渲染圖片的組件進(jìn)行操作荔燎。所以在上方的代碼外面包裹一層display:none

        <View style={{display: 'none'}}>
          {
            goodsList.map((item, index) => {
              return (
                <Image onLoad={this.onImageLoad} id={index} src={item.image}></Image>
              )
            })
          }
        </View>

這里的例子里有兩個(gè)列表耻姥,goodsList保存的是初始的數(shù)據(jù),此數(shù)組中無(wú)height有咨,我們要通過(guò)onImageLoad獲得圖片的height琐簇,把獲得height后保存的數(shù)據(jù)放到ImageLoadList中。

onImageLoad = (e) => {
    //如果不做計(jì)算這一步座享,圖片在進(jìn)入左列或者右列時(shí)可能會(huì)出現(xiàn)計(jì)算錯(cuò)誤婉商。
    let oImgW = e.detail.width;         //圖片原始寬度
    let oImgH = e.detail.height;        //圖片原始高度
    let imgWidth = this.state.imgWidth;  //圖片設(shè)置的寬度
    let scale = imgWidth / oImgW;        //比例計(jì)算
    let imgHeight = oImgH * scale;      //自適應(yīng)高度

    //初始化ImageLoadList數(shù)據(jù)
    ImageLoadList.push({
      id: parseInt(e.currentTarget.id),
      height: imgHeight,
    })
    //載入全部的圖片進(jìn)入ImageLoadList數(shù)組,若數(shù)量和goodsList中相同渣叛,進(jìn)入圖片排序函數(shù)
    if (ImageLoadList.length === goodsList.length) {
      this.handleImageLoad(ImageLoadList)
    }
    // console.log(ImageLoadList)
  }

二是:制作瀑布流布局需要判斷左右列表的高度

以下是對(duì)ImageLoadList進(jìn)行操作的函數(shù):


handleImageLoad = (ImageLoadList) => {
    //對(duì)無(wú)序的列表進(jìn)行冒泡排序
    for (let i = 0; i < ImageLoadList.length - 1; i++)
      for (let j = 0; j < ImageLoadList.length - i - 1; j++) {
        if (ImageLoadList[j].id > ImageLoadList[j + 1].id) {
          let temp = ImageLoadList[j]
          ImageLoadList[j] = ImageLoadList[j + 1]
          ImageLoadList[j + 1] = temp
        }
      }
    //現(xiàn)在的列表在goodList的基礎(chǔ)上丈秩,多了height屬性
    console.log('ImageLoadList', ImageLoadList);
    //為現(xiàn)在的列表添加value值 
    for (let i = 0; i < goodsList.length; i++) {
        //把原數(shù)組中的屬性賦予ImageLoadList數(shù)組
      ImageLoadList[i].value = goodsList[i].value
      ImageLoadList[i].image = goodsList[i].image
      console.log('ImageLoadList[i].height', ImageLoadList[i].height)
      ImageLoadList[i].imgStyle = {height: ImageLoadList[i].height + 'rpx'}

    }
    console.log('ImageLoadList', ImageLoadList);
    //對(duì)現(xiàn)在的列表進(jìn)行操作
    let leftHeight = 0;  //左邊列表的高度
    let rightHeight = 0;
    let left = []  //左邊列表的數(shù)組
    let right = []
    //遍歷數(shù)組
    for (let i = 0; i < ImageLoadList.length; i++) {
      console.log('左邊的高度', leftHeight, '右邊邊的高度', rightHeight)
      if (leftHeight <= rightHeight) {
        console.log('第', i + 1, '張放左邊了')
        left.push(ImageLoadList[i])
        leftHeight += ImageLoadList[i].height
        console.log('left', left);
      } else {
        console.log('第', i + 1, '張放右邊了')
        right.push(ImageLoadList[i])
        rightHeight += ImageLoadList[i].height
        console.log('right', right);
      }
    }
    this.setState({
      goodsRight: right,
      goodsLeft: left
    }, () => {
      console.log(this.state);
    })
} 

另外使用React框架的push有一個(gè)坑,我們不能對(duì)state進(jìn)行push淳衙,例如

this.state.goodsRight.push(imgObj)  //× 錯(cuò)誤寫法

//正確寫法
let array = []
array.push(imgObj)
this.setState({
    goodsRight : array 
})

render()

<ScrollView>
          {
            <View className={'goods-left'}>
              {
                goodsLeft.map((item, index) => {
                  return (
                    <View className={'goods-item'}>
                      <Image src={item.image} className={'goods-img'} style={item.imgStyle} id={index}
                             mode='widthFix'/>
                      <View className={'goods-name'}>{item.value}</View>
                    </View>
                  )
                })
              }
            </View>
          }
        </ScrollView>

        <ScrollView>
          {
            <View className={'goods-right'}>
              {
                goodsRight.map((item, index) => {
                  return (
                    <View className={'goods-item'}>
                      <Image src={item.image} className={'goods-img'} style={item.imgStyle} id={index}
                             mode='widthFix'/>
                      <View className={'goods-name'}>{item.value}</View>
                    </View>
                  )
                })
              }
            </View>
          }
        </ScrollView>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蘑秽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子箫攀,更是在濱河造成了極大的恐慌肠牲,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件靴跛,死亡現(xiàn)場(chǎng)離奇詭異缀雳,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)梢睛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門俏险,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)严拒,“玉大人,你說(shuō)我怎么就攤上這事竖独】氵耄” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵莹痢,是天一觀的道長(zhǎng)种蘸。 經(jīng)常有香客問(wèn)我,道長(zhǎng)竞膳,這世上最難降的妖魔是什么航瞭? 我笑而不...
    開(kāi)封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮坦辟,結(jié)果婚禮上刊侯,老公的妹妹穿的比我還像新娘。我一直安慰自己锉走,他們只是感情好滨彻,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著挪蹭,像睡著了一般亭饵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梁厉,一...
    開(kāi)封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天辜羊,我揣著相機(jī)與錄音,去河邊找鬼词顾。 笑死八秃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肉盹。 我是一名探鬼主播昔驱,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼垮媒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起航棱,我...
    開(kāi)封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤睡雇,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后饮醇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體它抱,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年朴艰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了观蓄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片混移。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖侮穿,靈堂內(nèi)的尸體忽然破棺而出歌径,到底是詐尸還是另有隱情,我是刑警寧澤亲茅,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布回铛,位于F島的核電站,受9級(jí)特大地震影響克锣,放射性物質(zhì)發(fā)生泄漏茵肃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一袭祟、第九天 我趴在偏房一處隱蔽的房頂上張望验残。 院中可真熱鬧,春花似錦巾乳、人聲如沸您没。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)紊婉。三九已至,卻和暖如春辑舷,著一層夾襖步出監(jiān)牢的瞬間喻犁,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工何缓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肢础,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓碌廓,卻偏偏與公主長(zhǎng)得像传轰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谷婆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359