uniapp小程序实现瀑布流布局的思路与代码

 更新时间:2021年04月08日 14:25:07   作者:林深鹿lv-1  
这篇文章主要给大家介绍了关于uniapp小程序实现瀑布流布局的思路与代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、前言

现在写瀑布流算不算是炒冷饭啊?

我不管, 我就要写,谁也别想拦我。

瀑布流应该算是很常见的一种布局方法了,大致的思路也很好理解, 但是在小程序里面确有另外需要考虑的几个问题。

问题1:uniapp是基于Vue的,所以不好直接操作DOM。

问题2:uniapp基于Vue,但也做了一些修改,所以不好拿ref来操作

二、先说思路

为了保证文章的长度,以及有些小伙伴对瀑布流的基本思路不是很了解,所以先讲讲瀑布流的思路,先看下图。

可以看到,商品的图片高度是不一致的,再加上商品标题的行数不一致,最终呈现的效果是交错排列的。

之前在开发过程中,我也试过用CSS的Flex布局,Column布局来实现,勉强能实现同样的效果,但是最终对接后台要考虑商品的热度优先,所以只能放弃。

Flex实现缺点:使用Flex布局并不能准确计算高度来插入商品。

Column实现缺点:使用Column布局不好操作先后顺序。

PS:如果对产品排序没有要求的话, 可以考虑纯CSS实现,这里不多赘述,掘金里很多的。

三、核心代码

如题,本文对于瀑布流的实现是基于uniapp开发小程序的,如果期望JS原生实现,本文的很多思路是需要修改的。
先解答部分疑惑:

因为无法通过$refs获取到列的高度,所以代码是通过Image标签的@load时间先加载一次图片,并将图片的宽高等信息传递给方法。

// component/waterfall.vue
<template>
    <view class="waterfall">
        <view hidden>
            // 用JS原生实现时可以直接用for循环插入,然后获取列高度
            // 这里通过载入图片调用方法, 默认传参带有图片信息,可以获得图片高度
            <block v-for(item in imgList" :key="item.id">
                <image :src="item.url" @load="loadImg" ></iamge>
            </block>
        </view>
        <view class="list" v-for="(list, key) in waterfall" :key="key">
            <navigator url="https://www.baidu.com" v-for="item in list.list" :key="item.id">
                <image :src="item.url" mode="widthFix"></image>
                <view class="shop-info">
                    /* 标题等信息,略 */
                </view>
            </navigator>
        </view>
    </view>
</template>

<script>
    export default {
        // 抽出为单独的组件,所以数据来源于父组件传递,也可以是当前组件请求API
        props: { imgList: Array },
        data(){
            return {
                lists: [], // 备份imgList用的数组,方便操作
                waterfall: [
                    // 用于记录当前列的高度,不在方法中保存是为了上拉获取新数据也能使用
                    // 因为默认手机显示,可以固定两列
                    // 如果是做自适应或者电脑端多列,可以动态插入实现多列
                    {
                        height: 0, 
                        list: []
                    },{
                        height: 0, 
                        list: []
                    }
                ]
            }
        },
        created(){
            this.lists = this.imgList; // Vue创建data后立即备份
        },
        watch(){
            // 监听数据源,如果有新值传入,则用lists数组备份
            imgList(data){ data.length && this.lists.push(...data); }
        },
        methods: {
            loadImg(ev){
                let Root = this.waterfall;
                let height = e.detail.height;
                // 根据当前高度决定将新数据给谁,并更新列高度;优先插入左侧
                if(Root[0].height <= Root[1].height){
                    // 考虑热度优先的问题, 所以用的是shift()方法推出头部数据。
                    Root[0].list.push(this.lists.shift())
                    Root[0].height += height;
                } else {
                    Root[1].list.push(this.lists.shift())
                    Root[1].height += height;
                }
            }
        }
    }
</script>

至此,核心代码就完成了。

PS:因为要借由image的@load事件来触发方法,所以大量加载势必会影响性能,所以要自己做点取舍了。

四、总结

希望如果有小伙伴看完这篇文章之后,决定使用这个方法时,能记得一件事,这个写法可能有性能问题方面的影响,能在这方面下功夫去深入研究下。

到此这篇关于uniapp小程序实现瀑布流布局的思路与代码的文章就介绍到这了,更多相关uniapp小程序瀑布流布局内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript canvas绘制圆弧与圆形

    JavaScript canvas绘制圆弧与圆形

    这篇文章主要为大家详细介绍了JavaScript canvas绘制圆弧与圆形,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • JavaScript设计模式之外观模式介绍

    JavaScript设计模式之外观模式介绍

    这篇文章主要介绍了JavaScript设计模式之外观模式介绍,外观模式是用于由于子系统或程序组成较复杂而提供的一个高层界面接口,使用客户端更容易访问底层的程序或系统接口,需要的朋友可以参考下
    2014-12-12
  • javascipt匹配单行和多行注释的正则表达式

    javascipt匹配单行和多行注释的正则表达式

    用JSON.parse 来转换成json对象,由于有注释的存在则无法正确转换甚至报错。匹配字符串中的所有注释,包括单行和多行注释
    2013-11-11
  • 浅析JavaScript中的array数组类型系统

    浅析JavaScript中的array数组类型系统

    除了对象之外,数组Array类型可能是javascript中最常用的类型了。而且,javascript中的数组与其他多数语言中的数组有着相当大的区别。本文将介绍javascript中的数组Array类型,非常不错,感兴趣的朋友一起看下吧
    2016-07-07
  • JS实现自动切换文字的导航效果代码

    JS实现自动切换文字的导航效果代码

    这篇文章主要介绍了JS实现自动切换文字的导航效果代码,涉及javascript动态切换页面样式的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • 关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解

    关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的

    这篇文章主要介绍了关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用,需要的朋友可以参考下
    2017-05-05
  • 一些不错的JS 自定义函数

    一些不错的JS 自定义函数

    一些不错的JS 自定义函数 ,不少网站都在用,都是一些比较不错的函数,可以拿来直接使用。建议学习。
    2009-08-08
  • Javascript数组的 forEach 方法详细介绍

    Javascript数组的 forEach 方法详细介绍

    这篇文章主要介绍了Javascript数组的forEach方法详细介绍,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 一文详解如何根据后端返回的url下载json文件

    一文详解如何根据后端返回的url下载json文件

    前后端分离的项目中,前端工作人员会要求后端返回指定格式的JSON数据,下面这篇文章主要给大家介绍了关于如何根据后端返回的url下载json文件的相关资料,需要的朋友可以参考下
    2022-05-05
  • 图片onload事件触发问题解决方法

    图片onload事件触发问题解决方法

    当页面上存在一个图片元素时如:<img src='xxxx' alt="" />,页面加载中ie7、8跟chrome下图片的onload事件非常奇怪,有后完全不触发,有时候触发后进行改变某些元素的操作,操作结果无效。
    2011-07-07

最新评论