4 回答

TA貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個(gè)贊
您忘記了輸入元素上的 onChange 處理程序來(lái)設(shè)置項(xiàng)目的雜項(xiàng)值。
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貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊
因此,首先,我鼓勵(lì)您不要在input字段和divs 之間切換,而是使用可內(nèi)容編輯的div。然后你只需使用該onInput屬性來(lái)調(diào)用一個(gè)setState函數(shù),如下所示:
function Tasks ({item}) {
return(
<div className = 'tasks-container'>
<div contenteditable="true" onInput={e => editTask(item.id, e.currentTarget.textContent)} >
{item.chore}
</div>
</div>
)
}
然后,在父組件中,您可以定義editTask為一個(gè)函數(shù),該函數(shù)通過(guò)其 id 查找項(xiàng)目并將其替換為新內(nèi)容(在原始任務(wù)數(shù)組的副本中,而不是原始數(shù)組本身。
此外,您應(yīng)該避免在組件之間重命名變量。( listOfTasks-> jobItems)。這增加了不必要的開(kāi)銷,并且您不可避免地會(huì)在某些時(shí)候混淆哪個(gè)變量連接到哪個(gè)變量。而是說(shuō),<MyComponent jobItems={jobItems} >或者如果您想允許更大的抽象<MyComponent items={jobItems} >,然后您可以將組件重用于作業(yè)以外的可列出項(xiàng)目。

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超8個(gè)贊
有關(guān)工作示例,請(qǐng)參見(jiàn)沙箱:
https://codesandbox.io/s/practical-lewin-sxoys?file=/src/App.js
您的 Task 組件需要一個(gè) keyPress 處理程序來(lái)在按下 enter 時(shí)將 isEditing 設(shè)置為 false:
const handleKeyPress = (e) => {
if (e.key === "Enter") {
setIsEditing(false);
}
};
您的 updateHandler 也應(yīng)該傳遞給輸入的 onChange 屬性,而不是 defaultValue,而是使用 value。它還需要重新配置以接收 onChange 事件,并且您可以使用索引映射任務(wù)以找到它們的狀態(tài):
const updateHandler = (e, index) => {
const value = e.target.value;
setTasks(state => [
...state.slice(0, index),
{ ...state[index], chore: value },
...state.slice(index + 1)
]);
};
最后,TaskList 似乎是一個(gè)不必要的中間人,因?yàn)樗泄δ芏荚?App 和 Task 之間;您可以直接將任務(wù)渲染到具有您選擇的 className 的 div 中。

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超6個(gè)贊
react-edit-text是我創(chuàng)建的一個(gè)包,它完全符合您的描述。
它在 React 中提供了一個(gè)輕量級(jí)的可編輯文本組件。
還提供現(xiàn)場(chǎng)演示。
添加回答
舉報(bào)