# Grid 宫格布局
宫格组件一般用于同时展示多个同类项目的场景,可以给宫格的项目设置徽标组件(badge),或者图标等,也可以扩展为左右滑动的轮播形式。
# 平台差异说明
App | H5 | 微信小程序 | 支付宝小程序 | 百度小程序 | 头条小程序 | QQ小程序 |
---|---|---|---|---|---|---|
√ | √ | √ | √ | √ | √ | √ |
# 基本使用
- 该组件外层为
u-grid
组件包裹,通过col
设置内部宫格的列数 - 内部通过
ugrid-item
组件的slot
设置宫格的内容 - 如果不需要宫格的边框,可以设置
border
为false
<template>
<view class="u-demo-area">
<u-toast ref="uToast"></u-toast>
<u-grid :col="col" @click="click" v-if="!isSwiper" :border="border">
<u-grid-item name="item1" :index="0" @click="itemClick">
<u-badge count="9" :offset="[col == 3 ? 20 : 14, col == 3 ? 30 : 20]"></u-badge>
<u-icon name="photo" :size="46"></u-icon>
<view class="grid-text">图片</view>
</u-grid-item>
<u-grid-item :index="1">
<u-icon name="lock" :size="46"></u-icon>
<view class="grid-text">锁头</view>
</u-grid-item>
<u-grid-item :index="2">
<image src="https://cdn.uviewui.com/uview/grid/hot5.png" :style="{
top: col == 3 ? '14rpx' : '8rpx',
right: col == 3 ? '40rpx' : '28rpx'
}" style="width: 34rpx;height: 34rpx;" class="badge-icon" mode="widthFix"></image>
<u-icon name="hourglass" :size="46"></u-icon>
<view class="grid-text">沙漏</view>
</u-grid-item>
<u-grid-item :index="3">
<u-icon name="home" :size="46"></u-icon>
<view class="grid-text">首页</view>
</u-grid-item>
<u-grid-item :index="4">
<u-icon name="star" :size="46"></u-icon>
<view class="grid-text">星星</view>
</u-grid-item>
<u-grid-item :index="5">
<u-icon name="volume-up" :size="46"></u-icon>
<view class="grid-text">音量</view>
</u-grid-item>
<u-grid-item :index="6">
<image src="https://cdn.uviewui.com/uview/grid/hot6.png" style="width: 44rpx;height: 44rpx;top:0;right:0;" class="badge-icon"></image>
<u-icon name="trash" :size="46"></u-icon>
<view class="grid-text">回收站</view>
</u-grid-item>
<u-grid-item :index="7">
<u-icon name="rewind-right" :size="46"></u-icon>
<view class="grid-text">快进</view>
</u-grid-item>
<u-grid-item :index="8">
<u-icon name="shopping-cart" :size="46"></u-icon>
<view class="grid-text">购物车</view>
</u-grid-item>
</u-grid>
<swiper class="swiper" v-else @change="change">
<swiper-item>
<u-grid :border="border" :col="col" @click="click" hover-class="hover-class">
<u-grid-item v-for="(item, index) in list" :index="index" :key="index">
<u-icon :name="item" :size="46"></u-icon>
<text class="grid-text">{{ '宫格' + (index + 1) }}</text>
</u-grid-item>
</u-grid>
</swiper-item>
<swiper-item>
<u-grid :border="border" :col="col" @click="click">
<u-grid-item v-for="(item, index) in list" :index="index + 9" :key="index">
<u-icon :name="item" :size="46"></u-icon>
<text class="grid-text">{{ '宫格' + (index + 1) }}</text>
</u-grid-item>
</u-grid>
</swiper-item>
<swiper-item>
<u-grid :border="border" :col="col" @click="click">
<u-grid-item v-for="(item, index) in list" :index="index + 18" :key="index">
<u-icon :name="item" :size="46"></u-icon>
<text class="grid-text">{{ '宫格' + (index + 1) }}</text>
</u-grid-item>
</u-grid>
</swiper-item>
</swiper>
<view class="indicator-dots" v-if="isSwiper">
<view class="indicator-dots-item" :class="[current == 0 ? 'indicator-dots-active' : '']">
</view>
<view class="indicator-dots-item" :class="[current == 1 ? 'indicator-dots-active' : '']">
</view>
<view class="indicator-dots-item" :class="[current == 2 ? 'indicator-dots-active' : '']">
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
list: ['integral', 'kefu-ermai', 'coupon', 'gift', 'scan', 'pause-circle', 'wifi', 'email', 'list'],
isSwiper: false,
current: 0,
border: false,
col: 3
};
},
methods: {
click(index) {
this.$refs.uToast.show({
title: `点击了第${index + 1}宫格`,
type: 'warning'
})
},
change(e) {
this.current = e.detail.current;
},
// 针对单个grid-item的事件
itemClick(index) {
// console.log(index);
}
}
};
</script>
<style scoped lang="scss">
.grid-text {
font-size: 28rpx;
margin-top: 4rpx;
color: $u-type-info;
}
.badge-icon {
position: absolute;
width: 40rpx;
height: 40rpx;
}
.swiper {
height: 480rpx;
}
.indicator-dots {
margin-top: 40rpx;
display: flex;
justify-content: center;
align-items: center;
}
.indicator-dots-item {
background-color: $u-tips-color;
height: 6px;
width: 6px;
border-radius: 10px;
margin: 0 3px;
}
.indicator-dots-active {
background-color: $u-type-primary;
}
</style>
# 给宫格设置右上角的角标和图标
可以通过uView的badge
(注意Badge在此需要设置相关定位属性,详见Badge)或者image
设置宫格有右上角的内容
<template>
<u-grid :col="3">
<u-grid-item>
<u-badge count="9" :offset="[20, 20]"></u-badge>
<u-icon name="photo" :size="46"></u-icon>
<view class="grid-text">图片</view>
</u-grid-item>
<u-grid-item>
<image src="/static/image/icon/hot5.png" class="badge-icon"></image>
<u-icon name="lock" :size="46"></u-icon>
<view class="grid-text">锁头</view>
</u-grid-item>
<u-grid-item>
<u-icon name="hourglass" :size="46"></u-icon>
<view class="grid-text">沙漏</view>
</u-grid-item>
</u-grid>
</template>
<style scoped lang="scss">
.badge-icon {
position: absolute;
top: 14rpx;
right: 40rpx;
width: 30rpx;
height: 30rpx;
}
.grid-text {
font-size: 28rpx;
margin-top: 4rpx;
color: $u-type-info;
}
</style>
# 实现宫格的左右滑动
结合uni的swiper组件可以实现宫格的左右滑动,因为swiper
特性的关系,请指定swiper
的高度 ,否则swiper
的高度不会被内容撑开,可以自定义swiper
的指示器,达到更高的灵活度
<template>
<swiper class="swiper" @change="change">
<swiper-item>
<u-grid :col="3" @click="click" hover-class="hover-class">
<u-grid-item v-for="(item, index) in list" :index="index" :key="index">
<u-icon :name="item" :size="46"></u-icon>
<text class="grid-text">{{ '宫格' + (index + 1) }}</text>
</u-grid-item>
</u-grid>
</swiper-item>
<swiper-item>
<u-grid :col="3" @click="click">
<u-grid-item v-for="(item, index) in list" :index="index + 9" :key="index">
<u-icon :name="item" :size="46"></u-icon>
<text class="grid-text">{{ '宫格' + (index + 1) }}</text>
</u-grid-item>
</u-grid>
</swiper-item>
<swiper-item>
<u-grid :col="3" @click="click">
<u-grid-item v-for="(item, index) in list" :index="index + 18" :key="index">
<u-icon :name="item" :size="46"></u-icon>
<text class="grid-text">{{ '宫格' + (index + 1) }}</text>
</u-grid-item>
</u-grid>
</swiper-item>
</swiper>
<view class="indicator-dots" v-if="isSwiper">
<view class="indicator-dots-item" :class="[current == 0 ? 'indicator-dots-active' : '']">
</view>
<view class="indicator-dots-item" :class="[current == 1 ? 'indicator-dots-active' : '']">
</view>
<view class="indicator-dots-item" :class="[current == 2 ? 'indicator-dots-active' : '']">
</view>
</view>
</template>
<script>
export default {
data() {
return {
current: 0,
list: ['integral', 'kefu-ermai', 'coupon', 'gift', 'scan', 'pause-circle', 'wifi', 'email', 'list']
};
},
methods: {
change(e) {
this.current = e.detail.current;
}
}
};
</script>
<style scoped lang="scss">
/* 下方这些scss变量为uView内置变量,详见开发 组件-指南-内置样式 */
.grid-text {
font-size: 28rpx;
margin-top: 4rpx;
color: $u-type-info;
}
.swiper {
height: 480rpx;
}
.indicator-dots {
margin-top: 40rpx;
display: flex;
justify-content: center;
align-items: center;
}
.indicator-dots-item {
background-color: $u-tips-color;
height: 6px;
width: 6px;
border-radius: 10px;
margin: 0 3px;
}
.indicator-dots-active {
background-color: $u-type-primary;
}
</style>
# API
# Grid Props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
col | 宫格的列数 | String | Number | 3 | - |
border FPI已废弃 | 是否显示宫格的边框 | Boolean | true | false |
align | 宫格的对齐方式,用于控制只有一两个宫格时的对齐场景 | String | left | center / right |
hover-class | 样式类名,按下时有效,样式必须写在根目录的App.vue 或通过其引入的全局样式中才有效,none 为无效果,作用于头部标题区域 | String | u-hover-class | none / 其他 |
# Grid-item Props
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
bg-color | 宫格的背景颜色 | String | #ffffff | - |
index | 点击宫格时,返回的值 | String | Number | - | - |
custom-style 1.6.8 | 自定义样式,对象形式 | Object | {padding: '30rpx 0'} | - |
# Grid Event
注意:请在<u-grid></u-grid>
上监听此事件
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击宫格触发 | index: u-grid-item 通过props 传递的index 值 |
# Grid-item Event
注意:请在<u-grid-item></u-grid-item>
上监听此事件
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击宫格触发 | index: u-grid-item 通过props 传递的index 值 |
← Mask 遮罩层 TimeLine 时间轴 →