как динамически генерировать параметры для выбранного компонента с помощью ant design

#reactjs #antd

#reactjs #antd

Вопрос:

я использую ant design с react для создания редактируемой таблицы с опцией выбора внутри нее. я буду извлекать параметры выбора с помощью хука (figbird), для извлечения которого потребуется некоторое время, но выбор будет отображаться без опции внутри него. я пытался, но данные (массив параметров) внутри такого состояния

 const lines = useFind("lines");
let [lineNumber, setLineNumber] = useState();
const options = {
    lines: [],
  };

  if (lines.error) return "Failed to load resource Machine Status";
  if (lines.status === "loading") {
    options.lines[0] = {};
    setLineNumber[0] = { value: "loading" };
  } else {
    let arr = lines.data.map((line, i) => {
      console.log(i, line);
      options.lines[i] = {};
      return { value: line.line_number };
    });
    setLineNumber = arr;
  }
  

а затем отобразить мою таблицу и выбрать компонент внутри нее

      <Formik
          initialValues={{ machine_name: "", password: "", remember: false }}
          validationSchema={LoginSchema}
          onSubmit={onSubmit}
        >
          {({ values, handleSubmit }) => (
            <Form {...layout} onSubmit={handleSubmit}>
              <Form.Item name="machine_name" label="Name">
                <Input
                  name="machine_name"
                  placeholder="Machine Name"
                  prefix={<TagOutlined />}
                  value={values.machine_name}
                />
              </Form.Item>
              <Form.Item name="machine_line" label="Line">
                <Select
                  prefix={<ClusterOutlined />}
                  name="machine_line"
                  style={{ width: "100%" }}
                  value={values.machine_line}
                >
                    {lineNumber.map((line) => {
                    return (
                      <Option value={line.line_number}>
                        {line.line_number}
                      </Option>
                    );
                  })}

                </Select>
              </Form.Item>
              <Form.Item name="url" label="URL">
                <Input
                  name="url"
                  placeholder="URL"
                  prefix={<LinkOutlined />}
                  value={values.url}
                />
              </Form.Item>
              <Row>
                <Col offset={6} span={4}>
                  <SubmitButton>Submit</SubmitButton>
                </Col>
                <Col offset={5} span={4}>
                  <ResetButton>Reset</ResetButton>
                </Col>
              </Row>
              ,
            </Form>
          )}
        </Formik>

  

но select по-прежнему ничего не отображает внутри него… я проверил данные, возвращаемые из выборки, и они поступают без ошибок, но состояние, похоже, не установлено

Комментарии:

1. Попробуйте и запишите в консоль lineNumber

2. Это дает мне неопределенный… Если я изменил useState() на useState([]), это дает мне []

Ответ №1:

теперь он работает, добавляя следующий код после использования useFind (перехват, который извлекает данные)

 if (lines.error) return "Failed to load resource Machine Status";
  if (lines.status === "success") {
    for (let i = 0; i < lines.data.length; i  ) {
      options.lines[i] = {
        value: lines.data[i].line_number,
        name: lines.data[i].line_number,
      };
    }
  }
  

после этого установите параметры выбора

 <Select
  loading={lines.data.status}
  prefix={<ClusterOutlined />}
  options={options["lines"]}
  name="machine_line"
  style={{ width: "100%" }}
  value={values.machine_line}
/>
  

Ответ №2:

Опираясь на ответ OP jihad.khorfan.

Согласно документации antd для компонента Select, тип данных должен быть { label, value }[] . Таким образом, использование value / label является лучшим выбором, чем name / label, особенно когда вам нужно использовать поля, которые не являются дружественными к пользовательскому интерфейсу (например, идентификаторы) для серверной визуализации. Небольшое исправление показано ниже.

 if (lines.error) return "Failed to load resource Machine Status";
  if (lines.status === "success") {
    for (let i = 0; i < lines.data.length; i  ) {
      options.lines[i] = {
        value: lines.data[i].line_number,
        label: lines.data[i].line_number,
      };
    }
  }
  

Надеюсь, это поможет будущим разработчикам. Публикую новый ответ из-за отсутствия оценки репутации!