我正在try 将MUI按钮组中的选定值保存到Reaction-Hook-Form的状态,但遇到一些问题--该值没有正确更新.

codesandbox link here

以下是我的代码的一个通用版本:

import { ButtonGroup, Button } from '@mui/material'
import { useForm, Controller } from 'react-hook-form'

export default function MyComponent() {
  const { control, setValue, getValues } = useForm()

  const options = ['Option1', 'Option2', 'Option3']

  return (
    <Controller
      name="selectedOption"
      control={control}
      render={({ field }) => (
        <ButtonGroup>
          {options.map((option) => {
            return (
              <Button
                key={option}
                variant={field.value === option ? 'contained' : 'outlined'}
                onClick={() => {
                  setValue('selectedOption', option)  {/* this trick didn't work */}
                }}
              >
                {option}
              </Button>
            )
          })}
        </ButtonGroup>
      )}
    />
  )
}

我用了setValue('selectedOption', option),但我不确定这是不是一种很好的做法.

我面临的问题是,当我单击Button Group中的按钮时,我希望表单状态中的selectedOption值更新为所单击按钮的值.然而,getValues方法似乎并不能反映更新后的状态.

这里的问题可能是什么?当按钮组中的某个按钮被单击时,我如何才能成功地更新和检索选定的Option值?

提前感谢您的帮助!

推荐答案

如果103想要将上下文作为props 传递给Form组件,则需要将FormProvideruseFormContext一起使用.(通过查看您的示例,我假设您想要这样做).

useFormContextdocs开始:

useFormContext:功能

此自定义挂钩允许您访问表单上下文.使用FormContext 旨在用于深度嵌套的 struct 中,在这种情况下 变得不方便将上下文作为props 传递.

例如:

export default function MyComponent() {
  const methods = useForm();

  return (
    {/* Add FormProvider with useForm return props */}
    <FormProvider {...methods}>

      ...

    </FormProvider>
  );
}

const Form = () => {
  // Retrieve your setter/getter functions from useFormContext
  const { control, setValue, getValues } = useFormContext();
  const options = ["Option1", "Option2", "Option3"];

  ...
};

Working CodeSandbox:https://codesandbox.io/s/react-hook-form-no-props-kngps3?file=/src/Form.jsx

Javascript相关问答推荐

禁用从vue.js 2中的循环创建的表的最后td的按钮

如何通过在提交时工作的函数显示dom元素?

是什么原因导致此Angular 16应用程序中类型错误时属性结果不存在?

使用axios.获取实时服务器时的404响应

如何才能拥有在jQuery终端中执行命令的链接?

我不知道为什么setwritten包装promise 不能像我预期的那样工作

JQuery. show()工作,但. hide()不工作

React 17与React 18中的不同setState行为

如何在不创建新键的情况下动态更改 map 中的项目?

如何修复我的js构建表每当我添加一个额外的列作为它的第一列?

我在我的Java代码中遇到了问题,代码的一部分看不到先前定义的对象

使用GraphQL查询Uniswap的ETH价格

如何将react—flanet map添加到remixjs应用程序

Reaction Native中的范围滑块

提交链接到AJAX数据结果的表单

如何创建返回不带`new`关键字的实例的类

JavaScript是否有多个`unfined`?

Django导入问题,无法导入我的应用程序,但我已在设置中安装了它

react 路由DOM有条件地呈现元素

更新文本区域行号