我有一个模态,可以用来编辑具有很多离散部分的页面的各个部分。这比将它们传递给表单要方便得多-表单将是巨大的。
页面上的各个部分有所不同。一些是简单的文本,简单的文本区域或输入就足够了。不过,某些数据只能通过选择(或可能是多次选择)进行编辑。
对于文本区域,我正在使用以下内容:
/* inplace-edit dialog */
const [dialog, setDialog] = useState({
open: false, // whether dialog should show
fieldName: null, // reference to field for db update on submit
title: '', // dialog title
content: '', // data to show in dialog content
})
const setDialogState = update => () => {
setDialog({ ...dialog, ...update })
}
由于功能组件本质上是一个功能,是否可以将该组件添加到状态中,然后在需要显示对话框时使用该组件呈现特定的表单结构?
>答案 0 :(得分:0)
我已经进行了更多研究,使用钩子将无状态组件添加到状态似乎是可行的。
我已将状态处理代码修改为:
const [dialog, setDialog] = useState({
open: false,
title: '',
formComponent: () => null,
})
const setDialogState = update => () => {
setDialog({ ...dialog, ...update })
}
在上面的formComponent
中,它只是一个返回null的默认函数。
在我要编辑的页面部分中,有一个布尔showEditIcons
,如果查看者具有适当的权限,它会显示编辑图标。单击图标时,它会设置状态。最重要的是,它将formComponent
设置为对无状态函数的引用:
{showEditIcons && (
<IconButton
onClick={setDialogState({
open: true,
title: 'Project Summary',
formComponent: TextForm,
})}
>
<EditIcon />
</IconButton>
)}
其中TextForm只是一个函数:
const TextForm = ({ handleSubmit }) => (
<form onSubmit={handleSubmit}>
<Field name="content">{({ field }) => <TextArea field={field} />}</Field>
</form>
)
我没有看到将函数分配为对象属性的任何问题。一直发生。
当然,真正有趣的部分是我如何使用TextForm。我将dialog
值作为道具传递给Dialog
组件:
<Dialog {...dialog} />
在对话框中我需要表单的部分中,我使用TextForm
用createElement
渲染表单
<DialogHeader>{title}</DialogHeader>
<DialogContent>
{React.createElement(formComponent)}
</DialogContent>
<DialogFooter ... />