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下载blob文档流实现过程

    vue下载blob文档流实现过程

    文章介绍了两种在Vue中下载Blob文档流的常见方法:一种是通过创建a标签并触发点击事件来下载,另一种是使用`file-saver`库和封装的`download.js`公用方法来处理文档流的下载
    2025-12-12
  • vue3如何实现在style中使用响应式变量

    vue3如何实现在style中使用响应式变量

    vue3已经内置了这个功能啦,可以在style中使用v-bind指令绑定script模块中的响应式变量,这篇文章我们来讲讲vue是如何实现在style中使用script模块中的响应式变量,感兴趣的朋友一起看看吧
    2024-07-07
  • vue初尝试--项目结构(推荐)

    vue初尝试--项目结构(推荐)

    这篇文章主要介绍了vue初尝试--项目结构的相关知识,需要的朋友可以参考下
    2018-01-01
  • 解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题

    解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题

    今天小编就为大家分享一篇解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)

    VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)

    本篇文章主要介绍了VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮),具有一定的参考价值,有兴趣的可以了解一下
    2017-08-08
  • Vue Router 中meta 对象示例详解

    Vue Router 中meta 对象示例详解

    本文主要介绍了在VueRouter中,meta对象的使用和配置方式,meta对象可以包含任何你希望附加到路由的自定义信息,这些配置信息可以灵活的满足你的应用需求,使得路由配置更具灵活性和可扩展性
    2024-10-10
  • Vue3中refs使用方法举例

    Vue3中refs使用方法举例

    在Vue中Refs是对DOM元素或已安装到DOM的其他组件实例的引用,下面这篇文章主要给大家介绍了关于Vue3中refs使用的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • Vue 打包后相对路径的引用问题

    Vue 打包后相对路径的引用问题

    这篇文章主要介绍了VUE 打包后相对路径的引用问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • vue报错Error:Cannot find module 'fs/promises'的解决方式

    vue报错Error:Cannot find module 'fs/promises'的解决方

    最近的项目需要用到vue/cli,但是用cnpm安装vue/cli的时候报错了,下面这篇文章主要给大家介绍了关于vue报错Error:Cannot find module 'fs/promises'的解决方式,需要的朋友可以参考下
    2022-11-11
  • vue实现在线翻译功能

    vue实现在线翻译功能

    这篇文章主要为大家详细介绍了vue实现在线翻译功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09

最新评论