You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击按钮时如何在React组件内渲染新增的React组件?

问题原因

  • 违反React Hook使用规则:useEffect 只能在组件顶层作用域调用,不能嵌套在普通函数showField中,运行时会触发Hook规则校验错误。
  • 状态设计不符合需求:使用布尔类型状态只能控制单个字段的显隐,无法支持每次点击新增多个字段的场景。
  • 生成的组件未挂载到JSX树:generateNewField 函数返回的组件实例没有被放到组件return的JSX结构中,自然不会在页面渲染。

修复方案

将控制字段的状态修改为数组,每次点击+按钮时往数组中新增一个唯一标识,遍历该数组批量渲染NeededProductsField组件即可。

修复后完整代码

AddRecipeForm.js

import Form from 'react-bootstrap/Form';
import Button from 'react-bootstrap/Button';
import { useState } from 'react';
import NeededProductsField from './NeededProductsField';

function AddRecipeForm() {
    // 用数组存储所有新增字段的唯一标识,用于列表渲染的key
    const [productFields, setProductFields] = useState([1]);

    // 点击+按钮新增字段
    const addNewField = () => {
        // 用时间戳作为唯一id,避免key重复
        setProductFields(prev => [...prev, Date.now()]);
    };

    return (
        <Form>
            <Form.Group className="mb-3" controlId="addRecipe">
                <Form.Label>Име на рецептата</Form.Label>
                <Form.Control type="title" placeholder="Добави име" />
            </Form.Group>

            <Form.Group className="mb-3" controlId="neededProducts">
                <Form.Label>Необходими продукти</Form.Label>{' '}
                <Button variant="primary" size="sm" onClick={addNewField}>+</Button>{' '}
                {/* 遍历数组渲染所有食材字段 */}
                {productFields.map(fieldId => (
                    <p key={fieldId}>
                        <NeededProductsField />
                    </p>
                ))}
            </Form.Group>
            
            <Button variant="primary" type="submit">
                Запиши
            </Button>
        </Form>
    );
}

export default AddRecipeForm;

NeededProductsField.js 无需修改

import Form from 'react-bootstrap/Form';
import Row from 'react-bootstrap/Row';
import Col from 'react-bootstrap/Col';

function NeededProductsField(props) {
    return (
        <Row>
            <Col xs={7}>
            <Form.Control placeholder="Име" />
            </Col>
            <Col>
            <Form.Control placeholder="Количество" />
            </Col>
            <Col>
            <Form.Control placeholder="М. ед." />
            </Col>
        </Row>
    );
}

export default NeededProductsField;

内容的提问来源于stack exchange,提问作者vladi_markova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 09:54:02