form-radio.vue 1.2 KB

123456789101112131415161718192021222324252627282930313233
  1. <template>
  2. <el-radio-group v-model="modelValue" v-bind="renderOpts.props" @change="compChange">
  3. <el-radio v-for="(item, index) in renderOpts.options" :key="index" :label="formatOptions('label', { item, index })" :value="formatOptions('value', { item, index })"></el-radio>
  4. </el-radio-group>
  5. </template>
  6. <script setup>
  7. import XEUtils from "xe-utils";
  8. import config from "@/config/select";
  9. const props = defineProps({
  10. renderOpts: { type: Object, default: () => ({}) },
  11. params: { type: Object, default: () => ({}) }
  12. })
  13. const modelValue = ref(null);
  14. watch(() => props.params, val => modelValue.value = XEUtils.get(val.data, val.field), { deep: true, immediate: true });
  15. const optionProps = reactive(props.renderOpts.optionProps || config.props);
  16. const formatOptions = (key, { item, index }) => {
  17. if (XEUtils.isFunction(optionProps[key])) return optionProps[key]({ data: item, index });
  18. return XEUtils.get(item, optionProps[key]);
  19. }
  20. const compChange = () => props.renderOpts.events.change({ [props.params.field]: modelValue.value });
  21. </script>
  22. <style scoped>
  23. @media (max-width: 1120px) {
  24. .el-radio-group {flex-wrap: nowrap;}
  25. .el-radio {margin-right: 10px;}
  26. }
  27. </style>