mirror of
https://gitee.com/vant-contrib/vant.git
synced 2025-05-23 06:59:15 +08:00
feat(CollapseItem): add readonly prop (#8445)
This commit is contained in:
parent
b594ab1192
commit
65185069bf
@ -2,7 +2,7 @@ import { ref, watch, computed, nextTick, defineComponent } from 'vue';
|
|||||||
|
|
||||||
// Utils
|
// Utils
|
||||||
import { cellProps } from '../cell/Cell';
|
import { cellProps } from '../cell/Cell';
|
||||||
import { createNamespace } from '../utils';
|
import { createNamespace, pick } from '../utils';
|
||||||
import { COLLAPSE_KEY, CollapseProvide } from '../collapse/Collapse';
|
import { COLLAPSE_KEY, CollapseProvide } from '../collapse/Collapse';
|
||||||
|
|
||||||
// Composables
|
// Composables
|
||||||
@ -22,6 +22,7 @@ export default defineComponent({
|
|||||||
...cellProps,
|
...cellProps,
|
||||||
name: [Number, String],
|
name: [Number, String],
|
||||||
disabled: Boolean,
|
disabled: Boolean,
|
||||||
|
readonly: Boolean,
|
||||||
isLink: {
|
isLink: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: true,
|
default: true,
|
||||||
@ -94,13 +95,24 @@ export default defineComponent({
|
|||||||
};
|
};
|
||||||
|
|
||||||
const onClickTitle = () => {
|
const onClickTitle = () => {
|
||||||
if (!props.disabled) {
|
if (!props.disabled && !props.readonly) {
|
||||||
toggle();
|
toggle();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const renderTitle = () => {
|
const renderTitle = () => {
|
||||||
const { border, disabled } = props;
|
const { border, disabled, readonly } = props;
|
||||||
|
const attrs = pick(
|
||||||
|
props,
|
||||||
|
Object.keys(cellProps) as Array<keyof typeof cellProps>
|
||||||
|
);
|
||||||
|
|
||||||
|
if (readonly) {
|
||||||
|
attrs.isLink = false;
|
||||||
|
}
|
||||||
|
if (disabled || readonly) {
|
||||||
|
attrs.clickable = false;
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Cell
|
<Cell
|
||||||
@ -116,10 +128,9 @@ export default defineComponent({
|
|||||||
expanded: expanded.value,
|
expanded: expanded.value,
|
||||||
borderless: !border,
|
borderless: !border,
|
||||||
})}
|
})}
|
||||||
tabindex={disabled ? -1 : 0}
|
|
||||||
aria-expanded={String(expanded.value)}
|
aria-expanded={String(expanded.value)}
|
||||||
onClick={onClickTitle}
|
onClick={onClickTitle}
|
||||||
{...props}
|
{...attrs}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -44,10 +44,6 @@
|
|||||||
& .van-cell__right-icon {
|
& .van-cell__right-icon {
|
||||||
color: @collapse-item-title-disabled-color;
|
color: @collapse-item-title-disabled-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:active {
|
|
||||||
background-color: @white;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,6 +132,7 @@ export default {
|
|||||||
| label | Description below the title | _string_ | - |
|
| label | Description below the title | _string_ | - |
|
||||||
| border | Whether to show inner border | _boolean_ | `true` |
|
| border | Whether to show inner border | _boolean_ | `true` |
|
||||||
| disabled | Whether to disabled collapse | _boolean_ | `false` |
|
| disabled | Whether to disabled collapse | _boolean_ | `false` |
|
||||||
|
| readonly `v3.0.12` | Whether to be readonly | _boolean_ | `false` |
|
||||||
| is-link | Whether to show link icon | _boolean_ | `true` |
|
| is-link | Whether to show link icon | _boolean_ | `true` |
|
||||||
| title-class | Title className | _string_ | - |
|
| title-class | Title className | _string_ | - |
|
||||||
| value-class | Value className | _string_ | - |
|
| value-class | Value className | _string_ | - |
|
||||||
|
@ -135,6 +135,7 @@ export default {
|
|||||||
| border | 是否显示内边框 | _boolean_ | `true` |
|
| border | 是否显示内边框 | _boolean_ | `true` |
|
||||||
| is-link | 是否展示标题栏右侧箭头并开启点击反馈 | _boolean_ | `true` |
|
| is-link | 是否展示标题栏右侧箭头并开启点击反馈 | _boolean_ | `true` |
|
||||||
| disabled | 是否禁用面板 | _boolean_ | `false` |
|
| disabled | 是否禁用面板 | _boolean_ | `false` |
|
||||||
|
| readonly `v3.0.12` | 是否为只读状态,只读状态下无法操作面板 | _boolean_ | `false` |
|
||||||
| title-class | 左侧标题额外类名 | _string_ | - |
|
| title-class | 左侧标题额外类名 | _string_ | - |
|
||||||
| value-class | 右侧内容额外类名 | _string_ | - |
|
| value-class | 右侧内容额外类名 | _string_ | - |
|
||||||
| label-class | 描述信息额外类名 | _string_ | - |
|
| label-class | 描述信息额外类名 | _string_ | - |
|
||||||
|
@ -8,7 +8,6 @@ exports[`should render demo and match snapshot 1`] = `
|
|||||||
role="button"
|
role="button"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
aria-expanded="true"
|
aria-expanded="true"
|
||||||
disabled="false"
|
|
||||||
>
|
>
|
||||||
<div class="van-cell__title">
|
<div class="van-cell__title">
|
||||||
<span>
|
<span>
|
||||||
@ -29,7 +28,6 @@ exports[`should render demo and match snapshot 1`] = `
|
|||||||
role="button"
|
role="button"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
disabled="false"
|
|
||||||
>
|
>
|
||||||
<div class="van-cell__title">
|
<div class="van-cell__title">
|
||||||
<span>
|
<span>
|
||||||
@ -45,7 +43,6 @@ exports[`should render demo and match snapshot 1`] = `
|
|||||||
role="button"
|
role="button"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
disabled="false"
|
|
||||||
>
|
>
|
||||||
<div class="van-cell__title">
|
<div class="van-cell__title">
|
||||||
<span>
|
<span>
|
||||||
@ -65,7 +62,6 @@ exports[`should render demo and match snapshot 1`] = `
|
|||||||
role="button"
|
role="button"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
aria-expanded="true"
|
aria-expanded="true"
|
||||||
disabled="false"
|
|
||||||
>
|
>
|
||||||
<div class="van-cell__title">
|
<div class="van-cell__title">
|
||||||
<span>
|
<span>
|
||||||
@ -86,7 +82,6 @@ exports[`should render demo and match snapshot 1`] = `
|
|||||||
role="button"
|
role="button"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
disabled="false"
|
|
||||||
>
|
>
|
||||||
<div class="van-cell__title">
|
<div class="van-cell__title">
|
||||||
<span>
|
<span>
|
||||||
@ -102,7 +97,6 @@ exports[`should render demo and match snapshot 1`] = `
|
|||||||
role="button"
|
role="button"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
disabled="false"
|
|
||||||
>
|
>
|
||||||
<div class="van-cell__title">
|
<div class="van-cell__title">
|
||||||
<span>
|
<span>
|
||||||
@ -122,7 +116,6 @@ exports[`should render demo and match snapshot 1`] = `
|
|||||||
role="button"
|
role="button"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
disabled="false"
|
|
||||||
>
|
>
|
||||||
<div class="van-cell__title">
|
<div class="van-cell__title">
|
||||||
<span>
|
<span>
|
||||||
@ -134,11 +127,9 @@ exports[`should render demo and match snapshot 1`] = `
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="van-collapse-item van-collapse-item--border">
|
<div class="van-collapse-item van-collapse-item--border">
|
||||||
<div class="van-cell van-cell--clickable van-collapse-item__title van-collapse-item__title--disabled"
|
<div class="van-cell van-collapse-item__title van-collapse-item__title--disabled"
|
||||||
role="button"
|
role="button"
|
||||||
tabindex="-1"
|
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
disabled="true"
|
|
||||||
>
|
>
|
||||||
<div class="van-cell__title">
|
<div class="van-cell__title">
|
||||||
<span>
|
<span>
|
||||||
@ -150,11 +141,9 @@ exports[`should render demo and match snapshot 1`] = `
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="van-collapse-item van-collapse-item--border">
|
<div class="van-collapse-item van-collapse-item--border">
|
||||||
<div class="van-cell van-cell--clickable van-collapse-item__title van-collapse-item__title--disabled"
|
<div class="van-cell van-collapse-item__title van-collapse-item__title--disabled"
|
||||||
role="button"
|
role="button"
|
||||||
tabindex="-1"
|
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
disabled="true"
|
|
||||||
>
|
>
|
||||||
<div class="van-cell__title">
|
<div class="van-cell__title">
|
||||||
<span>
|
<span>
|
||||||
@ -174,7 +163,6 @@ exports[`should render demo and match snapshot 1`] = `
|
|||||||
role="button"
|
role="button"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
disabled="false"
|
|
||||||
>
|
>
|
||||||
<div class="van-cell__title">
|
<div class="van-cell__title">
|
||||||
Title1
|
Title1
|
||||||
@ -190,7 +178,6 @@ exports[`should render demo and match snapshot 1`] = `
|
|||||||
role="button"
|
role="button"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
disabled="false"
|
|
||||||
>
|
>
|
||||||
<i class="van-badge__wrapper van-icon van-icon-shop-o van-cell__left-icon">
|
<i class="van-badge__wrapper van-icon van-icon-shop-o van-cell__left-icon">
|
||||||
</i>
|
</i>
|
||||||
|
@ -7,7 +7,6 @@ exports[`should render slots of CollapseItem correctly 1`] = `
|
|||||||
role="button"
|
role="button"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
disabled="false"
|
|
||||||
>
|
>
|
||||||
this is icon
|
this is icon
|
||||||
<div class="van-cell__title">
|
<div class="van-cell__title">
|
||||||
|
@ -207,3 +207,31 @@ test('should toggle collapse after calling the toggle method in accordion mode',
|
|||||||
wrapper.vm.itemA.toggle();
|
wrapper.vm.itemA.toggle();
|
||||||
expect(wrapper.vm.active).toEqual('a');
|
expect(wrapper.vm.active).toEqual('a');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('should be readonly when using readonly prop', async () => {
|
||||||
|
const wrapper = mount({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
active: [],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<Collapse v-model={this.active}>
|
||||||
|
<CollapseItem title="a" readonly>
|
||||||
|
content
|
||||||
|
</CollapseItem>
|
||||||
|
</Collapse>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const titles = wrapper.findAll('.van-collapse-item__title');
|
||||||
|
await titles[0].trigger('click');
|
||||||
|
expect(wrapper.vm.active).toEqual([]);
|
||||||
|
expect(wrapper.find('.van-collapse-item__title').classes()).not.toContain(
|
||||||
|
'van-cell--clickable'
|
||||||
|
);
|
||||||
|
|
||||||
|
wrapper.unmount();
|
||||||
|
});
|
||||||
|
@ -38,6 +38,8 @@ export function get(object: any, path: string): any {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Writeable<T> = { -readonly [P in keyof T]: T[P] };
|
||||||
|
|
||||||
export function pick<T, U extends keyof T>(
|
export function pick<T, U extends keyof T>(
|
||||||
obj: T,
|
obj: T,
|
||||||
keys: ReadonlyArray<U>,
|
keys: ReadonlyArray<U>,
|
||||||
@ -48,5 +50,5 @@ export function pick<T, U extends keyof T>(
|
|||||||
ret[key] = obj[key];
|
ret[key] = obj[key];
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}, {} as Pick<T, U>);
|
}, {} as Writeable<Pick<T, U>>);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user