,
default: 'medium'
@@ -100,16 +101,12 @@ export default defineComponent({
function handleClick (index: number, e: MouseEvent): void {
doUpdateValue(getDerivedValue(index, e))
}
- function handleHalfClick (index: number): void {
- doUpdateValue(index + 0.5)
- }
return {
mergedClsPrefix: mergedClsPrefixRef,
mergedValue: useMergedState(controlledValueRef, uncontrolledValueRef),
hoverIndex: hoverIndexRef,
handleMouseMove,
handleClick,
- handleHalfClick,
handleMouseLeave,
cssVars: computed(() => {
const { size } = props
@@ -135,6 +132,7 @@ export default defineComponent({
},
render () {
const {
+ readonly,
hoverIndex,
mergedValue,
mergedClsPrefix,
@@ -142,7 +140,12 @@ export default defineComponent({
} = this
return (
@@ -166,12 +169,20 @@ export default defineComponent({
: index + 1 <= mergedValue
}
]}
- onClick={(e) => {
- this.handleClick(index, e)
- }}
- onMousemove={(e) => {
- this.handleMouseMove(index, e)
- }}
+ onClick={
+ readonly
+ ? undefined
+ : (e) => {
+ this.handleClick(index, e)
+ }
+ }
+ onMousemove={
+ readonly
+ ? undefined
+ : (e) => {
+ this.handleMouseMove(index, e)
+ }
+ }
>
{icon}
{this.allowHalf ? (
diff --git a/src/rate/src/styles/index.cssr.ts b/src/rate/src/styles/index.cssr.ts
index 19d3175ae16..06023bed85e 100644
--- a/src/rate/src/styles/index.cssr.ts
+++ b/src/rate/src/styles/index.cssr.ts
@@ -1,4 +1,4 @@
-import { c, cB, cE, cM } from '../../../_utils/cssr'
+import { c, cB, cE, cM, cNotM } from '../../../_utils/cssr'
// vars:
// --bezier
@@ -23,15 +23,8 @@ export default cB('rate', {
color .3s var(--bezier);
transform: scale(1);
font-size: var(--item-size);
- cursor: pointer;
color: var(--item-color);
`, [
- c('&:hover', {
- transform: 'scale(1.05)'
- }),
- c('&:active', {
- transform: 'scale(0.96)'
- }),
c('&:not(:first-child)', {
marginLeft: '6px'
}),
@@ -39,6 +32,18 @@ export default cB('rate', {
color: 'var(--item-color-active)'
})
]),
+ cNotM('readonly', `
+ cursor: pointer;
+ `, [
+ cE('item', [
+ c('&:hover', {
+ transform: 'scale(1.05)'
+ }),
+ c('&:active', {
+ transform: 'scale(0.96)'
+ })
+ ])
+ ]),
cE('half', `
display: flex;
transition: inherit;
@@ -49,7 +54,7 @@ export default cB('rate', {
width: 50%;
overflow: hidden;
color: var(--item-color);
-`, [
+ `, [
cM('active', {
color: 'var(--item-color-active)'
})
diff --git a/src/rate/tests/Rate.spec.ts b/src/rate/tests/Rate.spec.ts
index 5d7918880ae..026bcd6eb5b 100644
--- a/src/rate/tests/Rate.spec.ts
+++ b/src/rate/tests/Rate.spec.ts
@@ -79,4 +79,23 @@ describe('n-rate', () => {
wrapper.unmount()
})
+
+ it('should work with `readonly` prop', async () => {
+ const wrapper = mount(NRate)
+
+ await wrapper.setProps({ readonly: true })
+
+ expect(wrapper.find('.n-rate').classes()).toContain('n-rate--readonly')
+
+ await wrapper.setProps({ readonly: true, value: 3 })
+ expect(wrapper.findAll('.n-rate__item--active').length).toBe(3)
+
+ await wrapper.findAll('.n-rate__item')[3].trigger('click')
+ expect(wrapper.findAll('.n-rate__item--active').length).toBe(3)
+
+ await wrapper.findAll('.n-rate__item')[3].trigger('mousemove')
+ expect(wrapper.findAll('.n-rate__item--active').length).toBe(3)
+
+ wrapper.unmount()
+ })
})