更改特定索引处的React State数组

时间:2017-10-09 17:52:21

标签: javascript arrays reactjs object setstate

正如标题所暗示的那样,我试图在我的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并在中途决定反对它。

状态和函数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;

1 个答案:

答案 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