Commit de517e39f63322a6acb7e739fb815a5d95e97ef3
Committed by
GitHub
Merge pull request #335 from huixisheng/feature-rate
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,18 +7,19 @@ | ||
7 | @click="handleClick(item)"> | 7 | @click="handleClick(item)"> |
8 | <span :class="[prefixCls + '-star-content']" type="half"></span> | 8 | <span :class="[prefixCls + '-star-content']" type="half"></span> |
9 | </div> | 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 | </div> | 12 | </div> |
13 | </div> | 13 | </div> |
14 | </template> | 14 | </template> |
15 | <script> | 15 | <script> |
16 | import Locale from '../../mixins/locale'; | 16 | import Locale from '../../mixins/locale'; |
17 | + import Emitter from '../../mixins/emitter'; | ||
17 | 18 | ||
18 | const prefixCls = 'ivu-rate'; | 19 | const prefixCls = 'ivu-rate'; |
19 | 20 | ||
20 | export default { | 21 | export default { |
21 | - mixins: [ Locale ], | 22 | + mixins: [ Locale, Emitter ], |
22 | props: { | 23 | props: { |
23 | count: { | 24 | count: { |
24 | type: Number, | 25 | type: Number, |
@@ -46,9 +47,16 @@ | @@ -46,9 +47,16 @@ | ||
46 | prefixCls: prefixCls, | 47 | prefixCls: prefixCls, |
47 | hoverIndex: -1, | 48 | hoverIndex: -1, |
48 | isHover: false, | 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 | computed: { | 60 | computed: { |
53 | classes () { | 61 | classes () { |
54 | return [ | 62 | return [ |
@@ -63,24 +71,38 @@ | @@ -63,24 +71,38 @@ | ||
63 | value: { | 71 | value: { |
64 | immediate: true, | 72 | immediate: true, |
65 | handler (val) { | 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 | methods: { | 92 | methods: { |
71 | starCls (value) { | 93 | starCls (value) { |
72 | const hoverIndex = this.hoverIndex; | 94 | const hoverIndex = this.hoverIndex; |
73 | - const currentIndex = this.isHover ? hoverIndex : this.value; | 95 | + const currentIndex = this.isHover ? hoverIndex : this.currentValue; |
74 | 96 | ||
75 | let full = false; | 97 | let full = false; |
76 | let isLast = false; | 98 | let isLast = false; |
77 | 99 | ||
78 | - if (currentIndex > value) full = true; | 100 | + if (currentIndex >= value) full = true; |
79 | 101 | ||
80 | if (this.isHover) { | 102 | if (this.isHover) { |
81 | - isLast = currentIndex === value + 1; | 103 | + isLast = currentIndex === value; |
82 | } else { | 104 | } else { |
83 | - isLast = Math.ceil(this.value) === value + 1; | 105 | + isLast = Math.ceil(this.currentValue) === value; |
84 | } | 106 | } |
85 | 107 | ||
86 | return [ | 108 | return [ |
@@ -102,13 +124,13 @@ | @@ -102,13 +124,13 @@ | ||
102 | } else { | 124 | } else { |
103 | this.isHalf = false; | 125 | this.isHalf = false; |
104 | } | 126 | } |
105 | - this.hoverIndex = value + 1; | 127 | + this.hoverIndex = value; |
106 | }, | 128 | }, |
107 | handleMouseleave () { | 129 | handleMouseleave () { |
108 | if (this.disabled) return; | 130 | if (this.disabled) return; |
109 | 131 | ||
110 | this.isHover = false; | 132 | this.isHover = false; |
111 | - this.setHalf(this.value); | 133 | + this.setHalf(this.currentValue); |
112 | this.hoverIndex = -1; | 134 | this.hoverIndex = -1; |
113 | }, | 135 | }, |
114 | setHalf (val) { | 136 | setHalf (val) { |
@@ -116,11 +138,13 @@ | @@ -116,11 +138,13 @@ | ||
116 | }, | 138 | }, |
117 | handleClick (value) { | 139 | handleClick (value) { |
118 | if (this.disabled) return; | 140 | if (this.disabled) return; |
119 | - value++; | 141 | + // value++; |
120 | if (this.isHalf) value -= 0.5; | 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,7 +28,7 @@ import InputNumber from './components/input-number'; | ||
28 | // import Poptip from './components/poptip'; | 28 | // import Poptip from './components/poptip'; |
29 | import Progress from './components/progress'; | 29 | import Progress from './components/progress'; |
30 | import Radio from './components/radio'; | 30 | import Radio from './components/radio'; |
31 | -// import Rate from './components/rate'; | 31 | +import Rate from './components/rate'; |
32 | // import Slider from './components/slider'; | 32 | // import Slider from './components/slider'; |
33 | // import Spin from './components/spin'; | 33 | // import Spin from './components/spin'; |
34 | import Steps from './components/steps'; | 34 | import Steps from './components/steps'; |
@@ -91,7 +91,7 @@ const iview = { | @@ -91,7 +91,7 @@ const iview = { | ||
91 | Progress, | 91 | Progress, |
92 | Radio, | 92 | Radio, |
93 | RadioGroup: Radio.Group, | 93 | RadioGroup: Radio.Group, |
94 | - // Rate, | 94 | + Rate, |
95 | Row, | 95 | Row, |
96 | // iSelect: Select, | 96 | // iSelect: Select, |
97 | // Slider, | 97 | // Slider, |
test/app.vue
@@ -32,6 +32,7 @@ li + li { border-left: solid 1px #bbb; padding-left: 10px; margin-left: 10px; } | @@ -32,6 +32,7 @@ li + li { border-left: solid 1px #bbb; padding-left: 10px; margin-left: 10px; } | ||
32 | <li><router-link to="/carousel">Carousel</router-link></li> | 32 | <li><router-link to="/carousel">Carousel</router-link></li> |
33 | <li><router-link to="/card">Card</router-link></li> | 33 | <li><router-link to="/card">Card</router-link></li> |
34 | <li><router-link to="/tree">Tree</router-link></li> | 34 | <li><router-link to="/tree">Tree</router-link></li> |
35 | + <li><router-link to="/rate">Rate</router-link></li> | ||
35 | </ul> | 36 | </ul> |
36 | </nav> | 37 | </nav> |
37 | <router-view></router-view> | 38 | <router-view></router-view> |
test/main.js
@@ -92,6 +92,10 @@ const router = new VueRouter({ | @@ -92,6 +92,10 @@ const router = new VueRouter({ | ||
92 | { | 92 | { |
93 | path: '/tree', | 93 | path: '/tree', |
94 | component: require('./routers/tree.vue') | 94 | component: require('./routers/tree.vue') |
95 | + }, | ||
96 | + { | ||
97 | + path: '/rate', | ||
98 | + component: require('./routers/rate.vue') | ||
95 | } | 99 | } |
96 | ] | 100 | ] |
97 | }); | 101 | }); |
test/routers/rate.vue
1 | <template> | 1 | <template> |
2 | <Row> | 2 | <Row> |
3 | <i-col span="12"> | 3 | <i-col span="12"> |
4 | - <Rate show-text :value.sync="valueText"></Rate> | 4 | + <Rate show-text :value="valueText"></Rate> |
5 | </i-col> | 5 | </i-col> |
6 | <i-col span="12"> | 6 | <i-col span="12"> |
7 | - <Rate show-text :value.sync="valueCustomText"> | 7 | + <Rate show-text v-model="valueCustomText" > |
8 | <span style="color: #f5a623">{{ valueCustomText }}</span> | 8 | <span style="color: #f5a623">{{ valueCustomText }}</span> |
9 | </Rate> | 9 | </Rate> |
10 | </i-col> | 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 | </Row> | 17 | </Row> |
12 | </template> | 18 | </template> |
13 | <script> | 19 | <script> |
@@ -16,10 +22,16 @@ | @@ -16,10 +22,16 @@ | ||
16 | data () { | 22 | data () { |
17 | return { | 23 | return { |
18 | valueText: 3, | 24 | valueText: 3, |
19 | - valueCustomText: 3.8 | 25 | + valueCustomText: 3.8, |
26 | + valueDisabled: 2, | ||
27 | + valueHalf: 2.5 | ||
20 | }; | 28 | }; |
21 | }, | 29 | }, |
22 | computed: {}, | 30 | computed: {}, |
23 | - methods: {} | 31 | + methods: { |
32 | + changeValue (val) { | ||
33 | + console.log(val); | ||
34 | + } | ||
35 | + } | ||
24 | }; | 36 | }; |
25 | </script> | 37 | </script> |
26 | \ No newline at end of file | 38 | \ No newline at end of file |