微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

输入未使用钩子重新呈现onChange

如何解决输入未使用钩子重新呈现onChange

在键入和记录输入的e.target.value时,我得到了认值+最后一个击键,但没有重新渲染。我猜想React无法识别状态发生了变化,但是在寻找正确的方法时遇到了问题。

这是有问题的代码

  const [text,setText] = useState(task.text);
  console.log(text);

  const handleInputChange = (e) => {
    setText(e.target.value);
  };

  const taskInput = (
    <form>
      <input type='text' value={text} onChange={handleInputChange} />
    </form>
  );

完整文件

import React,{ useContext,useState } from "react";
import { TaskContext } from "../context/TaskState";

const Task = ({ task }) => {
  const { deleteTask } = useContext(TaskContext);
  const { changeStatus } = useContext(TaskContext);

  const taskText = (
    <div
      className='task-text'
      onClick={() => changeStatus({ ...task,done: !task.done })}
      style={task.done ? { textdecoration: "line-through" } : null}
    >
      {task.text}
    </div>
  );

  const [text,setText] = useState(task.text);
  console.log(text);

  const handleInputChange = (e) => {
    setText(e.target.value);
  };

  const taskInput = (
    <form>
      <input type='text' value={text} onChange={handleInputChange} />
    </form>
  );

  const [option,setoption] = useState(taskText);

  return (
    <div className='task-container'>
      <button className='task-edit' onClick={() => setoption(taskInput)}>
        edit
      </button>
      <button className='task-delete' onClick={() => deleteTask(task.id)}>
        x
      </button>
      {option}
    </div>
  );
};

export default Task;

我正在为其他应用程序和化简器使用全局状态。

解决方法

我认为,您输入的onChange可能会导致此错误。尝试更换它:

onChange={handleInputChange}

与此:

onChange={(e) => handleInputChange(e)}

e对象可能不会传递给您的方法。

,

请尝试将您的taskInput值包装在具有依赖项useMemo的{​​{1}}中,因为在重新渲染期间将JSX存储为变量时,由于它们不知道使用的变量,它们引用的是先前的值价值改变了。

text
,

问题是我在jsx内部传递选项的方式。

我将选项状态设置为布尔值,将taskText和taskInput转换为函数,并在jsx中有条件地传递了选项。

import React,{ useContext,useState } from "react";
import { TaskContext } from "../context/TaskState";

const Task = ({ task }) => {
  const { deleteTask } = useContext(TaskContext);
  const { changeStatus } = useContext(TaskContext);

  const taskText = () => {
    return (
      <div
        className='task-text'
        onClick={() => changeStatus({ ...task,done: !task.done })}
        style={task.done ? { textDecoration: "line-through" } : null}
      >
        {task.text}
      </div>
    );
  };

  const [text,setText] = useState(task.text);
  console.log(text);

  const handleInputChange = (e) => {
    setText(e.target.value);
  };

  const taskInput = () => {
    return (
      <form>
        <input type='text' value={text} onChange={handleInputChange} />
      </form>
    );
  };

  const [option,setOption] = useState(true);

  return (
    <div className='task-container'>
      <button className='task-edit' onClick={() => setOption(!option)}>
        edit
      </button>
      <button className='task-delete' onClick={() => deleteTask(task.id)}>
        x
      </button>
      {option ? taskText() : taskInput()}
    </div>
  );
};

export default Task;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。