我有一个非常常见的 React Card 组件,我可以这样使用:
...
<Card>
<Card.Title>
...
</Card.Title>
...
<Card.Footer>
...
</Card.Footer>
</Card>
...
用“正常”组件填充它时效果很好。
但现在我想根据
tab
状态变量 (0, 1 or 2)
显示其中的组件,所以我这样使用它:
...
<Card>
...
{
tab === 0 ? <ComponentA /> :
tab === 1 ? <ComponentB /> :
tab === 2 ? <ComponentC /> :
null
}
<Card.Footer>
...
</Card.Footer>
</Card>
问题在于
Components A
、B
和 C
由具有各自 Save Changes
按钮和相关逻辑的表单组成。他们彼此独立,甚至与父母独立Card
。 Save
按钮位于 Card.Footer
子组件内部。 也就是说,将保存按钮和行为“暴露”给父 Card
组件...问题的出现是因为我认为这种模式对我来说似乎很常见(每个 UI 库都有一个
Card
组件,其中包含 Header
、Footer
等等...
那么...我是否必须改变设计并重新思考结构?
解决这个问题的
React
方法是什么?
提前致谢。
无需更改组件的整体设计和结构即可实现您的需求。您可以使用
Card
管理父 useState
组件中的表单值,并将必要的状态和处理程序作为 props 传递给表单组件。具体方法如下:
useState
:管理父组件中的表单值。中调用
handleSubmit
:从页脚按钮调用适当的提交处理程序。每个表单组件都会接收 state 和 setState 函数作为 props,并使用它们来管理表单数据。
const ComponentA = ({ formData, setFormData }) => {
const handleChange = (e) => {
const { name, value } = e.target;
setFormData(prevState => ({ ...prevState, [name]: value }));
};
return (
<div>
<form>
<input
type="text"
name="fieldA"
value={formData.fieldA || ''}
onChange={handleChange}
/>
</form>
</div>
);
};
// ... ComponentB, ComponentC ...
export { ComponentA, ComponentB, ComponentC };
在父组件中管理表单状态,并将state和setState函数传递给表单组件。
const App = () => {
const [tab, setTab] = useState(0);
const [formData, setFormData] = useState({});
const TabHandlers = [
{
component: <ComponentA formData={formData} setFormData={setFormData} />,
handleSubmit: () => {
console.log('Saving Component A', formData);
// Add your save logic for Component A here
},
},
// ... ComponentB, ComponentC ...
];
return (
<Card>
<Card.Title>My Card Title</Card.Title>
{TabHandlers[tab].component}
<Card.Footer onSubmit={TabHandlers[tab].handleSubmit} />
</Card>
);
};
export default App;
formData
和 setFormData
作为 props。它使用 handleChange
函数更新表单数据。App
)管理当前选项卡状态和表单数据。它通过 TabHandlers
数组将相关表单数据和处理程序传递给活动表单组件。这种方法可以使您的表单组件及其逻辑保持井井有条,并允许
Card
组件有效地处理表单提交。