我尝试开始学习react,但无法理解基本逻辑。我有一个待办事项列表页面,带删除线可以正常工作,但如果我尝试将删除线改为REMOVE,我的应用程序在点击时消失。下面是我的代码,希望你能理解:
function Note({ notes, note, onClickSetter }) {
const { input, id } = note
const [strikeThrough, setStrikeThrough] = useState(false);
function onNoteClick(event) {
const { value, id } = event.target
//setStrikeThrough((prev) => !prev) - the strike through which is canceled right now
onClickSetter(prev => prev.filter(aNote => aNote.id !== id)) // why this doesn't work?
}
return (
<>
<h1 style={ strikeThrough ? {textDecoration: 'line-through'} : { textDecoration: 'none' }} id={id} onClick={onNoteClick}>{input}</h1>
</>
)
}
字符串
关于我的props的一点解释:notes --字面上的注解列表,来自父组件上的useState(根据我对react的理解,我们不应该触及这个)
备注-自备注信息
onClickSetter -useState的另一部分,setter。
所以换句话说,我有保存所有注解的注解,而onClickSetter换句话说就是setNotes -两者都是useState的一部分
除此之外,我还有一个注解信息,因为这是一个注解组件
父组件:
function Body() {
const [Notes, setNotes] = useState([])
return (
<div className='notes-body'>
<NewNote onClickSetter={setNotes}/>
{Notes.map((note) => { return <Note key={note.id} notes={Notes} note={note} onClickSetter={setNotes}/>})}
</div>
)
}
function NewNote({ onClickSetter }) {
const [input, setInput] = useState('')
function onInputChange(event) {
const { value } = event.target
setInput(value)
}
function onButtonClick(event) {
onClickSetter((prev) => {
try {
return [...prev, {input: input, id: prev[prev.length-1].id+1}]
}catch{
return [{input: input, id: 0}]
}
})
setInput('')
}
return (
<>
<Input placeholder="add new note" className='note-text' onChange={onInputChange} value={input}/>
<Button className='btn btn-primary add-note' onClick={onButtonClick} />
</>
)
}
的数据
1条答案
按热度按时间dsekswqp1#
原因是
event.target.id
是一个string
表示一个数字,因为所有的HTML属性都是字符串类型。而在你的数据结构中,ID是一个number
。所以,例如,"1"
与1
。这有时很难发现。解决这个问题的最简单方法是在正确的位置添加
parseInt
,将字符串转换为数字:字符串
然而,我还想提一下(这是更高级的东西,但我喜欢让人们走上正确的道路),真的,你不应该把整个setter传递给子组件,而是一个名为
onRemoveNote
的回调函数,它接受note id,实际的过滤/删除将在父组件中发生。这将是更好地解决问题。