绩效考核手机版
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.

141 lines
4.0 KiB

3 years ago
<template>
<view class="s-grid-item" :class="c_class" :style="c_style">
<view
class="s-grid-item__wrap"
:class="wrap_class"
:style="wrap_style"
:hover-class="hoverClass"
:hover-start-time="hoverStartTime"
:hover-stay-time="hoverStayTime"
@click="onItemClick"
>
<view class="s-grid-item__content" :style="content_style">
<slot>
<view class="s-grid-item__icon">
<slot name="icon">
<s-icon
:icon-prefix="iconPrefix"
:name="icon"
:size="iconSize"
:color="iconColor"
/>
</slot>
<s-badge :value="badge" :dot="dot" />
</view>
<view class="s-grid-item__text" :style="text_style">
<slot name="text">{{ text }}</slot>
</view>
</slot>
</view>
</view>
</view>
</template>
<script>
import componentMixin from '../../mixins/componentMixin';
/**
* s-grid-item 宫格格子
* @description 宫格里面格子item父级必须为grid组件
* @property {Number|String} width 容器宽度
* @property {Number|String} height 容器高度
* @property {String} icon 图标名称或图片链接
* @property {String} text 文字
* @property {String} iconPrefix 图标类名前缀 Icon 组件的 class-prefix 属性
* @property {Number|String} iconSize 图标大小
* @property {String} iconColor 图标颜色
* @property {Number|String} badge 图标右上角徽标的内容
* @property {Boolean} dot 是否显示图标右上角小红点
* @property {Number|String} padding 内边距
* @property {String} background 背景色
* @property {String|Object} textStyle 文字样式
* @property {String} hoverClass 点击效果设为none可禁用点击效果
* @property {Number} hoverStartTime 按住后多久出现点击态单位毫秒
* @property {Number} hoverStayTime 手指松开后点击态保留时间单位毫秒
* @event {Function} click (e) 点击事件
* @example <s-grid-item icon="" text="" />
*/
export default {
name: 'SGridItem',
mixins: [componentMixin],
props: {
width: [Number, String],
height: [Number, String],
radius: [Number, String],
icon: String,
text: String,
iconPrefix: String,
iconSize: [Number, String],
iconColor: String,
badge: [Number, String],
dot: Boolean,
padding: [Number, String],
background: String,
textStyle: [String, Object],
hoverClass: {
type: String,
default: 's-grid-item--hover',
},
hoverStartTime: {
type: Number,
default: 0,
},
hoverStayTime: {
type: Number,
default: 100,
},
},
computed: {
c_class() {
const { square, direction, space } = this.$sGrid;
return this.$mergeClass({
's-grid-item--square': square,
[`s-grid-item--${direction}`]: direction,
's-grid-item--gutter': space,
}, this.custom_class);
},
c_style() {
const { column, space } = this.$sGrid;
const percent = (100 / Number(column)) + '%';
return this.$mergeStyle({
width: this.width ? this.$addUnit(this.width) : percent,
padding: space,
}, this.custom_style);
},
wrap_class() {
const { border } = this.$sGrid;
return this.$mergeClass({
's-hairline': border,
});
},
wrap_style() {
const { borderColor, square } = this.$sGrid;
return this.$mergeStyle({
height: square ? '' : this.$addUnit(this.height),
background: this.background,
borderColor,
borderRadius: this.$addUnit(this.radius),
});
},
content_style() {
return this.$mergeStyle({
padding: this.padding,
});
},
text_style() {
return this.$mergeStyle(this.textStyle);
},
},
created() {
this.$sGrid = this.$getParentUntil('SGrid');
},
methods: {
onItemClick(e) {
this.$emit('click', e);
},
},
};
</script>
<style lang="scss" src="./index.scss"></style>