127 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
		
		
			
		
	
	
			127 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
|  | <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> |