vue.js实现一个瀑布流的组件

 更新时间:2023年06月06日 11:59:18   作者:我是好人  
这篇文章主要为大家介绍了vue.js实现一个瀑布流的组件示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

我所见过的瀑布流都是固定的几列,然后每一列包含若干个元素(图文元素),每一列的总高度都差不多。
所以我这个组件的功能就很简单,可以设置列数量,然后只要再写一个渲染元素的方法,即可使用。

组件说明

组件名:<tag-autoflow />

参数名类型说明
dataArray数据源
column_sizeNumber列的数量
renderItemFunction目前只能通过render函数渲染子元素,还不支持模板。
有三个参数
h,
item,将被渲染的元素
next,是一个function,在渲染子元素的合适时机(例如img的onload事件里),调用next()即可。
如不调用next将只能渲染一个元素,无法继续渲染。

源代码在此

简单的使用例子

export default {
    data() {
        // 随机生成20个测试数据
        const num = 20;
        var list = new Array(num).fill(0).map((v, i) => {
            return this.createItem(i);
        })
        return {
            list,
        }
    },
    // 直接用render函数来写,因为我觉得这样写props更直观一点
    render(h){
        return h('tag-autoflow', {
            props:{
                // 设置列数量
                column_size:3,
                // 数据源
                data: this.list,
                // 渲染item的方法,参数目前提供三个
                // h 瀑布流组件的createElement方法,非父组件的
                // item 要渲染的元素对象
                // next 必须主动调用next,插件才会自动去渲染下一个元素,详细说明见下文
                renderItem(h, item, next){
                    // 简单的渲染一个img跟一个p标签
                    // 因为img标签的图片加载需要时间,而图片影响了计算所在列的高度
                    // 所以需要在img触发了load事件后,再去调用next渲染下一个item。
                    return h('div', [
                        h('img', {
                            attrs: {
                                src: item.img
                            },
                            on: {
                                load: e => {
                                    next();
                                }
                            }
                        }),
                        h('p', item.title)
                    ])
                },
            },
        });
    },
    methods:{
        createItem(i) {
            var title = i + ',' + new Array(_.random(10, 150)).fill('哈').join('');
            var img = `http://via.placeholder.com/${_.random(100, 400)}x${_.random(100, 400)}`;
            return {
                img,
                title,
            }
        },
    }
}

渣渣效果图

代码里是一次性生成的20个元素,页面渲染的时候,很明显的能看出来是在一个img触发了load事件之后才渲染下一个元素。
如果花点心思加一些动画效果应该很酷吧。

如果你要渲染的item不包含图片,纯文字的话,可以通过这种写法调用next。保证了计算列高度的准确性。

renderItem(h, item, next){
    this.$nextTick(function(){
        next();
    });
    return h('p', item.title);
},

瀑布流的流程说明

  • 先根据参数生成对应数量的列,
  • 判断data是否有元素,没有就结束。
  • 从data里面shift()拿到一个元素item,
  • 找出当前高度最小的一列,将item放入该列。
  • 渲染item,然后调用next()方法进入2

TODO

  • 瀑布流还有个常见的功能就是滚动加载了,目前尚未加入此功能,会尽快加上。
  • 元素加载的过渡动画

以上就是vue.js实现一个瀑布流的组件的详细内容,更多关于vue.js瀑布流组件的资料请关注脚本之家其它相关文章!

相关文章

  • vue导入excel文件,vue导入多个sheets的方式

    vue导入excel文件,vue导入多个sheets的方式

    这篇文章主要介绍了vue导入excel文件,vue导入多个sheets的方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Vue.js实现开发购物车功能的方法详解

    Vue.js实现开发购物车功能的方法详解

    这篇文章主要介绍了Vue.js实现开发购物车功能的方法,结合实例形式分析了基于vue.js开发的购物车功能相关操作步骤与实现技巧,需要的朋友可以参考下
    2019-02-02
  • Vue3中的常见组件通信之mitt使用详解

    Vue3中的常见组件通信之mitt使用详解

    这篇文章主要介绍了Vue3中的常见组件通信之mitt使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • vue中实现图片压缩 file文件的方法

    vue中实现图片压缩 file文件的方法

    这篇文章主要介绍了vue中实现图片压缩 file文件的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 基于Vue3实现视频播放与截图功能

    基于Vue3实现视频播放与截图功能

    这篇文章主要为大家详细介绍了如何通过Vue3实现简单的视频播放与截图功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-04-04
  • 详解vue-cli快速构建vue应用并实现webpack打包

    详解vue-cli快速构建vue应用并实现webpack打包

    这篇文章主要介绍了详解vue-cli快速构建vue应用并实现webpack打包,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Vue3中实现发送网络请求功能(最新推荐)

    Vue3中实现发送网络请求功能(最新推荐)

    Axios是一个基于Promise的HTTP客户端,可以在浏览器和Node.js中用于发送HTTP请求,本文主要介绍在Vue3中实现发送网络请求功能,感兴趣的朋友一起看看吧
    2023-12-12
  • Vue权限指令控制权限详解

    Vue权限指令控制权限详解

    因为项目中需要根据后端返回的权限进行功能的显示隐藏,所以就加了个权限指令。不用写if else进行判断,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-09-09
  • 基于vue封装下拉刷新上拉加载组件

    基于vue封装下拉刷新上拉加载组件

    这篇文章主要为大家详细介绍了基于vue封装下拉刷新上拉加载组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 解决vue终端报错:不是内部或外部命令

    解决vue终端报错:不是内部或外部命令

    最近学习一下前端框架Vue,整体上感觉还是比较有意思的,但是在安装vue-cli脚手架的时候,出现了一些问题,解决问题也花费了不少时间,下面这篇文章主要给大家介绍了关于解决vue终端报错:不是内部或外部命令的相关资料,需要的朋友可以参考下
    2023-02-02

最新评论