【问题标题】:React with Ant Design - How to share state between multiple <Select> on a <Form>?React with Ant Design - 如何在 <Form> 上的多个 <Select> 之间共享状态?
【发布时间】:2021-02-18 02:38:20
【问题描述】:

我是 ReactJS 和 AntDesign 的新手。

我正在尝试获取一组 &lt;Select&gt; 组件来共享状态,因此当您选择第一个组件时,它会填充表单上下一个组件的选项,它必须是 &lt;Select&gt;,我不能使用&lt;Cascade&gt;,因为它会使 UI 过于复杂(用户不太熟悉计算机)。

这是我想要实现的示例,useEffect 上的数据将来自后端的单个请求

https://stackblitz.com/edit/react-xarwcj-sghpze?file=index.js

选择第一个选项后,我预计第二个下拉列表将被子数组填充,但我得到一个空下拉列表。

我很确定该值正在设置,但由于我的一些错误配置,React 或 Ant 没有重新渲染它,但我不明白为什么。

【问题讨论】:

  • 我看到了两个问题。首先,此调用中的value formInstance.setFieldsValue({ subList: value.list }); 只是所选项目的ID,因此value.list 返回未定义。您需要找到相关对象const sub = list.find(o =&gt; o.id === value);。其次,setFieldsValue 没有调用重新渲染。
  • 感谢您的评论!如何让 setFieldsValue 调用重新渲染?
  • 我认为它实际上一直在调用一个,但是由于您已将 undefined 传递给 setFieldsValue 它并没有呈现第二个选择。不知道为什么您现在收到 map 错误。

标签: javascript reactjs jsx antd ant-design-pro


【解决方案1】:

如果您使用 antd Form,那么您必须将输入元素包装在 Form.Item 组件中。并且Form.Item 组件有一个name 属性。当您使用任何formInstance 方法时,您提供给Form.Itemname 就是您可以引用给定输入组件的方式。所以当你在做formInstance.setFieldsValue({ subList: value.list }); 的时候,你实际上并没有subList 表单项,所以我认为这就是antd 没有设置它的值的原因。

话虽如此,您的第二个选择应该如下所示:

<Form.Item name="subList">
  <Select ... >
    {formInstance.getFieldValue("subList")?.map ... }
  </Select>
</Form.Item>

也不要忘记将Select 以及Form 中的任何其他输入组件也包含在内。您给Form.Item 命名的名称是您能够读取FormonFinish 方法中的值的方式。

有关此类用法的工作示例,您可以从 antd 表单文档中查看此示例:https://codesandbox.io/s/n1zdn

我应该提到,对我来说,当您在第一个 SelectonChange 中执行 formInstance.setFieldsValue({ subList: value.list }); 时似乎是错误的(因为 value 是一个数字,所以 value.list 是未定义的),但我相信这是因为您提供的只是您实际代码的粗略、不完整的副本。但是,如果您对此问题有进一步的困难,请发表评论,我会尽我所能提供更多帮助!

编辑

为了回答您的评论,我设法确定的问题是,当从第一个选择中选择一个选项时,您将第二个选择的 value 设置为 array强>。你真正想做的是设置第二个选择的可用选项,而不是它的值。

所以我建议的更改是让您在状态变量中设置第二个选择的选项,如下所示:

const [list, setList] = useState([]);
const [secondList, setSecondList] = useState([]);

// ...

return (
    <>
      <Form form={formInstance}>
        <Form.Item>
          <Select
            style={{ width: 120 }}
            onSelect={value => {
              console.log(list.find(o => o.id === value).list);
              setSecondList(list.find(o => o.id === value).list);
            }}
          >
            {list.map(value => {
              return (
                <Option key={value.id} value={value.id}>
                  {value.name}
                </Option>
              );
            })}
          </Select>
        </Form.Item>

        <br />
        <br />

        <Form.Item name="subList">
          <Select
            style={{ width: 120 }}
            onChange={value => {
              console.log(value);
            }}
          >
            {secondList?.map(value => {
              return (
                <Option key={value.id} value={value.id}>
                  {value.desc}
                </Option>
              );
            })}
          </Select>
        </Form.Item>
      </Form>
    </>
  );

【讨论】:

  • 您好,感谢您的评论!我也忘了在这个示例中添加 。这是包含您所有观点的更新版本。我仍然无法让它工作。你介意再看看吗? stackblitz.com/edit/react-xarwcj-sghpze?file=index.js
  • 我明白了,这确实解决了它。奇怪的是,我使用 State 表单只是为数组设置了一个随机字段并对其进行迭代以生成选项。
猜你喜欢
  • 1970-01-01
  • 2020-06-23
  • 2019-01-31
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2019-01-16
  • 1970-01-01
相关资源
最近更新 更多