index.jsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import { computed } from 'vue'
  2. import { formInputProps, fromInputEmits } from '@cip/components/cip-form-input/form-input-props'
  3. import { useFormInput, useInputProps, useOptions } from '@cip/components/hooks/form-input'
  4. import { ElSelect, ElOption } from 'element-plus'
  5. import { getFieldValue, getValueByTemplate } from '@cip/utils/util'
  6. export default {
  7. props: formInputProps,
  8. emits: fromInputEmits,
  9. setup (props, context) {
  10. const { proxyValue, securityConfig, width, updateStream } = useFormInput(props, context, {
  11. fromModelValue: (val) => {
  12. if (multiple.value) {
  13. return (val || []).map(v => getFieldValue(v, optionProps.value.value))
  14. } else {
  15. return getFieldValue((val ?? {}), optionProps.value.value)
  16. }
  17. },
  18. toModelValue: (val) => {
  19. if (multiple.value) {
  20. return (val || []).map(v => options.value.find(option => v === option[optionProps.value.value]))
  21. } else {
  22. return options.value.find(option => val === option[optionProps.value.value])
  23. }
  24. }
  25. })
  26. const multiple = computed(() => securityConfig.value.multiple)
  27. const { options, optionProps } = useOptions(props, multiple, updateStream, context)
  28. const inputProps = useInputProps(props, [
  29. ['clearable', { defaultValue: true }],
  30. 'collapseTags',
  31. 'multipleLimit',
  32. ['placeholder', { defaultValue: '' }],
  33. 'filterable'
  34. ])
  35. return () => <ElSelect
  36. {...inputProps.value}
  37. style={{ width: width.value }}
  38. v-model={proxyValue.value}
  39. multiple={multiple.value}
  40. >
  41. {
  42. options.value.map(option => {
  43. const value = getFieldValue(option, optionProps.value.value) // 【注:】value不支持模版语法
  44. const label = optionProps.value.label.includes('$') ? getValueByTemplate(optionProps.value.label, option) : getFieldValue(option, optionProps.value.label) // 支持模版语法
  45. return <ElOption
  46. key={value}
  47. value={value}
  48. label={label}
  49. />
  50. })
  51. }
  52. </ElSelect>
  53. }
  54. }