[vue学习] 卡片展示分行功能简单实现

如图所示,实现简单的卡片展示分行功能。
分行功能较多地用于展示商品、相册等,本人在学习的过程中也是常常需要用到这个功能;虽然说现在有很多插件都能实现这个功能,但是自己写出来,能够理解原理,相信能够进步不少。
首先看看这个简单的原理分析:
最核心的就是多维数组,而且是不规则数组。将全部卡片全部分解为多维数组,页面渲染这个不规则多维数组,最终能达到这样的效果。
自己写一个商品列表goodsList,它里面的数据如下:
有9个商品,然后在前端渲染时将这十个商品分行,五个一行
goodsList: [
{
id: "1",
name: "1"
}, {
id: "2",
name: "2"
}, {
id: "3",
name: "3"
}, {
id: "4",
name: "4"
}, {
id: "5",
name: "5"
}, {
id: "6",
name: "6"
}, {
id: "7",
name: "7"
},{
id: "8",
name: "8"
},{
id: "9",
name: "9"
}
]
首先写一个方法:
getRow
声明一个数组并赋值为空,用于存储将多维数组。
let arr = [];确定行数,使用
Math.ceil方法向上取舍(如果有7个商品 ,一行 5 个,7 / 5 = 1.4,向上取舍得2行)let row = Math.ceil(this.goodsList.length / 5);因为我们没有理由让商品刚好放满每一行,有时候我们发现最后一行是不够5个商品,所以使用不规则数组。使用嵌套循环,将全部商品分割成多个长度上限为5的数组。第一层循环是行数循环,第二层循环是列循环
getRow () {
let arr = [];
let row = Math.ceil(this.goodsList.length / 5);
// 行循环
for (let i = 0; i < row; i++) {
// 第i行的商品
arr[i] = [];
// modLast:最后一行的商品个数
let modLast = this.goodsList.length % 5 === 0 ? 5 : this.goodsList.length % 5;
// lastRow:判断当前循环是不是最后一行,是就让内层循环最后一行的商品个数,不是则默认5个
let lastRow = i === (row - 1) ? modLast : 5;
// 列循环
for (let j = 0; j < lastRow; j++) {
arr[i][j] = this.goodsList[5 * i + j];
}
}
// 最后得到arr数组,将数组赋值给一个变量
this.branchData = arr;
}
根据需求触发 getRow() 执行,我这里是通过
Vue生命周期中的mounted,当页面被挂载后执行函数。
mounted () {
this.getRow();
}
最后将分割后的多维数组进行前端遍历渲染
<div class="row" v-for="rows in branchData">
<div class="card" v-for="cols in rows">
<div class="name">{{cols.name}}</div>
</div>
</div>
完
一个简单的分行功能在此实现!欢迎指正!谢谢。
附录:
前端代码:
<template>
<div class="branch">
<div class="row" v-for="rows in branchData">
<div class="card" v-for="cols in rows">
<div class="name">{{cols.name}}</div>
</div>
</div>
</div>
</template>
样式:
<style scoped>
.branch {
width: 800px;
margin: 0 auto;
}
.card {
height: 100px;
width: 100px;
margin: 15px;
background-color: turquoise;
display: flex;
justify-content: center;
align-items: center;
}
.row {
display: flex;
flex-direction: row;
}
</style>
JS:
<script>
export default {
name: "Branch",
data() {
return {
goodsList: [
{
id: "1",
name: "1"
}, {
id: "2",
name: "2"
}, {
id: "3",
name: "3"
}, {
id: "4",
name: "4"
}, {
id: "5",
name: "5"
}, {
id: "6",
name: "6"
}, {
id: "7",
name: "7"
},{
id: "8",
name: "8"
},{
id: "9",
name: "9"
}
],
branchData: []
}
},
mounted () {
this.getRow();
},
methods: {
getRow () {
let arr = [];
let row = Math.ceil(this.goodsList.length / 5);
for (let i = 0; i < row; i++) {
arr[i] = [];
let modLast = this.goodsList.length % 5 === 0 ? 5 : this.goodsList.length % 5;
let lastRow = i === (row - 1) ? modLast : 5;
for (let j = 0; j < lastRow; j++) {
arr[i][j] = this.goodsList[5 * i + j];
}
}
this.branchData = arr;
}
}
}
</script>
[vue学习] 卡片展示分行功能简单实现的更多相关文章
- vue学习笔记(二)——简单的介绍以及安装
学习编程需要的是 API+不断地练习^_^ Vue官网:https://cn.vuejs.org/ 菜鸟教程:http://www.runoob.com/vue2/vue-tutorial.html ...
- Vue学习笔记(一)简单使用和插值操作
目录 一.Vue是什么 二.Vue简单体验 1. 声明式渲染 2. vue列表展示 3. 处理用户输入(事件监听) 三.插值操作 1. Mustache语法 2. 常用v-指令 v-once v-ht ...
- Vue学习——使用vue-cli搭建一个简单的本地vue项目
前提 安装好node.js.npm.vue-cli.为什么要先安装这些,建议查看https://www.cnblogs.com/jixue/p/10673875.html,这个对于vue-cli理解很 ...
- Vue学习之todolist删除功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Vue学习(三)-Vue-router路由的简单使用
一.Vue-Router环境的安装: 如果使用vue-cli脚手架搭建,项目创建过程中会提示你自否选择使用vue-router,选择使用即可, 二.路由学习 1.路由的配置 vue-cli项目自 ...
- day 82 Vue学习二之vue结合项目简单使用、this指向问题
Vue学习二之vue结合项目简单使用.this指向问题 本节目录 一 阶段性项目流程梳理 二 vue切换图片 三 vue中使用ajax 四 vue实现音乐播放器 五 vue的计算属性和监听器 六 ...
- day 81 Vue学习二之vue结合项目简单使用、this指向问题
Vue学习二之vue结合项目简单使用.this指向问题 本节目录 一 阶段性项目流程梳理 二 vue切换图片 三 vue中使用ajax 四 vue实现音乐播放器 五 vue的计算属性和监听器 六 ...
- vue学习之vue基本功能初探
vue学习之vue基本功能初探: 采用简洁的模板语法将声明式的将数据渲染进 DOM: <div id="app"> {{ message }} </div> ...
- Vue学习之路第十篇:简单计算器的实现
前面九篇讲解了vue的一些基础知识,正所谓:学以致用,今天我们将用前九篇的基础知识,来模拟实现计算器的简单功能,项目价值不高,纯粹是为了加深掌握所学知识. 学前准备: 需要掌握JavaScript的e ...
随机推荐
- python之路模块简介及模块导入
================================添加sys.path路径================================================== ===== ...
- Day1 工厂模式
我的理解就是:工厂模式可以不用在乎参数的类型,工厂函数根据不同的类型,创建不同的对象.如下(简单工厂): package method.simpleFactory; import java.util. ...
- apache配置跨域请求代理
1.配置允许跨域请求 Header always set Access-Control-Allow-Origin "*"Header always set Access-Contr ...
- Echart 地图实例
1.地图实例 function func_InEchart() { require.config({ paths: { echarts: '../Scripts/echart2/echarts' }, ...
- 高端OLED电视成行业突破口,苏宁助力显示技术市场迭代
编辑 | 于斌 出品 | 于见(mpyujian) 在电商与线上渠道越来越占据举足轻重地位的年代,电商平台巨头们越来越有底气喊出"推动行业技术升级"的口号.的确,再好的技术升级也需 ...
- Photoshop——APP设计规范
随着Android和iOS语言的兴起,能够在手机上运行的APP软件已经成为了目前移动应用技术的焦点,APP的UI设计随之也越来越受到重视. 用户的需求不断增加,技术也在不断的更新,UI设计也越来越被重 ...
- ts中接口的用法
ts中的接口主要的作用是: 对“对象”进行约束描述 对“类”的一部分行为进行抽象 一.属性接口 接口中可定义 确定属性.可选属性.任意属性.只读属性 1.确定属性 interface UserInfo ...
- tianmao项目的学习笔记
1.后台-分类管理/查询 实体相关的知识: 1.1@Entity和@Table的区别:https://www.cnblogs.com/softidea/p/6216722.html 1.2@JsonI ...
- ASP.NET MVC扩充数据模型-定义数据模型的Metadata
ASP.NET MVC扩充数据模型-定义数据模型的Metadata Posted on 2018-07-12 by Wang Kepai Rate this post 无论你是使用LINQ t ...
- AcWing 791. 高精度加法
https://www.acwing.com/problem/content/793/ #include<bits/stdc++.h> using namespace std; vecto ...