Vue瀑布流插件的使用示例


Posted in Javascript onSeptember 19, 2018

我自己写的一个的Vue瀑布流插件,列数自适应,不用设置每个卡片的高度。

测试页面:Page.vue

模板页面:WaterFollow.vue 和 WFColumn.vue

在Page.vue中,修改itemW的值,设置每列的最小宽度。例如:itemW="200"(意为200px)。list为数组。高度不用设置,:style="{height:item+'px'}"是我为了创造卡片高度加上去的,不加就显示卡片的原来大小。

经测试,created加载数据正常,mounted加载、更新数据正常。

Page.vue

<template>
 <div class="container">
  <w-f-column itemW="200">
   <template slot-scope="{columnNum,columnIndex}">
    <water-follow :list="list" :columnNum="columnNum" :columnIndex="columnIndex">
     <template slot-scope="{item,index}">
      <div class="my-box" :style="{height:item+'px'}">{{item}}-{{index}}</div>
     </template>
    </water-follow>
   </template>
  </w-f-column>
 </div>
</template>

<script>
import WFColumn from '../waterFollow/WFColumn'
import WaterFollow from '../waterFollow/WaterFollow'
export default {
 name: 'page',
 components: {WaterFollow, WFColumn},
 data () {
  return {
   list: []
  }
 },
 created () {
  // 有初始数据
  for (let i = 0; i < 50; i++) {
   this.list.push(Math.floor(Math.random() * 301 + 200))
  }
 },
 mounted () {
  // 模拟网络请求
  // window.setTimeout(() => {
  //  this.list = []
  //  for (let i = 0; i < 50; i++) {
  //   this.list.push(Math.floor(Math.random() * 301 + 200))
  //  }
  // }, 1000)
  // -- 分割 --
  // 模拟数据不断变化
  // window.setInterval(() => {
  //  this.list = []
  //  for (let i = 0; i < 50; i++) {
  //   this.list.push(Math.floor(Math.random() * 301 + 200))
  //  }
  // }, 1000)
 }
}
</script>

<style scoped lang="scss">
 .container{
  width: 100%;
  background: gray;
  .my-box{
   width: 200px;
   background: #000;
   margin-bottom: 20px;
   color: #fff;
  }
 }
</style>

WFColumn.vue

<template>
 <div class="wf-container">
  <div class="wf-column" v-for="(item,index) in columnNum" :key="'column-'+index" :name="index">
   <slot :columnNum="columnNum" :columnIndex="index"></slot>
  </div>
 </div>
</template>

<script>
export default {
 name: 'WFColumn',
 props: ['itemW'],
 data () {
  return {
   columnNum: 0
  }
 },
 created () {
  this.columnNum = Math.floor(document.body.clientWidth / this.itemW)
  window.onresize = () => {
   this.columnNum = Math.floor(document.body.clientWidth / this.itemW)
  }
 }
}
</script>

<style scoped lang="scss">
.wf-container{
 width: 100%;
 display: flex;
 .wf-column{
  flex: 1;
 }
}
</style>

WaterFollow.vue

<template>
 <div>
  <div v-for="(item,index) in list" :key="'item-'+index" class="item" :id="'card-'+columnIndex+'-'+index" v-if="load?(record[index].index===columnIndex):true">
   <slot :item="item" :index="index"></slot>
  </div>
 </div>
</template>

<script>
export default {
 name: 'WaterFollow',
 props: ['list', 'columnNum', 'columnIndex'],
 data () {
  return {
   column: 0,
   record: [],
   load: false,
   update: false
  }
 },
 methods: {
  calculateColumn () {
   let cList = []
   for (let i = 0; i < this.columnNum; i++) {
    cList.push(0)
   }
   for (let i = 0; i < this.record.length; i++) {
    let index = 0
    for (let j = 0; j < cList.length; j++) {
     if (cList[index] > cList[j]) {
      index = j
     }
    }
    cList[index] += this.record[i].height
    this.record[i].index = index
   }
  },
  recordInit () {
   for (let i = 0; i < this.list.length; i++) {
    this.record.push({index: -1, height: -1})
   }
  },
  initHeightData () {
   for (let i = 0; i < this.list.length; i++) {
    if (document.getElementById('card-' + this.columnIndex + '-' + i)) {
     let h = document.getElementById('card-' + this.columnIndex + '-' + i).offsetHeight
     this.record[i].height = h
    }
   }
  }
 },
 beforeCreate () {},
 created () {
  this.load = false
  this.recordInit()
 },
 beforeMount () {},
 mounted () {
  this.initHeightData()
  this.calculateColumn()
  this.load = true
 },
 beforeUpdate () {},
 updated () {
  if (this.update) {
   this.initHeightData()
   this.calculateColumn()
   this.update = false
   this.load = true
  }
 },
 beforeDestroy () {},
 destroyed () {},
 watch: {
  columnNum (curr, old) {
   this.calculateColumn()
  },
  list (curr, old) {
   console.log('list change')
   this.recordInit()
   this.load = false
   this.update = true
  }
 }
}
</script>

<style scoped>
</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery的初始化与对象构建之浅析
Apr 12 Javascript
Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)
Jun 27 Javascript
JavaScript语言核心数据类型和变量使用介绍
Aug 23 Javascript
javascript为按钮注册回车事件(设置默认按钮)的方法
May 09 Javascript
JQuery给网页更换皮肤的方法
May 30 Javascript
js实现人民币大写金额形式转换
Apr 27 Javascript
基于input框覆盖掉数字英文的实例讲解
Jul 21 Javascript
jquery之基本选择器practice(实例讲解)
Sep 30 jQuery
聊聊Vue.js的template编译的问题
Oct 09 Javascript
使用 Vue 绑定单个或多个 Class 名的实例代码
Jan 08 Javascript
关于Webpack dev server热加载失败的解决方法
Feb 22 Javascript
JSON的parse()方法介绍
Jan 31 Javascript
vue-cli项目修改文件热重载失效的解决方法
Sep 19 #Javascript
解决vuecli3.0热更新失效的问题
Sep 19 #Javascript
记一次webapck4 配置文件无效的解决历程
Sep 19 #Javascript
解决vue热替换失效的根本原因
Sep 19 #Javascript
三种Webpack打包方式(小结)
Sep 19 #Javascript
Vue.js更改调试地址端口号的实例
Sep 19 #Javascript
vue添加axios,并且指定baseurl的方法
Sep 19 #Javascript
You might like
用PHP和MySQL保存和输出图片
2006/10/09 PHP
PHP中unset,array_splice删除数组中元素的区别
2014/07/28 PHP
安装ImageMagick出现error while loading shared libraries的解决方法
2014/09/23 PHP
PHP实现获取域名的方法小结
2014/11/05 PHP
护卫神php套件 php版本升级方法(php5.5.24)
2015/05/10 PHP
PDO::_construct讲解
2019/01/27 PHP
xmlHTTP实例
2006/10/24 Javascript
用倒置滤镜把div倒置,再把table倒置。
2007/07/31 Javascript
JavaScript函数、方法、对象代码
2008/10/29 Javascript
js 操作css实现代码
2009/06/11 Javascript
javawscript 三级菜单的实现原理
2009/07/01 Javascript
50个比较实用jQuery代码段
2011/09/18 Javascript
使用javascript实现有效时间的控制,并显示将要过期的时间
2014/01/02 Javascript
jquery插件开发之实现google+圈子选择功能
2014/03/10 Javascript
JavaScript中对象介绍
2014/12/31 Javascript
javascript实现通过表格绘制颜色填充矩形的方法
2015/04/21 Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
2015/10/28 Javascript
详解JavaScript中数组和字符串的lastIndexOf()方法使用
2016/03/13 Javascript
js实现手机web图片左右滑动效果
2017/12/29 Javascript
JS中移除非数字最多保留一位小数
2018/05/09 Javascript
详解在React中跨组件分发状态的三种方法
2018/08/09 Javascript
jdk1.8+vue elementui实现多级菜单功能
2020/09/24 Javascript
Python拼接字符串的7种方法总结
2018/11/01 Python
一文带你了解Python中的字符串是什么
2018/11/20 Python
使用OpenCV实现仿射变换—平移功能
2019/08/29 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
2020/01/25 Python
matplotlib jupyter notebook 图像可视化 plt show操作
2020/04/24 Python
calendar在python3时间中常用函数举例详解
2020/11/18 Python
Bose英国官方网站:美国知名音响品牌
2020/01/26 全球购物
运行时异常与一般异常有何异同?
2014/01/05 面试题
实习生的自我鉴定范文欣赏
2013/11/20 职场文书
高中毕业自我鉴定
2013/12/16 职场文书
企业党建工作汇报材料
2014/08/19 职场文书
2015新年寄语大全
2014/12/08 职场文书
人代会简报
2015/07/21 职场文书
jquery插件实现图片悬浮
2021/04/16 jQuery