import { VantComponent } from '../common/component'; import { canIUseModel } from '../common/version'; VantComponent({ field: true, classes: ['icon-class'], props: { value: { type: Number, observer(value) { if (value !== this.data.innerValue) { this.setData({ innerValue: value }); } }, }, readonly: Boolean, disabled: Boolean, allowHalf: Boolean, size: null, icon: { type: String, value: 'star', }, voidIcon: { type: String, value: 'star-o', }, color: { type: String, value: '#ffd21e', }, voidColor: { type: String, value: '#c7c7c7', }, disabledColor: { type: String, value: '#bdbdbd', }, count: { type: Number, value: 5, observer(value) { this.setData({ innerCountArray: Array.from({ length: value }) }); }, }, gutter: null, touchable: { type: Boolean, value: true, }, }, data: { innerValue: 0, innerCountArray: Array.from({ length: 5 }), }, methods: { onSelect(event) { const { data } = this; const { score } = event.currentTarget.dataset; if (!data.disabled && !data.readonly) { this.setData({ innerValue: score + 1 }); if (canIUseModel()) { this.setData({ value: score + 1 }); } wx.nextTick(() => { this.$emit('input', score + 1); this.$emit('change', score + 1); }); } }, onTouchMove(event) { const { touchable } = this.data; if (!touchable) return; const { clientX } = event.touches[0]; this.getRect('.van-rate__icon', true).then((list) => { const target = list .sort((item) => item.right - item.left) .find((item) => clientX >= item.left && clientX <= item.right); if (target != null) { this.onSelect( Object.assign(Object.assign({}, event), { currentTarget: target }) ); } }); }, }, });