【问题标题】:useState with a boolean带布尔值的 useState
【发布时间】:2020-03-16 14:52:53
【问题描述】:

我有一个 react next.js 项目和一个表单。我想在我的表单中使用滑块。顺便说一句,我使用语义 ui 反应。我有一个带有以下输入的 useState 钩子:

function CreateTicket() {
  const [ticket, setTicket] = useState({
    name: "",
    description: "",
    media: "",
    priority: false
  });
....

还有一个handleChange、handleSubmit 和一个handleToggle 函数。当我在 console.log 中提交表单时,它不会将优先级的值设置回 false。

      <Checkbox
        style={{ padding: "1rem" }}
        label="Important?"
        name="priority"
        toggle
        onChange={handleToggle}
      />

  const handleToggle = event => {
    let { priority } = event.target;
    setTicket(prevState => ({ ...prevState, priority: !priority }));
  };

console.log ->

页面刷新后:

{name: "", description: "", media: "", priority: false}

之后:切换

{name: "", description: "", media: "", priority: true}

第二次切换后

{name: "", description: "", media: "", priority: true}

我做错了什么?

【问题讨论】:

  • event.target 没有属性 priority 据我所知,!undefinedtrue

标签: reactjs react-hooks next.js


【解决方案1】:

您需要从prevState 解构priority,而不是event.target

const handleToggle = event => {
  setTicket(({ priority, ...prevState }) =>
    ({ ...prevState, priority: !priority })
  );
};

作为一种优化,您可以将handleToggleuseCallback() 一起记忆,这样&lt;Checkbox/&gt; 就不需要在每次状态更新时重新渲染:

const handleToggle = useCallback(event => {
  setTicket(({ priority, ...prevState }) =>
    ({ ...prevState, priority: !priority })
  );
}, [setTicket]);

【讨论】:

    猜你喜欢
    • 2021-07-17
    • 1970-01-01
    • 2021-02-26
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    相关资源
    最近更新 更多