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传递变量: 值传递?引用传递?
Feb 22 Javascript
Javascript面向对象扩展库代码分享
Mar 27 Javascript
EXTjs4.0的store的findRecord的BUG演示代码
Jun 08 Javascript
容易造成JavaScript内存泄露几个方面
Sep 04 Javascript
JavaScript学习笔记之Function对象
Jan 22 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
Jun 26 Javascript
微信小程序网络封装(简单高效)
Aug 06 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
Sep 20 jQuery
JS实现水平遍历和嵌套递归操作示例
Aug 15 Javascript
vue-i18n实现中英文切换的方法
Jul 06 Javascript
html5中sharedWorker实现多页面通信的示例代码
May 07 Javascript
详解Vue router路由
Nov 20 Vue.js
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作的文本留言本的例子(五)
2006/10/09 PHP
web server使用php生成web页面的三种方法总结
2013/10/28 PHP
个人写的PHP验证码生成类分享
2014/08/21 PHP
php单文件版在线代码编辑器
2015/03/12 PHP
PHPCMS2008广告模板SQL注入漏洞修复
2016/10/11 PHP
php面向对象之反射功能与用法分析
2017/03/29 PHP
详解php实现页面静态化原理
2017/06/21 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
jQuery 遍历json数组的实现代码
2020/09/22 Javascript
javascript学习笔记(七)利用javascript来创建和存储cookie
2011/04/08 Javascript
各浏览器对document.getElementById等方法的实现差异解析
2013/12/05 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
原生js实现打字动画游戏
2017/02/04 Javascript
js的函数的按值传递参数(实例讲解)
2017/11/16 Javascript
Spring Boot/VUE中路由传递参数的实现代码
2018/03/02 Javascript
Angular服务Request异步请求的实例讲解
2018/08/13 Javascript
详解angularjs4部署文件过大解决过程
2018/12/05 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
Vue动态面包屑功能的实现方法
2019/07/01 Javascript
JavaScript枚举选择jquery插件代码实例
2020/11/17 jQuery
python cx_Oracle的基础使用方法(连接和增删改查)
2017/11/19 Python
详解Django+Uwsgi+Nginx 实现生产环境部署
2018/11/06 Python
python挖矿算力测试程序详解
2019/07/03 Python
python如何给字典的键对应的值为字典项的字典赋值
2019/07/05 Python
tensorflow 只恢复部分模型参数的实例
2020/01/06 Python
捷克电器和DJ设备网上商店:Electronic-star
2017/07/18 全球购物
《盘古开天地》教学反思
2014/02/28 职场文书
学校关爱留守儿童活动方案
2014/08/27 职场文书
四风个人对照检查材料思想汇报
2014/09/25 职场文书
公安局副政委班子个人对照检查材料
2014/10/04 职场文书
晋江市委常委班子四风问题整改工作方案
2014/10/26 职场文书
病人家属写给医院的感谢信
2015/01/23 职场文书
2015年秋季灭鼠工作总结
2015/07/27 职场文书
2016年母亲节广告语
2016/01/28 职场文书
python 爬取华为应用市场评论
2021/05/29 Python