reactjs 根据其他选择字段选择和设计更新选择选项列表

bfhwhh0e  于 2022-12-03  发布在  React
关注(0)|答案(3)|浏览(148)
<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>

我试图在Products Select中实现Options元素根据Company Select onChange选择的变化。
我已经在Select中指定了onChange并调用this.handleSelectCompanyOnchange。在其中我获得了选定的公司ID。
在这个.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设计表单和选择来实现这一点。此外,我还引用了https://github.com/ant-design/ant-design/issues/4862how to get field value on change for FormItem in antd

v1l68za4

v1l68za41#

这里是你需要实现它。
1.使用FormonValuesChange属性。当涉及到Form字段更改时,这是执行setState的最佳位置,而不是在SelectInputonChange上。

<Form onValuesChange={handleFormValuesChange}>
     ...
 </Form>

1.一个表单示例(钩子)。这在您的情况下是可选的,但是这在设置和获取表单值时很有用。在这里查看更多关于它的信息。

const [form] = Form.useForm();

 <Form form={form} onValuesChange={handleFormValuesChange}>
     ...
 </Form>

这是产品选项render的外观,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中的完整工作代码:

tkclm6bt

tkclm6bt2#

这里的想法是你只需要观察状态中的值的变化。2例如,你的select应该“观察”状态的值,然后你可以通过它自己的React的setState方法轻松地更新状态。3在onChange事件中,你可以简单地对我们的状态做一些事情。

<Select 
  value={state.productId}
  onChange={e => {// Do something}}
>
 {...} 
<Select/>

下面是我的示例代码,我是如何在每次重新选择周选择时更新日期的。希望这能对你有所帮助。

import { Divider, Select } from 'antd';
import React, { useState } from 'react';

export function Example(): JSX.Element {
    const [state, setState] = useState<{week: number, day: number}>({
        day: 1,
        week: 1
    });
    const weeks = [1,2,3,4];
    const days = [1,2,3,4,5];
    return <>
        <Select
            value={state.week}
            onChange={(value) => setState({ week: value, day: 1})}
        >
            {
                weeks.map(week => {
                    return <Select.Option
                        key={week}
                        value={week}
                    >
                        {week}
                    </Select.Option>;
                })
            }
        </Select>

        <Divider/>

        <Select
            value={state.day}
            onChange={(value) => setState({...state, day: value})}
        >
            {
                days.map(day => {
                    return <Select.Option
                        key={day}
                        value={day}
                    >
                        {day}
                    </Select.Option>;
                })
            }
        </Select>
    </>;
}
uurity8g

uurity8g3#

让我们说你想更新你的选项列表的基础上,你从后端获得的数据;注意:categories是一个数组对象。2从这个数组中你可以取出每个选项的标签和值,如下所示:

const newOptions = categories.map((item, index) => {
return {
  label: item.name,
  value: item._id,
};
});

//然后在表单内使用newOptions,如下所示:

<Form.Item label="anyName" name="anyName">
   <Select
     style={{
       width: 220,
           }}
  onChange={handleChange}
  options={
       newOptions
          }
    />
   </Form.Item>

相关问题