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中的立即执行函数表达式介绍
Mar 15 Javascript
JS实现网页上随滚动条滚动的层效果代码
Nov 04 Javascript
javascript下拉列表菜单的实现方法
Nov 18 Javascript
仅9张思维导图帮你轻松学习Javascript 就这么简单
Jun 01 Javascript
javascript中获取class的简单实现
Jul 12 Javascript
浅谈JavaScript 数据属性和访问器属性
Sep 01 Javascript
JS中使用mailto实现将用户在网页中输入的内容传递到本地邮件客户端
Oct 08 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
Sep 14 Javascript
详解vue-cli与webpack结合如何处理静态资源
Sep 19 Javascript
JavaScript基于对象方法实现数组去重及排序操作示例
Jul 10 Javascript
Vue动态获取width的方法
Aug 22 Javascript
vue实现下拉加载其实没那么复杂
Aug 13 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
基于mysql的bbs设计(二)
2006/10/09 PHP
PHP正则表达式替换站点关键字链接后空白的解决方法
2014/09/16 PHP
ThinkPHP函数详解之M方法和R方法
2015/09/10 PHP
PHP模拟http请求的方法详解
2016/11/09 PHP
JavaScript CSS修改学习第五章 给“上传”添加样式
2010/02/19 Javascript
js focus不起作用的解决方法(主要是因为dom元素是否加载完成)
2010/11/05 Javascript
jquery中$.post()方法的简单实例
2014/02/04 Javascript
浅谈js中对象的使用
2016/08/11 Javascript
利用Javascript裁剪图片并存储的简单实现
2017/03/13 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
2017/03/30 Javascript
浅谈webpack下的AOP式无侵入注入
2017/11/12 Javascript
JSONP原理及应用实例详解
2018/09/13 Javascript
优雅的elementUI table单元格可编辑实现方法详解
2018/12/23 Javascript
Elementui表格组件+sortablejs实现行拖拽排序的示例代码
2019/08/28 Javascript
整理 node-sass 安装失败的原因及解决办法(小结)
2020/02/19 Javascript
Python打印scrapy蜘蛛抓取树结构的方法
2015/04/08 Python
Python映射拆分操作符用法实例
2015/05/19 Python
详解Python3定时器任务代码
2019/09/23 Python
python实现树的深度优先遍历与广度优先遍历详解
2019/10/26 Python
浅谈python中统计计数的几种方法和Counter详解
2019/11/07 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
2020/06/12 Python
python如何代码集体右移
2020/07/20 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
2020/10/27 Python
python爬取2021猫眼票房字体加密实例
2021/02/19 Python
HTML5 Canvas基本线条绘制的实例教程
2016/03/17 HTML / CSS
香港礼品网站:GiftU eshop
2017/09/01 全球购物
意大利比基尼品牌:MISS BIKINI
2019/11/02 全球购物
Java里面有没有全局变量?为什么?
2015/02/06 面试题
C语言50道问题
2014/10/23 面试题
写给学生的新学期寄语
2014/01/18 职场文书
旅游与酒店管理专业求职信
2014/07/21 职场文书
2014年设备管理工作总结
2014/11/26 职场文书
教师岗位职责
2015/02/03 职场文书
Html5页面播放M4a音频文件
2021/03/30 HTML / CSS
深入理解redis中multi与pipeline
2021/06/02 Redis
java实现面板之间切换功能
2022/06/10 Java/Android