/** * 字段渲染器 * 根据字段类型渲染对应的表单组件 */ import React from 'react'; import { Form, Input, InputNumber, Select, Radio, Checkbox, DatePicker, TimePicker, Switch, Slider, Rate, Upload, Cascader, Divider, Button, Typography, } from 'antd'; import { UploadOutlined } from '@ant-design/icons'; import type { FieldConfig } from '../types'; import GridField from './GridField'; import { useFieldOptions } from '../hooks/useFieldOptions'; import { useCascaderOptions, useCascaderLoadData } from '../hooks/useCascaderOptions'; import '../styles.css'; const { Text } = Typography; const { TextArea } = Input; interface FieldRendererProps { field: FieldConfig; value?: any; onChange?: (value: any) => void; isPreview?: boolean; // 是否为预览模式 selectedFieldId?: string; // 当前选中的字段ID onSelectField?: (fieldId: string) => void; onDeleteField?: (fieldId: string) => void; labelAlign?: 'left' | 'right' | 'top'; // 标签对齐方式 } const FieldRenderer: React.FC = ({ field, value, onChange, isPreview = false, selectedFieldId, onSelectField, onDeleteField, labelAlign = 'right', }) => { // 获取字段选项(支持静态和动态数据源) const options = useFieldOptions(field); // 获取级联选择器选项和懒加载函数 const cascadeOptions = useCascaderOptions(field); const loadData = useCascaderLoadData(field); // 布局组件特殊处理 if (field.type === 'divider') { return {field.label}; } if (field.type === 'text') { return (
{field.content || '这是一段文字'}
); } if (field.type === 'grid') { return ( ); } const renderField = () => { switch (field.type) { case 'input': return ( onChange?.(e.target.value)} /> ); case 'textarea': return (