Commit 6aa72722609a973e592bed8032d2ba3cd351793b
1 parent
49dd45f4
Support rate
Showing
5 changed files
with
62 additions
and
21 deletions
Show diff stats
src/components/rate/rate.vue
| ... | ... | @@ -7,18 +7,19 @@ |
| 7 | 7 | @click="handleClick(item)"> |
| 8 | 8 | <span :class="[prefixCls + '-star-content']" type="half"></span> |
| 9 | 9 | </div> |
| 10 | - <div :class="[prefixCls + '-text']" v-if="showText" v-show="value > 0"> | |
| 11 | - <slot>{{ value }} <template v-if="value <= 1">{{ t('i.rate.star') }}</template><template v-else>{{ t('i.rate.stars') }}</template></slot> | |
| 10 | + <div :class="[prefixCls + '-text']" v-if="showText" v-show="currentValue > 0"> | |
| 11 | + <slot>{{ currentValue }} <template v-if="currentValue <= 1">{{ t('i.rate.star') }}</template><template v-else>{{ t('i.rate.stars') }}</template></slot> | |
| 12 | 12 | </div> |
| 13 | 13 | </div> |
| 14 | 14 | </template> |
| 15 | 15 | <script> |
| 16 | 16 | import Locale from '../../mixins/locale'; |
| 17 | + import Emitter from '../../mixins/emitter'; | |
| 17 | 18 | |
| 18 | 19 | const prefixCls = 'ivu-rate'; |
| 19 | 20 | |
| 20 | 21 | export default { |
| 21 | - mixins: [ Locale ], | |
| 22 | + mixins: [ Locale, Emitter ], | |
| 22 | 23 | props: { |
| 23 | 24 | count: { |
| 24 | 25 | type: Number, |
| ... | ... | @@ -46,9 +47,16 @@ |
| 46 | 47 | prefixCls: prefixCls, |
| 47 | 48 | hoverIndex: -1, |
| 48 | 49 | isHover: false, |
| 49 | - isHalf: false | |
| 50 | + isHalf: false, | |
| 51 | + currentValue: 0 | |
| 50 | 52 | }; |
| 51 | 53 | }, |
| 54 | + // created () { | |
| 55 | + // this.currentValue = this.value; | |
| 56 | + // this.setHalf(this.currentValue); | |
| 57 | + // }, | |
| 58 | + mounted () { | |
| 59 | + }, | |
| 52 | 60 | computed: { |
| 53 | 61 | classes () { |
| 54 | 62 | return [ |
| ... | ... | @@ -63,24 +71,38 @@ |
| 63 | 71 | value: { |
| 64 | 72 | immediate: true, |
| 65 | 73 | handler (val) { |
| 66 | - this.setHalf(val); | |
| 74 | + this.currentValue = val; | |
| 75 | + } | |
| 76 | + }, | |
| 77 | + // valur (val) { | |
| 78 | + // console.log(val); | |
| 79 | + // this.currentValue = val; | |
| 80 | + // console.log(this.currentValue); | |
| 81 | + // }, | |
| 82 | + currentValue: { | |
| 83 | + immediate: true, | |
| 84 | + handler (val) { | |
| 85 | + this.setHalf(this.currentValue); | |
| 67 | 86 | } |
| 68 | 87 | } |
| 88 | + // currentValue () { | |
| 89 | + // this.setHalf(this.currentValue); | |
| 90 | + // } | |
| 69 | 91 | }, |
| 70 | 92 | methods: { |
| 71 | 93 | starCls (value) { |
| 72 | 94 | const hoverIndex = this.hoverIndex; |
| 73 | - const currentIndex = this.isHover ? hoverIndex : this.value; | |
| 95 | + const currentIndex = this.isHover ? hoverIndex : this.currentValue; | |
| 74 | 96 | |
| 75 | 97 | let full = false; |
| 76 | 98 | let isLast = false; |
| 77 | 99 | |
| 78 | - if (currentIndex > value) full = true; | |
| 100 | + if (currentIndex >= value) full = true; | |
| 79 | 101 | |
| 80 | 102 | if (this.isHover) { |
| 81 | - isLast = currentIndex === value + 1; | |
| 103 | + isLast = currentIndex === value; | |
| 82 | 104 | } else { |
| 83 | - isLast = Math.ceil(this.value) === value + 1; | |
| 105 | + isLast = Math.ceil(this.currentValue) === value; | |
| 84 | 106 | } |
| 85 | 107 | |
| 86 | 108 | return [ |
| ... | ... | @@ -102,13 +124,13 @@ |
| 102 | 124 | } else { |
| 103 | 125 | this.isHalf = false; |
| 104 | 126 | } |
| 105 | - this.hoverIndex = value + 1; | |
| 127 | + this.hoverIndex = value; | |
| 106 | 128 | }, |
| 107 | 129 | handleMouseleave () { |
| 108 | 130 | if (this.disabled) return; |
| 109 | 131 | |
| 110 | 132 | this.isHover = false; |
| 111 | - this.setHalf(this.value); | |
| 133 | + this.setHalf(this.currentValue); | |
| 112 | 134 | this.hoverIndex = -1; |
| 113 | 135 | }, |
| 114 | 136 | setHalf (val) { |
| ... | ... | @@ -116,11 +138,13 @@ |
| 116 | 138 | }, |
| 117 | 139 | handleClick (value) { |
| 118 | 140 | if (this.disabled) return; |
| 119 | - value++; | |
| 141 | + // value++; | |
| 120 | 142 | if (this.isHalf) value -= 0.5; |
| 121 | - this.value = value; | |
| 122 | - this.$emit('on-change', value); | |
| 123 | - this.$dispatch('on-form-change', value); | |
| 143 | + this.currentValue = value; | |
| 144 | + this.$emit('on-change', this.currentValue); | |
| 145 | + this.$emit('input', this.currentValue); | |
| 146 | + // @todo | |
| 147 | + // this.$dispatch('on-form-change', value); | |
| 124 | 148 | } |
| 125 | 149 | } |
| 126 | 150 | }; | ... | ... |
src/index.js
| ... | ... | @@ -28,7 +28,7 @@ import InputNumber from './components/input-number'; |
| 28 | 28 | // import Poptip from './components/poptip'; |
| 29 | 29 | import Progress from './components/progress'; |
| 30 | 30 | import Radio from './components/radio'; |
| 31 | -// import Rate from './components/rate'; | |
| 31 | +import Rate from './components/rate'; | |
| 32 | 32 | // import Slider from './components/slider'; |
| 33 | 33 | // import Spin from './components/spin'; |
| 34 | 34 | import Steps from './components/steps'; |
| ... | ... | @@ -91,7 +91,7 @@ const iview = { |
| 91 | 91 | Progress, |
| 92 | 92 | Radio, |
| 93 | 93 | RadioGroup: Radio.Group, |
| 94 | - // Rate, | |
| 94 | + Rate, | |
| 95 | 95 | Row, |
| 96 | 96 | // iSelect: Select, |
| 97 | 97 | // Slider, | ... | ... |
test/app.vue
| ... | ... | @@ -32,6 +32,7 @@ li + li { border-left: solid 1px #bbb; padding-left: 10px; margin-left: 10px; } |
| 32 | 32 | <li><router-link to="/carousel">Carousel</router-link></li> |
| 33 | 33 | <li><router-link to="/card">Card</router-link></li> |
| 34 | 34 | <li><router-link to="/tree">Tree</router-link></li> |
| 35 | + <li><router-link to="/rate">Rate</router-link></li> | |
| 35 | 36 | </ul> |
| 36 | 37 | </nav> |
| 37 | 38 | <router-view></router-view> | ... | ... |
test/main.js
test/routers/rate.vue
| 1 | 1 | <template> |
| 2 | 2 | <Row> |
| 3 | 3 | <i-col span="12"> |
| 4 | - <Rate show-text :value.sync="valueText"></Rate> | |
| 4 | + <Rate show-text :value="valueText"></Rate> | |
| 5 | 5 | </i-col> |
| 6 | 6 | <i-col span="12"> |
| 7 | - <Rate show-text :value.sync="valueCustomText"> | |
| 7 | + <Rate show-text v-model="valueCustomText" > | |
| 8 | 8 | <span style="color: #f5a623">{{ valueCustomText }}</span> |
| 9 | 9 | </Rate> |
| 10 | 10 | </i-col> |
| 11 | + <i-col span="12"> | |
| 12 | + <Rate disabled :value="valueDisabled"></Rate> | |
| 13 | + </i-col> | |
| 14 | + <i-col span="12"> | |
| 15 | + <Rate allow-half :value="valueHalf" v-on:on-change="changeValue"></Rate> | |
| 16 | + </i-col> | |
| 11 | 17 | </Row> |
| 12 | 18 | </template> |
| 13 | 19 | <script> |
| ... | ... | @@ -16,10 +22,16 @@ |
| 16 | 22 | data () { |
| 17 | 23 | return { |
| 18 | 24 | valueText: 3, |
| 19 | - valueCustomText: 3.8 | |
| 25 | + valueCustomText: 3.8, | |
| 26 | + valueDisabled: 2, | |
| 27 | + valueHalf: 2.5 | |
| 20 | 28 | }; |
| 21 | 29 | }, |
| 22 | 30 | computed: {}, |
| 23 | - methods: {} | |
| 31 | + methods: { | |
| 32 | + changeValue (val) { | |
| 33 | + console.log(val); | |
| 34 | + } | |
| 35 | + } | |
| 24 | 36 | }; |
| 25 | 37 | </script> |
| 26 | 38 | \ No newline at end of file | ... | ... |