refactor: reorganize all components (#8303)

This commit is contained in:
neverland
2021-03-08 11:50:37 +08:00
committed by GitHub
parent 3144a63d2b
commit e540876398
193 changed files with 1307 additions and 400 deletions
+122
View File
@@ -0,0 +1,122 @@
import { PropType, defineComponent } from 'vue';
// Utils
import { createNamespace } from '../utils';
// Components
import Button from '../button';
import RadioGroup from '../radio-group';
import AddressListItem, { AddressListAddress } from './AddressListItem';
const [name, bem, t] = createNamespace('address-list');
export default defineComponent({
name,
props: {
modelValue: [Number, String],
disabledText: String,
addButtonText: String,
defaultTagText: String,
list: {
type: Array as PropType<AddressListAddress[]>,
default: () => [],
},
disabledList: {
type: Array as PropType<AddressListAddress[]>,
default: () => [],
},
switchable: {
type: Boolean,
default: true,
},
},
emits: [
'add',
'edit',
'select',
'click-item',
'edit-disabled',
'select-disabled',
'update:modelValue',
],
setup(props, { slots, emit }) {
const renderItem = (
item: AddressListAddress,
index: number,
disabled?: boolean
) => {
const onEdit = () => {
const name = disabled ? 'edit-disabled' : 'edit';
emit(name, item, index);
};
const onClick = () => emit('click-item', item, index);
const onSelect = () => {
const name = disabled ? 'select-disabled' : 'select';
emit(name, item, index);
if (!disabled) {
emit('update:modelValue', item.id);
}
};
return (
<AddressListItem
v-slots={{
bottom: slots['item-bottom'],
}}
key={item.id}
address={item}
disabled={disabled}
switchable={props.switchable}
defaultTagText={props.defaultTagText}
onEdit={onEdit}
onClick={onClick}
onSelect={onSelect}
/>
);
};
const renderList = (list: AddressListAddress[], disabled?: boolean) => {
if (list) {
return list.map((item, index) => renderItem(item, index, disabled));
}
};
const renderBottom = () => (
<div class={bem('bottom')}>
<Button
round
block
type="danger"
text={props.addButtonText || t('add')}
class={bem('add')}
onClick={() => emit('add')}
/>
</div>
);
return () => {
const List = renderList(props.list);
const DisabledList = renderList(props.disabledList, true);
const DisabledText = props.disabledText && (
<div class={bem('disabled-text')}>{props.disabledText}</div>
);
return (
<div class={bem()}>
{slots.top?.()}
<RadioGroup modelValue={props.modelValue}>{List}</RadioGroup>
{DisabledText}
{DisabledList}
{slots.default?.()}
{renderBottom()}
</div>
);
};
},
});