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 相关文章推荐
javascript中typeof的使用示例
Dec 19 Javascript
javascript中parseInt()函数的定义和用法分析
Dec 20 Javascript
基于jQuery实现以手风琴方式展开和折叠导航菜单
Jan 28 Javascript
jQuery dataTables与jQuery UI 对话框dialog的使用教程
Sep 02 Javascript
jquery 键盘事件的使用方法详解
Sep 13 jQuery
Vue DevTools调试工具的使用
Dec 05 Javascript
原生JS实现网页手机音乐播放器 歌词同步播放的示例
Feb 02 Javascript
解决iview打包时UglifyJs报错的问题
Mar 07 Javascript
使用vue中的v-for遍历二维数组的方法
Mar 07 Javascript
如何使用puppet替换文件中的string
Dec 06 Javascript
新年快乐! javascript实现超级炫酷的3D烟花特效
Jan 30 Javascript
解决使用layui对select append元素无效或者未及时更新的问题
Sep 18 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 Array交叉表实现代码
2010/08/05 PHP
php统计文章排行示例
2014/03/04 PHP
PHP中使用memcache存储session的三种配置方法
2014/04/05 PHP
php计算给定日期所在周的开始日期和结束日期示例
2017/02/06 PHP
php提交表单时保留多个空格及换行的文本样式的方法
2017/06/20 PHP
PHP中PDO事务处理操作示例
2018/05/02 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
2019/09/10 PHP
两种简单实现菜单高亮显示的JS类代码
2010/06/27 Javascript
js 事件处理函数间的Event物件是否全等
2011/04/08 Javascript
跨浏览器通用、可重用的选项卡tab切换js代码
2011/09/20 Javascript
关于javascript function对象那些迷惑分析
2011/10/24 Javascript
javascript鼠标滑过显示二级菜单特效
2020/11/18 Javascript
javascript 定时器工作原理分析
2016/12/03 Javascript
详谈Ajax请求中的async:false/true的作用(ajax 在外部调用问题)
2017/02/10 Javascript
Javascript中Promise的四种常用方法总结
2017/07/14 Javascript
详解js几个绕不开的事件兼容写法
2017/08/30 Javascript
jquery 键盘事件的使用方法详解
2017/09/13 jQuery
vue中的mvvm模式讲解
2019/01/31 Javascript
[00:32]DOTA2上海特级锦标赛 Ehome战队宣传片
2016/03/03 DOTA
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
python类参数self使用示例
2014/02/17 Python
Python多线程实例教程
2014/09/06 Python
Python学习小技巧之列表项的拼接
2017/05/20 Python
Python if语句知识点用法总结
2018/06/10 Python
Python之用户输入的实例
2018/06/22 Python
Python任意字符串转16, 32, 64进制的方法
2019/06/12 Python
django框架防止XSS注入的方法分析
2019/06/21 Python
浅谈Python_Openpyxl使用(最全总结)
2019/09/05 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
2020/02/05 Python
在python3中实现更新界面
2020/02/21 Python
浅谈keras保存模型中的save()和save_weights()区别
2020/05/21 Python
python基于Kivy写一个图形桌面时钟程序
2021/01/28 Python
服务员岗位责任制
2014/02/11 职场文书
太太口服液广告词
2014/03/20 职场文书
淮海战役观后感
2015/06/11 职场文书
世界无敌的ICOM IC-R9500宽频接收机
2022/03/25 无线电