正如标题所暗示的那样,我试图在我的state object
内部定位一个数组,但正如你曾经想过的那样。这并不像听起来那么简单。我在这里查看了几个问题(React: How do I update state.item[1] on setState? (with JSFiddle)和ReactJS - setState of Object key in Array),但两个问题都没有解决我的问题。
我需要的是定位noteData
数组内的特定索引,并根据用户在<TextArea />
组件中输入的内容进行更新。不完全确定原因,但我的noteData
数组只是读作一个空字符串noteData = ['']
的数组。
如果您需要更深入的了解,可以转到https://stackblitz.com/edit/note-taking并翻页并自行编辑。文件结构至少可以说是愚蠢的。我开始使用redux并在中途决定反对它。
class NoteList extends Component {
constructor(props) {
super(props);
this.state = {
inputValue: '',
noteName: [],
noteData: [],
selectedNote: []
}
}
handleInputValue(e) {
this.setState({
inputValue: e.target.value
});
}
addNoteFunc(e) {
this.setState({
noteName: [ ...this.state.noteName, e.target.value ],
noteData: [ ...this.state.noteData, '' ]
});
}
// everytime the user types, change the value of noteData
handleNoteData(e, index = this.state.selectedNote[0]) {
const copyNoteData = Object.assign({}, this.state);
copyNoteData.noteData[index] = e.target.value;
this.setState(copyNoteData);
}
handleSelectedNote(index) {
this.setState({
selectedNote: [ index ]
});
}
<textarea
value={this.state.noteData[this.state.selectedNote[0]]}
handleNoteData={(e, index) => this.handleNoteData(e, index)}
/>
import React from 'react';
const TextArea = props => {
return (
<div className='textarea'>
<textarea
value={props.value}
onKeyDown={props.handleNoteData}
/>
</div>
);
}
export default TextArea;
答案 0 :(得分:2)
你的代码中有错误,因为textarea不是正确的组件,应该是TextArea而不是textarea这是一个html元素,你首先必须先将它导入notelist.js,这就是为什么onKeyDown props是没有被设定。
<TextArea
value={this.state.noteData[this.state.selectedNote[0]]}
handleNoteData={(e, index) => this.handleNoteData(e, index = this.state.selectedNote[0])}
/>
此外,您必须将handleNoteData添加到onChange事件中,否则在onKeyDown事件中,texarea值将永远不会更改,因为您每次都将其重置为e.target.value。
试试这个: https://stackblitz.com/edit/note-taking-y5hwsb?file=containers/notelist.js