在特定索引处更改 React 状态数组
Changing React State Array at Specific Index
如标题所示,我正在尝试将我的 state object
中的一个数组作为目标,但如果您曾经尝试过,您可能会猜到。这并不像听起来那么简单。我在这里查看了几个问题 ( and ),但都没有解决我的问题。
我需要的是针对 noteData
数组中的特定索引,并根据用户在 <TextArea />
组件中输入的内容更新它。不完全确定为什么,但我的 noteData
数组只是读取为带有空字符串 noteData = ['']
.
的数组
如果您需要更多 in-depth 外观,可以转至 https://stackblitz.com/edit/note-taking 并分叉该页面并自行编辑。文件结构至少可以说是愚蠢的。开始用redux,中途决定不用。
TextArea 的状态和功能
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)}
/>
实际的 TextArea 组件
import React from 'react';
const TextArea = props => {
return (
<div className='textarea'>
<textarea
value={props.value}
onKeyDown={props.handleNoteData}
/>
</div>
);
}
export default TextArea;
你的代码有错误,因为 textarea 不是正确的组件,它应该是 TextArea 而不是 textarea,它是一个 html 元素,你首先必须先将它导入 notelist.js, 这就是为什么没有设置 onKeyDown 属性的原因。
<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
如标题所示,我正在尝试将我的 state object
中的一个数组作为目标,但如果您曾经尝试过,您可能会猜到。这并不像听起来那么简单。我在这里查看了几个问题 (
我需要的是针对 noteData
数组中的特定索引,并根据用户在 <TextArea />
组件中输入的内容更新它。不完全确定为什么,但我的 noteData
数组只是读取为带有空字符串 noteData = ['']
.
如果您需要更多 in-depth 外观,可以转至 https://stackblitz.com/edit/note-taking 并分叉该页面并自行编辑。文件结构至少可以说是愚蠢的。开始用redux,中途决定不用。
TextArea 的状态和功能
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)}
/>
实际的 TextArea 组件
import React from 'react';
const TextArea = props => {
return (
<div className='textarea'>
<textarea
value={props.value}
onKeyDown={props.handleNoteData}
/>
</div>
);
}
export default TextArea;
你的代码有错误,因为 textarea 不是正确的组件,它应该是 TextArea 而不是 textarea,它是一个 html 元素,你首先必须先将它导入 notelist.js, 这就是为什么没有设置 onKeyDown 属性的原因。
<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