【发布时间】:2021-01-31 19:05:48
【问题描述】:
输入并记录输入 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;
我正在为应用程序的其余部分和减速器使用全局状态。
【问题讨论】:
-
首先我建议不要将元素保持在状态作为选项。使选项成为布尔值或
[option,...]=useState('taskText')之类的原语。然后点击更改它。有条件地渲染{ option === 'taskText' ? taskText: taskInput}。也可以制作 taskText 和 taskInout 函数。 -
@kimobrian254 感谢您的帮助!我将选项设置为布尔值,并更改了 onClick 事件,但是当我创建 taskText 和 taskInput 函数时出现错误:index.js:1 Warning: Functions are not valid as a React child. 当我有条件地尝试将它们呈现为组件
和 ,onClick 事件停止工作,但反应呈现 。在我将它们转换为函数之前发生了同样的事情。 -
您不渲染函数名称,而是渲染调用(返回值),因此您渲染
{taskText}而不是{taskText()}。然后,由于您将 option 设为布尔值,因此请让您的 onClick 像onClick={() => setOption(false)}一样使用它。它首先呈现 taskText(假设选项默认为 trueconst [option, setOption] = useState(true);),当您单击它时呈现 taskInput,因为选项更改为 false 所以{option ? taskText: taskInput}应该按预期工作 @Aleksandar Andonovic -
不客气,我将不胜感激。
-
没关系,不客气
标签: reactjs input react-hooks onchange use-state