You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
<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>
|