如何使用Formik fieldArray设置React选择的默认值?

发布于 2025-02-01 21:51:32 字数 5224 浏览 2 评论 0原文

我正在使用formik和fieldarray来创建动态形式,并且正在使用反应选择。我正在研究项目的编辑。在编辑中,如果存在以前的值,则必须显示这些值,并且可以更改这些值,但是我无法创建这些值。这是我的代码。

这是formik的初始值的代码,

  const initialOrderItemData = orderItems && orderItems.map((orderItem) => {
  return {
    itemId: orderItem.itemId,
    quantity: orderItem.quantity,
  }
});
  
  const initialOrderInfo = {
    orderedItemDataArray: initialOrderItemData,
  };

这是我使用此代码的表单,

              <Formik
                initialValues={initialOrderInfo}
                onSubmit={handleSubmit}
                validationSchema={HotelOrderSchema}
              >
                {({ errors, setFieldValue, touched, values, name, }) => (
                  <Form>
                          <Row>
                            <Table size="sm" hover>
                              <thead>
                                <tr>
                                  <th>Item</th>
                                  <th>Quantity</th>
                                  <th>Operation</th>
                                </tr>
                              </thead>
                              <tbody>
                              <FieldArray
                              name="orderedItemDataArray"
                              render={({ remove, push }) => (
                            <>
                              {values.orderedItemDataArray.length > 0 &&
                                values.orderedItemDataArray.map(
                                  (order, index) => (
                                    <tr key={index}>
                                      <td>
                                        <Select
                                          as="select"
                                          name={`orderedItemDataArray.${index}.itemId`}
                                          options={menuOptions}
                                          placeholder="Type"
                                          // value={selectedItems(order.itemId)}
                                          value={menuOptions.find(op => {
                                            return op.value === order.itemId
                                         })}
                                        />
                                      
                                      </td>
                                      <td>
                                        <Field
                                          type="number"
                                          className="form-control"
                                          name={`orderedItemDataArray.${index}.quantity`}
                                          min="0"
                                          placeholder="Quantity"
                                        />
                                      </td>
                                      <td>
                                        <ButtonGroup>
                                          {values.orderedItemDataArray
                                            .length !== 1 && (
                                            <Button
                                              color="primary"
                                              size="sm"
                                              onClick={() => remove(index)}
                                            >
                                              -
                                            </Button>
                                          )}
                                          {values.orderedItemDataArray
                                            .length -
                                            1 ===
                                            index && (
                                            <Button
                                              color="secondary"
                                              size="sm"
                                              onClick={() =>
                                                push({
                                                  itemId: '',
                                                  quantity: '',
                                                })
                                              }
                                            >
                                              +
                                            </Button>
                                          )}
                                        </ButtonGroup>
                                      </td>
                                    </tr>
                                  )
                                )}
                            </>
                          )}
                        />
                        </tbody>
                      </Table>
                    </Row>
                  </Form>
              </Formik>

我能够获得该值,但我无法更改值并设置新值。

I am using formik and fieldarray for creating dynamic form and I am using react-select. I am working on edit of items. On Edit if there exists previous values then those values must be shown and those values can be changed, but somehow I am unable to create. Here's my code.

here is the code for initial value of formik

  const initialOrderItemData = orderItems && orderItems.map((orderItem) => {
  return {
    itemId: orderItem.itemId,
    quantity: orderItem.quantity,
  }
});
  
  const initialOrderInfo = {
    orderedItemDataArray: initialOrderItemData,
  };

This is my form

              <Formik
                initialValues={initialOrderInfo}
                onSubmit={handleSubmit}
                validationSchema={HotelOrderSchema}
              >
                {({ errors, setFieldValue, touched, values, name, }) => (
                  <Form>
                          <Row>
                            <Table size="sm" hover>
                              <thead>
                                <tr>
                                  <th>Item</th>
                                  <th>Quantity</th>
                                  <th>Operation</th>
                                </tr>
                              </thead>
                              <tbody>
                              <FieldArray
                              name="orderedItemDataArray"
                              render={({ remove, push }) => (
                            <>
                              {values.orderedItemDataArray.length > 0 &&
                                values.orderedItemDataArray.map(
                                  (order, index) => (
                                    <tr key={index}>
                                      <td>
                                        <Select
                                          as="select"
                                          name={`orderedItemDataArray.${index}.itemId`}
                                          options={menuOptions}
                                          placeholder="Type"
                                          // value={selectedItems(order.itemId)}
                                          value={menuOptions.find(op => {
                                            return op.value === order.itemId
                                         })}
                                        />
                                      
                                      </td>
                                      <td>
                                        <Field
                                          type="number"
                                          className="form-control"
                                          name={`orderedItemDataArray.${index}.quantity`}
                                          min="0"
                                          placeholder="Quantity"
                                        />
                                      </td>
                                      <td>
                                        <ButtonGroup>
                                          {values.orderedItemDataArray
                                            .length !== 1 && (
                                            <Button
                                              color="primary"
                                              size="sm"
                                              onClick={() => remove(index)}
                                            >
                                              -
                                            </Button>
                                          )}
                                          {values.orderedItemDataArray
                                            .length -
                                            1 ===
                                            index && (
                                            <Button
                                              color="secondary"
                                              size="sm"
                                              onClick={() =>
                                                push({
                                                  itemId: '',
                                                  quantity: '',
                                                })
                                              }
                                            >
                                              +
                                            </Button>
                                          )}
                                        </ButtonGroup>
                                      </td>
                                    </tr>
                                  )
                                )}
                            </>
                          )}
                        />
                        </tbody>
                      </Table>
                    </Row>
                  </Form>
              </Formik>

with this code I am able to get the value but I am unable to change the value and set the new value.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

姐不稀罕 2025-02-08 21:51:32

在您的选择组件中,您必须包括一个on Change事件,这样

//set a state for the changed selected option

const [selectedOption,setSelectedOption] = useState()

<Select
    as="select"
    name={`orderedItemDataArray.${index}.itemId`}
    options={menuOptions}
    placeholder="Type"
    // value={selectedItems(order.itemId)}
    value={menuOptions.find(op => {
    return op.value === order.itemId
    onChange={(e) => {
        setSelectedOption(e.target.value)
    }}
    })}
/>

//then if you  wanna access the selected option  you  can use the useState value.

<p>{selectedOption}</p>

In your select component you must include an onChange event like so

//set a state for the changed selected option

const [selectedOption,setSelectedOption] = useState()

<Select
    as="select"
    name={`orderedItemDataArray.${index}.itemId`}
    options={menuOptions}
    placeholder="Type"
    // value={selectedItems(order.itemId)}
    value={menuOptions.find(op => {
    return op.value === order.itemId
    onChange={(e) => {
        setSelectedOption(e.target.value)
    }}
    })}
/>

//then if you  wanna access the selected option  you  can use the useState value.

<p>{selectedOption}</p>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文