<template> <view class="u-grid-item" :hover-class="parentData.hoverClass" :hover-stay-time="200" @tap="click" :style="{ background: bgColor, width: width, }"> <view class="u-grid-item-box" :style="[customStyle]" :class="[parentData.border ? 'u-border-right u-border-bottom' : '']"> <slot /> </view> </view> </template> <script> /** * gridItem 提示 * @description 宫格组件一般用于同时展示多个同类项目的场景,可以给宫格的项目设置徽标组件(badge),或者图标等,也可以扩展为左右滑动的轮播形式。搭配u-grid使用 * @tutorial https://www.uviewui.com/components/grid.html * @property {String} bg-color 宫格的背景颜色(默认#ffffff) * @property {String Number} index 点击宫格时,返回的值 * @property {Object} custom-style 自定义样式,对象形式 * @event {Function} click 点击宫格触发 * @example <u-grid-item></u-grid-item> */ export default { name: "u-grid-item", props: { // 背景颜色 bgColor: { type: String, default: '#ffffff' }, // 点击时返回的index index: { type: [Number, String], default: '' }, // 自定义样式,对象形式 customStyle: { type: Object, default() { return { padding: '30rpx 0' } } } }, data() { return { parentData: { hoverClass: '', // 按下去的时候,是否显示背景灰色 col: 3, // 父组件划分的宫格数 border: true, // 是否显示边框,根据父组件决定 } }; }, created() { // 父组件的实例 this.updateParentData(); // this.parent在updateParentData()中定义 this.parent.children.push(this); }, computed: { // 每个grid-item的宽度 width() { return 100 / Number(this.parentData.col) + '%'; }, }, methods: { // 获取父组件的参数 updateParentData() { // 此方法写在mixin中 this.getParentData('u-grid'); }, click() { this.$emit('click', this.index); this.parent && this.parent.click(this.index); } } }; </script> <style scoped lang="scss"> @import "../../libs/css/style.components.scss"; .u-grid-item { box-sizing: border-box; background: #fff; @include vue-flex; align-items: center; justify-content: center; position: relative; flex-direction: column; /* #ifdef MP */ position: relative; float: left; /* #endif */ } .u-grid-item-hover { background: #f7f7f7 !important; } .u-grid-marker-box { position: absolute; /* #ifndef APP-NVUE */ display: inline-flex; /* #endif */ line-height: 0; } .u-grid-marker-wrap { position: absolute; } .u-grid-item-box { padding: 30rpx 0; @include vue-flex; align-items: center; justify-content: center; flex-direction: column; flex: 1; width: 100%; height: 100%; } </style>