【问题标题】:React Select does not trigger when onChangeonChange 时 React Select 不触发
【发布时间】:2020-11-09 03:22:45
【问题描述】:

我正在尝试使用事件 onChange 访问 Select 的值,以便我可以更新另一个 Select,但 Select 不会触发 onChange。你可以在codesandbox找到代码:

import React, { useState } from "react";
import ReactDOM from "react-dom";
import { useForm, Controller } from "react-hook-form";
import {
  FormControl,
  Select,
  MenuItem,
  InputLabel,
  FormHelperText
} from "@material-ui/core";

function App() {
  const { handleSubmit, errors, control } = useForm();
  const onSubmit = (data) => {
    console.log(data);
  };
  const [test, setTest] = useState(0);
  const handleChange = (stateFunction, event) => {
    if (event) {
      console.log(event);
      setTest(event.target.value);
    }
  };
  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <FormControl variant="outlined" required>
        <InputLabel>Test</InputLabel>
        <Controller
          as={
            <Select width={"300px"} onChange={handleChange(setTest, this)}>
              <MenuItem value="1">One</MenuItem>
              <MenuItem value="2">Two</MenuItem>
              <MenuItem value="3">Three</MenuItem>
            </Select>
          }
          control={control}
          defaultValue="1"
          name="brandId"
          rules={{ required: "Marca es requerido" }}
        />
        <FormHelperText error={true}>
          {errors.brand && errors.brand.message}
        </FormHelperText>
      </FormControl>

      <input type="submit" />
    </form>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

知道问题出在哪里吗?

谢谢

【问题讨论】:

  • 我不确定,但是一旦将 Select 部分移到 Controller 之外,它就可以工作了。
  • 我认为你应该关注这个答案stackoverflow.com/a/63246774/1435722
  • @GuruparanGiritharan 谢谢老兄,说清楚了。

标签: reactjs material-ui


【解决方案1】:

你需要调用像onSubmit={() =&gt; handleSubmit(onSubmit)}这样的函数。 在您当前的代码中,一旦组件被渲染,handleSubmit 就会被调用,因为您像这样直接调用它handleSubmit(onSubmit)

最终输出:

Sandbox Link

我还编辑了 &lt;SpecialInput/&gt; 组件来处理输入。

可能的修复:


import React, { useState } from "react";
import ReactDOM from "react-dom";
import { useForm, Controller } from "react-hook-form";
import {
  FormControl,
  // SelectField,
  MenuItem,
  Select,
  InputLabel,
  FormHelperText
} from "@material-ui/core";
import SpecialInput from "./SpecialInput";
function App() {
  const { handleSubmit, errors, control } = useForm();
  const onSubmit = (data) => {
    console.log("hi");
  };
  const [test, setTest] = useState(0);
  const [selectedItem, setItem] = useState(1);
  const handleChange = (stateFunction, event) => {
    if (event) {
      event.preventDefault();
      console.log("hi");
      // setTest(event.target.value);
      console.log("test:", test);
    }
  };

  const onTextChange = (event) => {
    setTest(event.target.value);
  };

  return (
    <form onSubmit={(event) => handleChange(onSubmit, event)}>
      <FormControl variant="outlined" required>
        <InputLabel>Test</InputLabel>
       
        <Controller
          render={(props) => (
            <Select
              value={selectedItem}
              onChange={(event) => setItem(event.target.value)}
            >
              <MenuItem value="1">One</MenuItem>
              <MenuItem value="2">Two</MenuItem>
              <MenuItem value="3">Three</MenuItem>
            </Select>
          )}
          control={control}
          defaultValue="1"
          name="brandId"
          rules={{ required: "Marca es requerido" }}
        />
        <FormHelperText error={true}>
          {errors.brand && errors.brand.message}
        </FormHelperText>
      </FormControl>
      <SpecialInput handleChange={onTextChange} test={test} />
      <input type="submit" />
      <h1>{`Test Value: ${test}`}</h1>
      <h1>{`Select Value: ${selectedItem}`}</h1>
    </form>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

【讨论】:

  • 我刚刚尝试过,但它不会触发 onChange 事件。
  • react-hook-form 需要 Controller 吗?
  • @WilliamWang 我愿意。
  • 还有一件事,您忘记在handleSubmit() 方法中使用event.preventDefault(),因为每当按下提交时,整个页面都会被刷新。尝试更新的代码。我检查了它,它正在工作
  • @KetanRamteke 感谢您的完整描述,非常感谢!唯一的问题是我无法捕获 Select 的 onChange 事件。关于如何做到这一点的任何建议?
猜你喜欢
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 2018-12-05
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 1970-01-01
相关资源
最近更新 更多