我正在创建一个模式窗口,它为用户提供了通过输入改变数量的其他选项,以及增加或减少数量的一些按钮,所有这些都是通过Reaction-Hook-Form函数处理的.

export const ModalCart = ({ show, id, amount, setHandleConfigModal }) => {
    
    const api = new FormService();
    const { handleSubmit, register, setValue, getValues, formState: { isSubmitting } } = useForm()

    const onSubmit = async (formData) => {
        try {
            console.log({...formData, id})
            setHandleConfigModal({ show: false })
        } catch (e) {
            console.log(e)
        }
    }

    return (
        <Modal
            show={ show }
            onHide={ () => setHandleConfigModal({ show: false }) }
        >
            <Modal.Header closeButton>
                <Modal.Title>Handle the Amount</Modal.Title>
            </Modal.Header>
            
            <Modal.Body>
                <Form onSubmit={ handleSubmit(onSubmit) }>
                    <div className="d-flex gap-2 justify-content-between">
                        <div>
                            <Button
                                className="btn btn-outline-dark px-3 ms-2"
                                disabled={isSubmitting}
                                onClick={ () => setValue( 'amount', Number(getValues('amount')) - 1 ) }
                            >
                                +
                            </Button>
                        </div>

                        <div className="w-100">
                            <Form.Control
                                type="number"
                                placeholder="0"
                                disabled={isSubmitting}
                                defaultValue={ amount}
                                min={0}
                                {...register('amount')}
                            />
                        </div>

                        <div>
                            <Button
                                className="btn btn-outline-dark px-3 me-2"
                                disabled={ isSubmitting }
                                onClick={ () => setValue( 'amount', Number(getValues('amount')) + 1 ) }
                            >
                                -
                            </Button>
                        </div>
                    </div>

                    <Button 
                        disabled={ isSubmitting }
                        type="submit"
                        className="btn btn-primary px-3 me-2 mt-2"
                    > 
                        Save
                    </Button>
                </Form>
            </Modal.Body>
        </Modal>
    );
}

first shipment: amount = 15 enter image description here

输出提交 {金额:15,ID:2}

first shipment: the amount should be = 2 enter image description here

预期提交输出 {金额:2,ID:2}

已收到输出提交 {金额:15,ID:2}

我遇到的问题是,当通过props 将第一个量发送到模型时,它被正确地分配给输入,但在再次发送另一个量后,输入保持先前的值.如果有人能帮我解决这个问题,我是新手,我会很感激你的帮助.

推荐答案

您遇到的问题似乎是由Reaction Hook表单处理输入值的方式引起的.当您向模式发送新值时,它不会更新输入字段,因为Reaction Hook表单不会在props 更改时自动更新值.要处理这种情况,可以使用useEffect挂钩来监视数量props 的更改,并相应地更新输入值.

以下是您的ModalCart组件的更新版本,其中包含更改:

import React, { useEffect } from 'react';
import { Modal, Form, Button } from 'react-bootstrap';
import { useForm } from 'react-hook-form';

export const ModalCart = ({ show, id, amount, setHandleConfigModal }) => {
  const { handleSubmit, register, setValue, getValues, formState: { isSubmitting } } = useForm();

  useEffect(() => {
    setValue('amount', amount);
  }, [amount, setValue]);

  const onSubmit = async (formData) => {
    try {
      console.log({ ...formData, id });
      setHandleConfigModal({ show: false });
    } catch (e) {
      console.log(e);
    }
  };

  return (
    <Modal
      show={show}
      onHide={() => setHandleConfigModal({ show: false })}
    >
      <Modal.Header closeButton>
        <Modal.Title>Handle the Amount</Modal.Title>
      </Modal.Header>

      <Modal.Body>
        <Form onSubmit={handleSubmit(onSubmit)}>
          <div className="d-flex gap-2 justify-content-between">
            <div>
              <Button
                className="btn btn-outline-dark px-3 ms-2"
                disabled={isSubmitting}
                onClick={() => setValue('amount', Number(getValues('amount')) - 1)}
              >
                -
              </Button>
            </div>

            <div className="w-100">
              <Form.Control
                type="number"
                placeholder="0"
                disabled={isSubmitting}
                defaultValue={amount}
                min={0}
                {...register('amount')}
              />
            </div>

            <div>
              <Button
                className="btn btn-outline-dark px-3 me-2"
                disabled={isSubmitting}
                onClick={() => setValue('amount', Number(getValues('amount')) + 1)}
              >
                +
              </Button>
            </div>
          </div>

          <Button
            disabled={isSubmitting}
            type="submit"
            className="btn btn-primary px-3 me-2 mt-2"
          >
            Save
          </Button>
        </Form>
      </Modal.Body>
    </Modal>
  );
};

我在代码的开头添加了useEffect的导入,并使用useEffect观察props 数量的变化.当数量属性更改时,输入值将使用Reaction Hook Form中的setValue函数进行相应更新.

请注意,我还更正了+/-按钮标签,以正确表示它们各自的操作.

Reactjs相关问答推荐

如何使用json将购物车数组传递到后台API

在Redux工具包查询中,是否可以将标记应用到API切片内的所有端点?

为什么安装FLOBIT后,所有的输入FIELD现在都有一个蓝色的轮廓?

使用Thattle和Use Effect setTimeout进行搜索有什么不同

如何在MUI X数据网格列中显示IMG?

为什么我的react虚拟化列表不显示滚动条,除非我确保高度低于rowCount*rowHeight?

使用自动播放的视频组件呈现登录页面时出现JEST测试错误

如何在我的 React 应用程序中仅显示我的 Register 组件

当 URL 与我声明的任何路由都不匹配时,如何使用不会重定向到错误页面的动态 URL? - react 路由 dom

如何在 ChartJS 中创建此图表?在 NEXTjs 和 TSX 中

解决在React测试库中的act()警告

使用D3.js绘制和展示弦图的右下方象限

redux 工具包使用中间件构建器函数时,必须返回一个中间件数组

如何在 Next Js 13 App Router 中添加 Favicon 图标?

在 React 中使用复选框管理状态

使用dayjs时如何在输入类型日期时间本地字段中设置默认值?

在 redux 工具包中使用 dispatch 发送多个操作

如何在 JSX 中使用 -webkit- 前缀?

如何实现两个 SVG 形状相互叠加的 XOR 操作?

Select MenuItem 时 Material-ui 不更改样式