javascript - 基于其他Select字段选择ant design更新Select Option列表

标签 javascript reactjs antd

<Form
    layout="vertical"
    size="medium"
    className="test-form"
    requiredMark={false}
    onFinish={onFinish}
 >
             <Form.Item
                  name="companyId"
                  label="Company/Customer"
                  rules={[{ required: true, message: "Please select Company!"}]}  
              >
                  <Select
                    onChange={this.handleSelectCompanyOnchange}
                    style={{ width: "50%" }}
                    name="companyId"
                  >
                    {users.map((user, index) => {
                      return (
                        <Option key={index} value={user.companyID}>
                          {user.companyName}
                        </Option>
                      );
                    })}
                  </Select>
                </Form.Item>
            
       <Form.Item
             label="Products"
             name="products"
             rules={[{ required: true, message: "Please select Products!"}]}
        >

            <Select mode="multiple" allowClear style={{ width: "70%" }}>
                    {products.map((product, index) => {
                      if (this.state.companyId == product.companyId) {
                        return (
                          <Option key={index} value={product.id}>
                            {product.productName}
                          </Option>
                        );
                      }
                    })}
             </Select>
           </Form.Item>
      </Form>

我正在尝试根据 Company Select onChange 选择实现 Products Select 元素中的 Options 更改。

我在Select中指定了onChange并调用this.handleSelectCompanyOnchange。我在其中选择了 companyId。

在 this.state.companyId 中,我手动设置了 companyId,我将删除它。

我真的是 ant design 的新手,不知道如何在选择公司后更新产品列表。

这里,用户和产品是json如下。

users: 

[{
companyID: 2
companyName: "TEST1"
},{
companyID: 7
companyName: "TEST2"
}]

products:

[{
companyId: 2
id: 1
productName: "TESTProduct1"
},{
companyId: 7
productName: "TESTProduct2"
id: 2
},{
companyId: 7
id: 3
productName: "TESTProduct3"
},{
companyId: 7
id: 4
productName: "TESTProduct4"
}]

但是,我尝试了 getValueFromEvent 但无法实现。我为此使用 Ant design Form 和 Select。我也提到了 https://github.com/ant-design/ant-design/issues/4862how to get field value on change for FormItem in antd

最佳答案

这是实现它所需的条件。

  1. 使用 FormonValuesChange 属性。这是在antd Form 字段变化时执行setState 的最佳位置,而不是在SelectInput onChange.

     <Form onValuesChange={handleFormValuesChange}>
         ...
     </Form>
    
  2. 一个表单实例(钩子(Hook))。这在您的情况下是可选的,但这对于设置和获取表单值很有用。查看更多here关于它。

     const [form] = Form.useForm();
    
     <Form form={form} onValuesChange={handleFormValuesChange}>
         ...
     </Form>
    

这是产品选项呈现的样子,mapfilter 的组合,其中 selectedCompanyId 来自 state。请注意,如果列表的固定长度未知,请不要将索引用作 key,否则 react 会对此感到困惑,并且您会得到一些逻辑错误。使用一些唯一的 ID。

<Form.Item label="Products" name="product">
  <Select>
    {products
      .filter((product) => product.companyId === selectedCompanyId)
      .map((product) => (
        <Option key={product.id} value={product.id}>
          {product.productName}
        </Option>
      ))}
  </Select>
</Form.Item>

这里是handleFormValuesChange

const handleFormValuesChange = (changedValues) => {
  const formFieldName = Object.keys(changedValues)[0];
  if (formFieldName === "company") {
    setSelectedCompanyId(changedValues[formFieldName]);  // perform setState here
    form.setFieldsValue({product: undefined}) //reset product selection
  }
};

这是 React Hooks 中完整的工作代码:

Edit

关于javascript - 基于其他Select字段选择ant design更新Select Option列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64377293/

相关文章:

javascript - 无法从 React Form 中的选择组件取回提交的数据

reactjs - 如何在 ant design 的模态页脚上添加另一个按钮?

javascript - 从种子点生成特定半径内的随机地理坐标

Javascript:如何区分对象文字

javascript - 如何在url中传递数组?

reactjs - 为什么我的 React 应用程序垂直显示引导导航栏?

javascript - React Formik 不适用于数字输入

javascript - 如何使用 Svelte 在双击时创建 <div> contentEditable?

javascript - 多次订阅 Observable 与订阅一次并共享结果

javascript - useEffect中数据初始化触发多个请求