自在猫先生 2023-05-04 09:35 采纳率: 62.9%
浏览 34
已结题

React组件之间的传递在父组件的保存数据

在子组件中编写了一个窗体进行输入数据的操作,在父组件中进行引用,然后进行数据保存的操作
这个组件是采用的树形组件,点击树形组件中的加号标签弹出这个子组件窗体输入数据,然后点击保存,把这些数据传递给父组件,在父组件中进行保存,把保存的数据以新建一个新的节点追加到这个加号标签下。

子组件
function FormComponets({ visible, onClose,onSave }){

    const [FormName, setFormName] = useState('');
    const [ObjectName, setObjectName] = useState('');
    const [form] = Form.useForm();//Form.useForm()生成了一个form实例,并将其绑定到了Form组件上
    const onFinish = (values,value,node) => {
        onSave(values, value, node); // 将表单数据、value和node传递给父组件进行保存
        // visible(false); // 关闭Modal
        form.setFieldsValue(values);
        form.resetFields(); //清空表单数据
      };

 return (
        <div>
          <Modal title="定义窗体信息" visible={visible}  onCancel={onClose} footer={null}>
            <Form form={form}
           onFinish={onFinish}
            >
              <Form.Item
                label="form name"
                name="FormName"
                rules={[{ required: true, message: 'Please enter the scheme name!' }]}
              >
                <Input type="text" style={{ width: '80%' }} placeholder="Please enter the form name" 
                 value={FormName} onChange={e => setFormName(e.target.value)} 
                />
              </Form.Item>
            </Form>
          </Modal>
        </div>
      );
}export default FormComponets

父组件
function TreeComponets(){

const [treeData, setTreeData] = useState([]);// 初始化树形数据

const FormSave = (data,value,node,setTreeData) => {
        onSave(data, value, node);  // 将setTreeData函数作为参数传递给onSave函数
        debugger
        const randomId = `SL-${Math.floor(Math.random() * 1000000)}`;
        const newNode = {
            title: data.FormName,
            value: randomId,
            key: randomId, // 添加key属性
            onClick: () => showModalBaisc(),
            children: [
            { title: `${data.ObjectName}`, value: `${randomId}-2`},
            { title: `${data.EnglishName}`, value: `${randomId}-3` }
            ]
        };
        // 找到目标节点并添加新的子节点
        let newData = [...treeData];

        const addDataToNode = (data, nodeId, newData) => {
            for (let i = 0; i < data.length; i++) {
            const item = data[i];
            if (item.value === nodeId) {
                item.children.push(newData);
                break;
            } else if (item.children && item.children.length > 0) {
                addDataToNode(item.children, nodeId, newData);
            }
            }
        };
        const newNodeData = {
            title: value,
            value: Math.random().toString(36).substr(2, 9),
            children: []
        };
        addDataToNode(newData, node, newNodeData);
        setTreeData([...treeData]);
        setIsModalOpenForm(false);
        // 将要传递给BasicDrawer子组件的数据赋值给basicData状态变量
        setBasicData({ ...data, nodeId: randomId });
      };

     return(

        <div>
            <TreeSelect  {...tProps} onSelect={onSelect}   treeData={treeData} />
            <FormComponets
                visible={isModalOpenForm}
                onClose={handleCloseModal}
                onSave={(data, value, node) => FormSave(data, value, node, setTreeData)}
                treeData={treeData}
                setTreeData={setTreeData}  // 确保将setTreeData函数作为属性传递给FormComponets
            />
           
        </div>
    );
}
export default TreeComponets;
以上是部分人的代码我在进行sava保存的时候出错了

img

img

  • 写回答

1条回答 默认 最新

  • 星辰引路-Lefan 2023-05-04 10:36
    关注

    在React中,数据流动是单向的,因此,当子组件需要将数据传递给父组件时,需要使用回调函数。你可以在父组件中定义一个函数来接收子组件传递过来的数据,并且把这个函数作为props传递给子组件。

    当子组件需要将数据传递给父组件时,可以通过这个函数来进行传递。具体操作如下:

    1. 在父组件中定义一个函数,用于接收子组件传递过来的数据:
    function handleSaveData(data) {
      // 在这里进行保存操作
    }
    
    1. 将这个函数作为props传递给子组件:
    <TreeComponent onSaveData={handleSaveData} />
    
    1. 在子组件中,当用户点击保存按钮时,调用这个函数并传递数据:
    function handleSave() {
      // 在这里获取从窗体输入的数据
      const data = ...
    
      // 调用父组件传递过来的函数,将数据传递给父组件
      props.onSaveData(data);
    }
    
    1. 现在,在父组件中就能够接收到子组件传递过来的数据了,然后就可以进行保存操作了。
    function handleSaveData(data) {
      // 在这里进行保存操作
      // 将新的节点追加到加号标签下
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月12日
  • 已采纳回答 5月4日
  • 修改了问题 5月4日
  • 创建了问题 5月4日

悬赏问题

  • ¥15 上传图片时提交的存储类型
  • ¥15 Ubuntu开机显示器只显示kernel,是没操作系统(相关搜索:显卡驱动)
  • ¥15 VB.NET如何绘制倾斜的椭圆
  • ¥15 在rhel8中安装qemu-kvm时遇到“cannot initialize crypto:unable to initialize gcrypt“报错”
  • ¥15 arbotix没有/cmd_vel话题
  • ¥15 paddle库安装时报错提示需要安装common、dual等库,安装了上面的库以后还是显示报错未安装,要怎么办呀?
  • ¥20 找能定制Python脚本的
  • ¥15 odoo17的分包重新供应路线如何设置?可从销售订单中实时直接触发采购订单或相关单据
  • ¥15 用C语言怎么判断字符串的输入是否符合设定?
  • ¥15 通信专业本科生论文选这两个哪个方向好研究呀