vant/packages/rate/index.vue
2018-11-15 15:30:17 +08:00

95 lines
2.1 KiB
Vue

<template>
<div
:class="b()"
@touchmove="onTouchMove"
>
<svg
v-for="(isFull, index) in list"
:fill="disabled ? disabledColor : isFull ? color : voidColor"
viewBox="0 0 32 32"
:style="style"
:class="b('item')"
:data-index="index"
@click="onSelect(index)"
>
<path :d="isFull ? 'M32 12.408l-11.056-1.607-4.944-10.018-4.944 10.018-11.056 1.607 8 7.798-1.889 11.011 9.889-5.199 9.889 5.199-1.889-11.011 8-7.798z' : 'M32 12.408l-11.056-1.607-4.944-10.018-4.944 10.018-11.056 1.607 8 7.798-1.889 11.011 9.889-5.199 9.889 5.199-1.889-11.011 8-7.798zM16 23.547l-6.983 3.671 1.334-7.776-5.65-5.507 7.808-1.134 3.492-7.075 3.492 7.075 7.807 1.134-5.65 5.507 1.334 7.776-6.983-3.671z'" />
</svg>
</div>
</template>
<script>
import create from '../utils/create';
export default create({
name: 'rate',
props: {
readonly: Boolean,
disabled: Boolean,
size: {
type: Number,
default: 20
},
color: {
type: String,
default: '#ffd21e'
},
voidColor: {
type: String,
default: '#c7c7c7'
},
disabledColor: {
type: String,
default: '#bdbdbd'
},
count: {
type: Number,
default: 5
},
value: {
type: Number,
default: 0
}
},
computed: {
style() {
return {
width: this.size + 'px'
};
},
list() {
return Array.apply(null, { length: this.count }).map((value, index) => index < this.value);
}
},
methods: {
onSelect(index) {
if (!this.disabled && !this.readonly) {
this.$emit('input', index + 1);
this.$emit('change', index + 1);
}
},
onTouchMove(event) {
if (!document.elementFromPoint) {
return;
}
event.preventDefault();
const { clientX, clientY } = event.touches[0];
const target = document.elementFromPoint(clientX, clientY);
if (target && target.dataset) {
const { index } = target.dataset;
/* istanbul ignore else */
if (index) {
this.onSelect(+index);
}
}
}
}
});
</script>