5 changed files with 153 additions and 140 deletions
@ -1,88 +1,88 @@ |
|||||
<template> |
<template> |
||||
<el-form-item |
<el-form-item |
||||
:class="[{'column':column},'form-item']" |
:class="[{'column':column},'form-item']" |
||||
:label="label" :prop="prop" :rules="rules"> |
:label="label" :prop="prop" :rules="rules" :required="required"> |
||||
<el-radio-group |
<el-radio-group |
||||
v-model="selectedValue" |
v-model="selectedValue" |
||||
v-bind="$attrs" |
v-bind="$attrs" |
||||
@change="handleChange" |
@change="handleChange" |
||||
|
> |
||||
|
<el-radio |
||||
|
v-for="option in options" |
||||
|
:key="option.value" |
||||
|
:label="option.value" |
||||
|
:disabled="option.disabled" |
||||
> |
> |
||||
<el-radio |
<!-- 默认展示和选中显示 不同文案 --> |
||||
v-for="option in options" |
{{( selectedValue === option.value ) ? (option.selectedLabel ? option.selectedLabel : option.label) :option.label }} |
||||
:key="option.value" |
</el-radio> |
||||
:label="option.value" |
</el-radio-group> |
||||
:disabled="option.disabled" |
</el-form-item> |
||||
> |
</template> |
||||
<!-- 默认展示和选中显示 不同文案 --> |
|
||||
{{ selectedValue === option.value ? option.selectedLabel : option.label }} |
<script> |
||||
<!-- 自定义 选中图标 --> |
export default { |
||||
<!-- <template #label> |
name: 'MyRadioGroup', |
||||
<span><img src="../assets/radio_checked.svg" alt="custom icon" style="width: 16px; height: 16px;"> {{ text }}</span> |
props: { |
||||
</template> --> |
// 是否是纵向排列 |
||||
</el-radio> |
column:{ |
||||
</el-radio-group> |
type:String, |
||||
</el-form-item> |
default:'' |
||||
</template> |
|
||||
|
|
||||
<script> |
|
||||
export default { |
|
||||
name: 'MyRadioGroup', |
|
||||
props: { |
|
||||
// 是否是纵向排列 |
|
||||
column:{ |
|
||||
type:Boolean, |
|
||||
default:false |
|
||||
}, |
|
||||
// 选项列表,格式为 [{ label: '显示文本', value: '值', disabled: false }] |
|
||||
options: { |
|
||||
type: Array, |
|
||||
required: true, |
|
||||
}, |
|
||||
// 当前选中的值,使用 v-model 绑定 |
|
||||
value: { |
|
||||
type: [String, Number, Boolean], |
|
||||
default: '', |
|
||||
}, |
|
||||
// 表单项的 label |
|
||||
label: { |
|
||||
type: String, |
|
||||
default: '', |
|
||||
}, |
|
||||
// 表单项的 prop(用于表单校验) |
|
||||
prop: { |
|
||||
type: String, |
|
||||
default: '', |
|
||||
}, |
|
||||
// 校验规则 |
|
||||
rules: { |
|
||||
type: Array, |
|
||||
default: () => [], |
|
||||
}, |
|
||||
}, |
}, |
||||
data() { |
required:{ |
||||
return { |
type:Boolean, |
||||
selectedValue: this.value, // 内部维护的选中值 |
default:false |
||||
}; |
|
||||
}, |
}, |
||||
watch: { |
// 选项列表,格式为 [{ label: '显示文本', value: '值', disabled: false }] |
||||
// 监听外部传入的 value 变化,更新内部 selectedValue |
options: { |
||||
value(newVal) { |
type: Array, |
||||
this.selectedValue = newVal; |
required: true, |
||||
}, |
|
||||
}, |
}, |
||||
methods: { |
// 当前选中的值,使用 v-model 绑定 |
||||
// 选中值变化时触发 |
value: { |
||||
handleChange(value) { |
type: [String, Number, Boolean], |
||||
this.$emit('input', value); // 更新 v-model |
default: '', |
||||
this.$emit('change', value); // 触发 change 事件 |
|
||||
}, |
|
||||
}, |
}, |
||||
}; |
// 表单项的 label |
||||
</script> |
label: { |
||||
|
type: String, |
||||
<style scoped> |
default: '', |
||||
/* 自定义样式 */ |
}, |
||||
.el-radio-group { |
// 表单项的 prop(用于表单校验) |
||||
margin: 10px 0; |
prop: { |
||||
} |
type: String, |
||||
</style> |
default: '', |
||||
|
}, |
||||
|
// 校验规则 |
||||
|
rules: { |
||||
|
type: Array, |
||||
|
default: () => [], |
||||
|
}, |
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
selectedValue: this.value, // 内部维护的选中值 |
||||
|
}; |
||||
|
}, |
||||
|
watch: { |
||||
|
// 监听外部传入的 value 变化,更新内部 selectedValue |
||||
|
value(newVal) { |
||||
|
this.selectedValue = newVal; |
||||
|
}, |
||||
|
}, |
||||
|
methods: { |
||||
|
// 选中值变化时触发 |
||||
|
handleChange(value) { |
||||
|
this.$emit('input', value); // 更新 v-model |
||||
|
this.$emit('change', value); // 触发 change 事件 |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
/* 自定义样式 */ |
||||
|
.el-radio-group { |
||||
|
margin: 10px 0; |
||||
|
} |
||||
|
</style> |
Loading…
Reference in new issue