fix rate
parent
37b40bcd38
commit
3b78524e5d
|
@ -1,32 +1,7 @@
|
|||
<template>
|
||||
<ul
|
||||
:class="classes"
|
||||
@mouseleave="onMouseLeave">
|
||||
<template v-for="i in count">
|
||||
<Star
|
||||
ref="stars"
|
||||
:index="i - 1"
|
||||
:disabled="disabled"
|
||||
:prefix-cls="`${prefixCls}-star`"
|
||||
:allowHalf="allowHalf"
|
||||
:value="hoverValue === undefined ? stateValue : hoverValue"
|
||||
@click="onClick"
|
||||
@hover="onHover"
|
||||
:key="i - 1">
|
||||
<template slot-scope="props">
|
||||
<slot>
|
||||
<span>{{character}}</span>
|
||||
</slot>
|
||||
</template>
|
||||
</Star>
|
||||
</template>
|
||||
</ul>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Star from './Star.vue'
|
||||
import Icon from '../icon'
|
||||
import { getOffsetLeft } from './util'
|
||||
import { getOffsetLeft, deepClone } from './util'
|
||||
|
||||
export default {
|
||||
name: 'Rate',
|
||||
|
@ -73,13 +48,17 @@ export default {
|
|||
[`${prefixCls}-disabled`]: disabled,
|
||||
}
|
||||
},
|
||||
countList () {
|
||||
return new Array(this.count).fill(1)
|
||||
},
|
||||
hasDefaultSlot () {
|
||||
return !!this.$slots.default
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
onClick (event, index) {
|
||||
const value = this.getStarValue(index, event.pageX)
|
||||
if (this.value === undefined) {
|
||||
this.stateValue = value
|
||||
}
|
||||
this.stateValue = value
|
||||
this.onMouseLeave()
|
||||
this.$emit('input', value)
|
||||
this.$emit('change', value)
|
||||
|
@ -90,7 +69,7 @@ export default {
|
|||
this.$emit('hover-change', value)
|
||||
},
|
||||
getStarDOM (index) {
|
||||
return this.$refs.stars[index].$el
|
||||
return this.$refs['stars' + index].$el
|
||||
},
|
||||
getStarValue (index, x) {
|
||||
const { allowHalf, getStarDOM } = this
|
||||
|
@ -119,5 +98,36 @@ export default {
|
|||
Star,
|
||||
Icon,
|
||||
},
|
||||
render (createElement, a) {
|
||||
const self = this
|
||||
return createElement('ul', {
|
||||
class: self.classes,
|
||||
on: {
|
||||
'mouseleave': self.onMouseLeave,
|
||||
},
|
||||
}, [
|
||||
(
|
||||
self.countList.map((item, i) => {
|
||||
return createElement('Star', {
|
||||
attrs: {
|
||||
index: i,
|
||||
disabled: self.disabled,
|
||||
'prefix-cls': `${self.prefixCls}-star`,
|
||||
allowHalf: self.allowHalf,
|
||||
value: self.hoverValue === undefined ? self.stateValue : self.hoverValue,
|
||||
},
|
||||
ref: 'stars' + i,
|
||||
key: i,
|
||||
on: {
|
||||
'click': self.onClick,
|
||||
'hover': self.onHover,
|
||||
},
|
||||
}, [
|
||||
((self.hasDefaultSlot) ? (deepClone(self.$slots.default, createElement)) : this.character),
|
||||
])
|
||||
})
|
||||
),
|
||||
])
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
|
|
@ -1,13 +1,6 @@
|
|||
<template>
|
||||
<li
|
||||
:class="getClassName"
|
||||
@click="onClick"
|
||||
@mousemove="onHover">
|
||||
<div :class="`${prefixCls}-first`"><slot></slot></div>
|
||||
<div :class="`${prefixCls}-second`"><slot></slot></div>
|
||||
</li>
|
||||
</template>
|
||||
<script>
|
||||
import { deepClone } from './util'
|
||||
|
||||
export default {
|
||||
name: 'Star',
|
||||
props: {
|
||||
|
@ -37,5 +30,31 @@ export default {
|
|||
this.$emit('hover', e, this.index)
|
||||
},
|
||||
},
|
||||
render (createElement) {
|
||||
return createElement('li', {
|
||||
attrs: {
|
||||
class: this.getClassName,
|
||||
},
|
||||
on: {
|
||||
'click': this.onClick,
|
||||
'mousemove': this.onHover,
|
||||
},
|
||||
}, [
|
||||
createElement('div', {
|
||||
attrs: {
|
||||
class: `${this.prefixCls}-first`,
|
||||
},
|
||||
}, [
|
||||
...this.$slots.default,
|
||||
]),
|
||||
createElement('div', {
|
||||
attrs: {
|
||||
class: `${this.prefixCls}-second`,
|
||||
},
|
||||
}, [
|
||||
...deepClone(this.$slots.default, createElement),
|
||||
]),
|
||||
])
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
|
|
@ -27,7 +27,14 @@
|
|||
<span v-if="hoverValueAH">{{hoverValueAH}}stars</span>
|
||||
</br>
|
||||
自定义
|
||||
<Rate :value="initValue" :allowHalf="allowHalf" :character="character"></Rate>
|
||||
</br>
|
||||
<Rate v-model="initValue" :allowHalf="allowHalf">
|
||||
<Icon type="heart" />
|
||||
</Rate>
|
||||
</br>
|
||||
<Rate :value="initValue" :allowHalf="allowHalf" character="A"></Rate>
|
||||
</br>
|
||||
<Rate :value="initValue" character="好"></Rate>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
|
|
|
@ -37,3 +37,23 @@ export function getOffsetLeft (el) {
|
|||
pos.left += getScroll(w)
|
||||
return pos.left
|
||||
}
|
||||
|
||||
export function deepClone (vnodes, createElement) {
|
||||
function cloneVNode (vnode) {
|
||||
const clonedChildren = vnode.children && vnode.children.map(vnode => cloneVNode(vnode))
|
||||
const cloned = createElement(vnode.tag, vnode.data, clonedChildren)
|
||||
cloned.text = vnode.text
|
||||
cloned.isComment = vnode.isComment
|
||||
cloned.componentOptions = vnode.componentOptions
|
||||
cloned.elm = vnode.elm
|
||||
cloned.context = vnode.context
|
||||
cloned.ns = vnode.ns
|
||||
cloned.isStatic = vnode.isStatic
|
||||
cloned.key = vnode.key
|
||||
|
||||
return cloned
|
||||
}
|
||||
|
||||
const clonedVNodes = vnodes.map(vnode => cloneVNode(vnode))
|
||||
return clonedVNodes
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue