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对象与DOM对象之间的转换方法
Apr 15 Javascript
javascript getElementsByTagName
Jan 31 Javascript
js实现一个省市区三级联动选择框代码分享
Mar 06 Javascript
jQuery中$.get、$.post、$.getJSON和$.ajax的用法详解
Nov 19 Javascript
介绍JavaScript的一个微型模版
Jun 24 Javascript
学习Angular中作用域需要注意的坑
Aug 17 Javascript
微信小程序 wxapp视图容器 view详解
Oct 31 Javascript
基于jQuery实现选项卡效果
Jan 04 Javascript
vue实现导航栏效果(选中状态刷新不消失)
Dec 13 Javascript
微信小程序wx.getImageInfo()如何获取图片信息
Jan 26 Javascript
webpack打包react项目的实现方法
Jun 21 Javascript
浅析JavaScript预编译和暗示全局变量
Sep 03 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 CURL模拟GET及POST函数代码
2010/04/25 PHP
PHP中usort在值相同时改变原始位置问题的解决方法
2011/11/27 PHP
php中的boolean(布尔)类型详解
2013/10/28 PHP
php 判断字符串中是否包含html标签
2014/02/17 PHP
代码生成器 document.write()
2007/04/15 Javascript
用javascript实现自定义标签
2007/05/08 Javascript
JS小游戏之仙剑翻牌源码详解
2014/09/25 Javascript
Node.js实现的简易网页抓取功能示例
2014/12/05 Javascript
Java中Timer的用法详解
2015/10/21 Javascript
jquery判断input值不为空的方法
2016/06/05 Javascript
Vuejs第十三篇之组件——杂项
2016/09/09 Javascript
Vue组件BootPage实现简单的分页功能
2016/09/12 Javascript
Ubuntu 16.04 64位中搭建Node.js开发环境教程
2016/10/19 Javascript
JavaScript利用fetch实现异步请求的方法实例
2017/07/26 Javascript
JS删除数组里的某个元素方法
2018/02/03 Javascript
解决vue打包后刷新页面报错:Unexpected token
2019/08/27 Javascript
js实现mp3录音通过websocket实时传送+简易波形图效果
2020/06/12 Javascript
vue-cli+webpack项目打包到服务器后,ttf字体找不到的解决操作
2020/08/28 Javascript
Python的Urllib库的基本使用教程
2015/04/30 Python
python实现学生信息管理系统
2020/04/05 Python
解决sublime+python3无法输出中文的问题
2018/12/12 Python
nohup后台启动Python脚本,log不刷新的解决方法
2019/01/14 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
2019/05/27 Python
Python格式化字符串f-string概览(小结)
2019/06/18 Python
python实现字符串完美拆分split()的方法
2019/07/16 Python
jenkins配置python脚本定时任务过程图解
2019/10/29 Python
python+selenium+PhantomJS抓取网页动态加载内容
2020/02/25 Python
python datetime时间格式的相互转换问题
2020/06/11 Python
如何在Win10系统使用Python3连接Hive
2020/10/15 Python
Wallis官网:英国女装零售商
2020/01/21 全球购物
公司综合部的成员自我评价分享
2013/11/05 职场文书
毕业大学生自荐信
2014/06/17 职场文书
社区娱乐活动方案
2014/08/21 职场文书
不服劳动仲裁起诉书
2015/05/20 职场文书
go 实现简易端口扫描的示例
2021/05/22 Golang
Go语言空白表示符_的实例用法
2021/07/04 Golang