【问题标题】:unable to properly use checkbox to populate state value in input field无法正确使用复选框在输入字段中填充状态值
【发布时间】:2021-12-26 18:00:56
【问题描述】:

我有两个输入字段。当我按下复选框时,solutestate 中存储的状态值应该在第一个输入框中。那么如果我取消选中该框,则应更改第二个输入字段中的值。两个输入框都应该有独立的状态变化。我附上了一个我正在尝试编辑的代码框链接Sandbox link

import "./styles.css";
import { Jsme } from "jsme-react";
import { useState } from "react";
import { useForm } from "react-hook-form";
import { default as FormData } from "form-data";

export default function App() {
  const [input1, setInput1] = useState("");
  const [input2, setInput2] = useState("");
  const [syncToFirst, setSyncToFirst] = useState();
  const [solutestate, setSoluteState] = useState();

  const { register, handleSubmit, control } = useForm({
    defaultValues: {
      solute: "",
      solvent: ""
    }
  });

  const formData = new FormData();
  return (
    <div className="App">
      <Jsme
        height="300px"
        width="400px"
        options="oldlook,star"
        onChange={setSoluteState}
      />

      <h1>{solutestate}</h1>
      <input
        className="mr-2 leading-tight"
        type="checkbox"
        onChange={(event) => {
          setSyncToFirst(event.target.checked ? 1 : 2);
        }}
      />

      <input
        className="mr-2 leading-tight"
        type="checkbox"
        onChange={(event) => {
          setSyncToFirst(event.target.checked ? 1 : 2);
        }}
      />
      <form>
        <input
          {...register("solute")}
          placeholder="SOLUTE"
          onChange={(e) =>
            syncToFirst === 1
              ? setSoluteState(e.target.value)
              : setInput1(e.target.value)
          }
          value={syncToFirst === 1 ? solutestate : input1}
        />
        <input
          {...register("solvent")}
          placeholder="SOLVENT"
          onChange={(e) =>
            syncToFirst === 2
              ? setSoluteState(e.target.value)
              : input2(e.target.value)
          }
          value={syncToFirst === 2 ? solutestate : input2}
        />
      </form>
    </div>
  );
}

【问题讨论】:

  • 你能澄清你想要做什么吗?取消选中第一个复选框时会发生什么?当您选中和取消选中另一个复选框时会发生什么?
  • @hellogoodnight 当我选中第一个框时,状态值应该在第一个输入字段中。当我取消选中第一个框并选中第二个框时,状态值应该在第二个输入字段中。在选中第二个框并取消选中第一个框时,第一个输入字段中的值应保留。顺便说一句,我正在使用两个输入字段进行预测。
  • 如果两个复选框都被选中会发生什么?
  • @hellogoodnight 我们也可以用一个复选框来做同样的事情。如果选中它应该填充在第一个输入字段中,如果取消选中它应该填充第二个输入字段
  • @hellogoodnight 在同时检查两个输入字段时,应为两个输入字段赋予相同的值

标签: javascript reactjs forms react-hooks react-state


【解决方案1】:

我不确定我是否关注你,但对于初学者来说,你应该将复选框值放在状态变量中。我真的不明白你是否关心检查的顺序,即最后选中的是哪个复选框。

export default function App() {
  // I added the following state variables to keep track of checkboxes
  const [isCheckbox1Checked, setIsCheckbox1Checked] = useState(false);
  const [isCheckbox2Checked, setIsCheckbox2Checked] = useState(false);
  const [input1, setInput1] = useState("");
  const [input2, setInput2] = useState("");
  const [syncToFirst, setSyncToFirst] = useState();
  const [solutestate, setSoluteState] = useState();

  const { register, handleSubmit, control } = useForm({
    defaultValues: {
      solute: "",
      solvent: ""
    }
  });

  return (
    <div className="App">
      <Jsme
        height="300px"
        width="400px"
        options="oldlook,star"
        onChange={setSoluteState}
      />

      <h1>{solutestate}</h1>
      <input
        className="mr-2 leading-tight"
        type="checkbox"
        value={isCheckbox1Checked}
        onChange={() => setIsCheckbox1Checked(prev => !prev)}
      />

      <input
        className="mr-2 leading-tight"
        type="checkbox"
        value={isCheckbox2Checked}
        onChange={() => setIsCheckbox2Checked(prev => !prev)}
      />
      <form>
        <input
          {...register("solute")}
          placeholder="SOLUTE"
          onChange={(e) =>
            syncToFirst === 1
              ? setSoluteState(e.target.value)
              : setInput1(e.target.value)
          }
          value={isCheckbox1Checked ? solutestate : input1}
        />
        <input
          {...register("solvent")}
          placeholder="SOLVENT"
          onChange={(e) =>
            syncToFirst === 2
              ? setSoluteState(e.target.value)
              : input2(e.target.value)
          }
          value={isCheckbox2Checked ? solutestate : input2}
        />
      </form>
    </div>
  );
}

这段代码还是很奇怪,你能解释一下你想从文本输入字段中得到什么行为吗?

【讨论】:

  • 我实际上是在对两个文本输入字段进行预测。输入字段的状态值是从编辑器获取的,如图所示。 codesandbox.io/s/little-darkness-c1yfq?file=/src/App.js 使用这个链接你可以看到我在说什么
  • 抱歉,我无法理解您希望代码具有什么行为。祝你好运
  • 每当我取消选中该框时,该值就会消失。输入后,如果我也取消选中,它应该在那里。如果不是,我不能在输入文本字段中写入两个不同的值
  • 并且每当我尝试在第二个输入文本字段中输入正常时,它都会抛出错误input2 is not a function
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多