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 相关文章推荐
让iframe自适应高度(支持XHTML,支持FF)
Jul 24 Javascript
jQuery EasyUI API 中文文档 - TimeSpinner时间微调器
Oct 23 Javascript
onkeypress字符按键兼容所有浏览器使用介绍
Apr 24 Javascript
JavaScript用JQuery呼叫Server端方法示例代码
Sep 03 Javascript
jQuery获取iframe的document对象的方法
Oct 10 Javascript
jquery引用方法时传递参数原理分析
Oct 13 Javascript
javascript数组详解
Oct 22 Javascript
js中的eval()函数把含有转义字符的字符串转换成Object对象的方法
Dec 02 Javascript
详解easyui基于 layui.laydate日期扩展组件
Jul 18 Javascript
jQuery实现输入框的放大和缩小功能示例
Jul 21 jQuery
Vue2.5学习笔记之如何在项目中使用和配置Vue
Sep 26 Javascript
jQuery实现购物车全功能
Jan 11 jQuery
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中global和$GLOBALS[]的分析之一
2012/02/02 PHP
Zend的Registry机制的使用说明
2013/05/02 PHP
php include和require的区别深入解析
2013/06/17 PHP
PHP的构造方法,析构方法和this关键字详细介绍
2013/10/22 PHP
php实现图形显示Ip地址的代码及注释
2014/01/20 PHP
使用Discuz关键词服务器实现PHP中文分词
2014/03/11 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
YII框架行为behaviors用法示例
2019/04/26 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
2019/05/27 PHP
redis+php实现微博(三)微博列表功能详解
2019/09/23 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
Yii使用DbTarget实现日志功能的示例代码
2020/07/21 PHP
JS效率个人经验谈(8-15更新),加入range技巧
2007/01/09 Javascript
Javascript &amp; DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例
2007/06/02 Javascript
js实现的折叠导航示例
2013/11/29 Javascript
jquery实现点击消失的代码
2014/03/03 Javascript
详解JS去重及字符串奇数位小写转大写
2016/12/29 Javascript
bootstrap组件之按钮式下拉菜单小结
2017/01/19 Javascript
微信小程序实现图片自适应(支持多图)
2017/01/25 Javascript
react-native 封装选择弹出框示例(试用ios&amp;android)
2017/07/11 Javascript
JS实现上传图片的三种方法并实现预览图片功能
2017/07/14 Javascript
Vue-router结合transition实现app前进后退动画切换效果的实例
2017/10/11 Javascript
layui 上传图片 返回图片地址的方法
2019/09/26 Javascript
关于layui 实现点击按钮添加一行(方法渲染创建的table)
2019/09/29 Javascript
vue之组件内监控$store中定义变量的变化详解
2019/11/08 Javascript
python使用append合并两个数组的方法
2015/04/28 Python
Python常用的文件及文件路径、目录操作方法汇总介绍
2015/05/21 Python
初探TensorFLow从文件读取图片的四种方式
2018/02/06 Python
Python图像处理之图片文字识别功能(OCR)
2019/07/30 Python
tensorflow实现测试时读取任意指定的check point的网络参数
2020/01/21 Python
python如何变换环境
2020/07/21 Python
css3实现可拖动的魔方3d效果
2019/05/07 HTML / CSS
Giglio英国站:意大利奢侈品购物网
2018/03/06 全球购物
2014年五四青年节演讲稿范文
2014/04/22 职场文书
预备党员群众路线教育实践活动思想汇报2014
2014/10/25 职场文书
上甘岭观后感
2015/06/10 职场文书