4 回答
TA贡献1884条经验 获得超4个赞
您忘记了输入元素上的 onChange 处理程序来设置项目的杂项值。
Tasks.jsx 必须如下所示
import React, {useState} from 'react'
function Tasks (props) {
const [isEditing, setIsEditing] = useState(false)
const handleInputChange = (e)=>{
// console.log( e.target.value );
// your awesome stuffs goes here
}
return(
<div className = 'tasks-container'>
{
isEditing ?
<form>
<input type = 'text' onChange={handleInputChange} defaultValue = {props.item.chore}/>
</form>
: <h1 onDoubleClick ={()=> setIsEditing(true)}>{props.item.chore}</h1>
}
</div>
)
}
export default Tasks
TA贡献1811条经验 获得超5个赞
因此,首先,我鼓励您不要在input字段和divs 之间切换,而是使用可内容编辑的div。然后你只需使用该onInput属性来调用一个setState函数,如下所示:
function Tasks ({item}) {
return(
<div className = 'tasks-container'>
<div contenteditable="true" onInput={e => editTask(item.id, e.currentTarget.textContent)} >
{item.chore}
</div>
</div>
)
}
然后,在父组件中,您可以定义editTask为一个函数,该函数通过其 id 查找项目并将其替换为新内容(在原始任务数组的副本中,而不是原始数组本身。
此外,您应该避免在组件之间重命名变量。( listOfTasks-> jobItems)。这增加了不必要的开销,并且您不可避免地会在某些时候混淆哪个变量连接到哪个变量。而是说,<MyComponent jobItems={jobItems} >或者如果您想允许更大的抽象<MyComponent items={jobItems} >,然后您可以将组件重用于作业以外的可列出项目。
TA贡献1789条经验 获得超8个赞
有关工作示例,请参见沙箱:
https://codesandbox.io/s/practical-lewin-sxoys?file=/src/App.js
您的 Task 组件需要一个 keyPress 处理程序来在按下 enter 时将 isEditing 设置为 false:
const handleKeyPress = (e) => {
if (e.key === "Enter") {
setIsEditing(false);
}
};
您的 updateHandler 也应该传递给输入的 onChange 属性,而不是 defaultValue,而是使用 value。它还需要重新配置以接收 onChange 事件,并且您可以使用索引映射任务以找到它们的状态:
const updateHandler = (e, index) => {
const value = e.target.value;
setTasks(state => [
...state.slice(0, index),
{ ...state[index], chore: value },
...state.slice(index + 1)
]);
};
最后,TaskList 似乎是一个不必要的中间人,因为所有功能都在 App 和 Task 之间;您可以直接将任务渲染到具有您选择的 className 的 div 中。
添加回答
举报