react - 无法读取未定义的属性“调用”

IT技术 javascript reactjs
2021-04-03 07:25:53

除了添加新笔记外,一切似乎都适用于这个小应用程序。按钮位于 Board 组件上。

我知道这个问题通常是由于没有正确绑定“this”的值造成的。我不确定这是这里的问题还是我遗漏了其他东西。谢谢

演示:http : //jsbin.com/pewahi/edit?js,output

/* jshint asi:true */

class Note extends React.Component {
  constructor(props) {
    super(props)
    this.state = { editing: props.editing }
  }

  render() {
    if (this.state.editing) {
      return this.renderForm()
    } else {
      return this.renderDisplay()
    }
  }

  edit() {
    this.setState({editing: true})
  }

  save() {
    this.props.changeHandler(this.refs.newText.getDOMNode().value, this.props.index)
    this.setState({editing: false})
  }

  remove() {
    this.props.removeHandler(this.props.index)
  }

  renderDisplay() {
     return (      
      <div className="note">
        <p>{this.props.children}</p>
        <span>
          <button className="btn btn-sm glyphicon glyphicon-pencil" onClick={this.edit.bind(this)}></button>
          <button className="btn btn-sm glyphicon glyphicon-trash" onClick={this.remove.bind(this)}></button>
        </span>
      </div>   
    )    
  }

  renderForm() {
    return (
      <div className="note">
        <textarea ref="newText" defaultValue={this.props.children} className="form-control"></textarea>
        <button onClick={this.save.bind(this)} className="btn btn-success btn-sm"><span className="glyphicon glyphicon-floppy-disk"></span> Save</button>
      </div>
    )
  }
}

Note.propTypes = { 
  editing: React.PropTypes.bool,
  onChange: React.PropTypes.func,
  onRemove: React.PropTypes.func
}

Note.defaultProps = { editing: false }

class Board extends React.Component {
  constructor(props) {
    super(props)
    this.state = { 
      notes: [{note: 'hi', id: this.nextId()}]
    }
  }

  update(newText, i) {
    var arr = this.state.notes
    arr[i].note = newText
    this.setState({notes: arr})
  }

  remove(i) {
    var arr = this.state.notes
    arr.splice(i, 1)
    this.setState({notes: arr})
  }

  addNote(text) {
    var arr = this.state.notes
    arr.push({
      id: this.nextId(),
      note: text
    })
    console.log(arr)
    this.setState({notes: arr})
  }

  nextId() {
    this.uniqueId = this.uniqueId || 0
    return ++this.uniqueId
  }


  eachNote(note, i) {
    return (
      <Note key={note.id}
            index={i}
            changeHandler={this.update.bind(this)}
            removeHandler={this.remove.bind(this)}

        >{note.note}
      </Note>
    )
  }

  render() {
    return (
      <div className="board">
        {this.state.notes.map(this.eachNote, this)}
        <button onClick={this.addNote.bind(this, "new note")} className="btn btn-success btn-sm glyphicon glyphicon-plus"></button>
      </div>
    )
  }
}

React.render(
  <Board />,
  document.getElementById('message-board')
)
3个回答

你的代码没问题。这可能是 JSBin 的一个错误,以及它如何处理 Babel 的转译。如果您将编译指示添加// noprotect到代码的顶部,您将看到它有效。

没问题!当我们使用的工具不适合我们时,它总是令人沮丧。你应该考虑向 jsbin 的 github repo 提交一个问题,引用这个问题。谢谢!
2021-06-08 07:25:53
卢克你就是那个人。如果我有更多代表,我将能够为您的答案投票。谢谢!
2021-06-16 07:25:53

我面临同样的错误。我正在使用一个基本组件,我注意到我已经删除componentDidMount了基本组件的方法。当我调用super.componentDidMount子组件时,它给出了错误。所以我删除了超级电话并解决了问题。

结合这与一些麻烦的ES6类中React一种方法是像这样将它们绑定到构造函数中;

constructor(props) {
    super(props)
    this.nextid = this.nextid.bind(this)
    this.state = { 
        notes: [{note: 'hi', id: this.nextId()}]
    }
}

另一个是使用babel.configure({stage: 0})和箭头函数。

nextid = () => {}
感谢 Janaka 的回应。不幸的是,这似乎无法解决问题。我仍然收到此错误TypeError: Cannot read property 'call' of undefined似乎我可以使用 setState() 修改单个笔记 (Board update()) 并从状态中删除笔记 (Board remove()),但是,当我尝试将新笔记项添加到它中断的状态时。
2021-06-14 07:25:53