我有一个react组件的以下代码。

import React, { Component } from 'react';
import CalcButton from './CalcButton';
import Operand from './Operand';
import '../custom.css';

class App extends Component {

  constructor(props) {
    super(props);
    this.state = {
      prevVal: '',
      currentVal: ''
    }
  }

  handleOpClick(event) {
    console.log('------------event------', event.target.value);
    console.log(this.state.currentVal);
    this.setState({
      currentVal: 'test'
    })
  }

  render() {

    const firstRow = ["7", "8", "9"];
    const secRow = ["4", "5", "6"];
    const thirdRow = ["1", "2", "3",];
    return (
      <div className="container">
        <div className="app">
          <div className="inpCont">
            <input
            type="text"
            className="inpBox"
            value={this.state.currentVal}
            />
          </div>
          <div className="btnCont">
            <div className="btnRow">
            {
              firstRow.map((row, index) => {
                return <CalcButton
                  handleClick={(event) => {
                    this.setState({
                      currentVal: this.state.currentVal + event.target.value
                    });
                  }}
                  key={index}
                  number={row} />;
              })
            }
            <Operand
              handleOpClick={this.handleOpClick}
              operator="/" />
            </div>
            <div className="btnRow">
            {
              secRow.map((row, index) => {
                return <CalcButton
                  handleClick={(event) => {
                    this.setState({
                      currentVal: this.state.currentVal + event.target.value
                    });
                  }}
                  key={index}
                  number={row}/>;
              })
            }
            <Operand
              handleOpClick={this.handleOpClick}
              operator="*" />
            </div>
            <div className="btnRow">
            {
              thirdRow.map((row, index) => {
                return <CalcButton
                  handleClick={(event) => {
                    this.setState({
                      currentVal: this.state.currentVal + event.target.value
                    });
                  }}
                  key={index}
                  number={row} />;
              })
            }
            <Operand
              handleOpClick={this.handleOpClick}
              operator="+" />
            </div>
            <div className="btnRow">
            <Operand
              handleOpClick={this.handleOpClick}
              operator="Clear" />
            <Operand
              handleOpClick={this.handleOpClick}
              operator="=" />
            </div>
          </div>
        </div>
      </div>
    )
  }
}

export default App;


当我尝试访问该类的handleOpClick方法内的状态时,它将引发以下错误。

App.jsx:18 Uncaught TypeError: Cannot read property 'state' of null
    at handleOpClick (http://localhost:3000/static/js/bundle.js:32849:24)
    at Object.ReactErrorUtils.invokeGuardedCallback (http://localhost:3000/static/js/bundle.js:17144:17)
    at executeDispatch (http://localhost:3000/static/js/bundle.js:16927:22)
    at Object.executeDispatchesInOrder (http://localhost:3000/static/js/bundle.js:16950:6)
    at executeDispatchesAndRelease (http://localhost:3000/static/js/bundle.js:16338:23)
    at executeDispatchesAndReleaseTopLevel (http://localhost:3000/static/js/bundle.js:16349:11)
    at Array.forEach (native)
    at forEachAccumulated (http://localhost:3000/static/js/bundle.js:17247:10)
    at Object.processEventQueue (http://localhost:3000/static/js/bundle.js:16552:8)
    at runEventQueueInBatch (http://localhost:3000/static/js/bundle.js:24174:19)


如何访问组件类方法中的状态。我想编写通用逻辑来处理操作员单击。我要去哪里错了?

谢谢

最佳答案

使用ES5时,可以如上所述使用handleOpClick={this.handleOpClick}。但是在ES6中,您应该将上下文绑定到当前类,并且可以使用以下三种方式之一进行操作。


您可以将所有handleOpClick={this.handleOpClick}更改为handleOpClick={this.handleOpClick.bind(this)}
或者,将所有handleOpClick={this.handleOpClick}更改为箭头功能,作为handleOpClick={evt => this.handleOpClick(evt)}
或者,保留所有handleOpClick={this.handleOpClick},但将原始方法handleOpClick更改为Panther提到的箭头功能。


喜欢,

 handleOpClick = (event) => {
    console.log('------------event------', event.target.value);
    console.log(this.state.currentVal);
    this.setState({
      currentVal: 'test'
    })
  }

08-08 09:25