【问题标题】:Cannot read property 'setState' of undefined, when running a function运行函数时无法读取未定义的属性“setState”
【发布时间】:2019-03-04 13:33:26
【问题描述】:
class App extends Component {
  constructor(){
    super();
    this.state = {
      sideNav: '',
      language: 'en'
    }
  }

  langEn() {
    this.setState({language: 'en'}).bind(this);
    console.log("Language changed to en");
  }

  langEs() {
    this.setState({language: 'es'}).bind(this);
    console.log("Language changed to es");
  }

  render() {

    const mouseEnter = e => {
      this.setState({sideNav: "sideNav sidenav---sidenav---_2tBP sidenav---expanded---1KdUL"});
    }    

    const mouseLeave = e => {
      this.setState({sideNav: "sidenav---sidenav---_2tBP sidenav---collapsed---LQDEv"});
    }


    return (
      <div className="App container">
        <div>
          <SideNav 
            onMouseEnter={mouseEnter} 
            onMouseLeave={mouseLeave}
            className={this.state.sideNav}
            onSelect={(selected) => {
                // Add your code here
            }}
          >
            <SideNav.Nav  defaultSelected="home">
                <NavItem eventKey="home">
                    <NavIcon>
                        <Link to="/"><img src={Dash}/></Link>
                    </NavIcon>
                    <NavText>
                        <Link to="/">Dashboard</Link>
                    </NavText>
                </NavItem>
                <NavItem eventKey="sites">
                    <NavIcon>
                      <Link to="/sites"><img src={Site} /></Link>
                    </NavIcon>
                    <NavText>
                        <Link to="/sites">Sites</Link>
                    </NavText>
                </NavItem>
                <NavItem eventKey="tours">
                  <NavIcon>
                    <Link to="/tours"><img src={Tour}/></Link>
                  </NavIcon>
                  <NavText>
                      <Link to="/tours">Tours</Link>
                  </NavText>
                </NavItem>
                <NavItem eventKey="media">
                    <NavIcon>
                      <Link to="/media"><img src={Media}/> </Link>
                    </NavIcon>
                    <NavText>
                        <Link to="/media">Media</Link>
                    </NavText>
                </NavItem>
                <NavItem eventKey="newSite">
                    <NavIcon>
                        <Link to="/newSite/details"><img src={NewSite} /></Link>
                    </NavIcon>
                    <NavText>
                        <Link to="/newSite/details">Add new Site</Link>
                    </NavText>
                </NavItem>
                <NavItem eventKey="language">
                    <NavIcon>
                        <Link to="/language"><img src={Lang} /></Link>
                    </NavIcon>
                    <NavText>
                        <Link to="/language">Language</Link>
                    </NavText>
                </NavItem>
                <NavItem eventKey="profile">
                    <NavIcon>
                        <Link to="/profile"><img src={Profile} /></Link>
                    </NavIcon>
                    <NavText>
                        <Link to="/profile">Profile</Link>
                    </NavText>
                </NavItem>

            </SideNav.Nav>
            <button onClick={this.langEn}>EN</button>
            <button onClick={this.langEs}>ES</button>
          </SideNav>
        </div>
        <Routes childProps={this.state} />
      </div>
    );
  }
}

export default App;

当我按下两个按钮之一来运行 lanEn 或 lanEs 功能时,会发生错误。我尝试过交替它们的位置,将它们放入或移出render() 方法,使用绑定删除this。最终目标是使用这些按钮更改语言状态并使用道具将其转移到不同的页面

【问题讨论】:

标签: reactjs


【解决方案1】:

你只需要在构造函数中添加这段代码:

this.langEn = this.langEn.bind(this);

上面的代码所做的是,它将现有的langEn 函数替换为一个新函数,并将this 上下文更改为class App

如果你不想在构造函数中手动绑定它,你可以使用箭头函数,它具有词法绑定。

【讨论】:

  • 它现在可以工作,但我有办法将this.state.language 作为道具发送到我的路线,但是当我按下按钮更新状态时,它也不会更新路线
  • @TiernO 在您当前的示例中,设置语言状态的代码被硬编码为始终将 en 作为值:this.setState({language: 'en'}).bind(this);。每当状态更改时,它将重置为相同的值。这就是原因,它也没有在 prop 中更新。
  • 哦,我明白了,那我该如何解决呢?
  • @TiernO 同样,setState 不返回任何内容。因此,使用this.setState({language: 'en'}).bind(this); 之类的绑定语句可能会导致异常,因为您正在尝试绑定未定义的内容。你只需要this.setState({language: 'en'}) 来设置状态。
  • 是的,我已经从 setState 调用中删除了 bind()
【解决方案2】:

只需简单地在构造函数中绑定方法:

class App extends Component {
  constructor(){
    super();
    this.state = {
      sideNav: '',
      language: 'en'
    }
    this.langEn.bind(this);
    this.langEs.bind(this);
  }

  langEn() {
    this.setState({language: 'en'}).bind(this);
    console.log("Language changed to en");
  }

  langEs() {
    this.setState({language: 'es'}).bind(this);
    console.log("Language changed to es");
  }

  render() {

    const mouseEnter = e => {
      this.setState({sideNav: "sideNav sidenav---sidenav---_2tBP sidenav---expanded---1KdUL"});
    }    

    const mouseLeave = e => {
      this.setState({sideNav: "sidenav---sidenav---_2tBP sidenav---collapsed---LQDEv"});
    }


    return (
      <div className="App container">
...
      <button onClick={this.langEn}>EN</button>
      <button onClick={this.langEs}>ES</button>
...

【讨论】:

    【解决方案3】:

    首先,您尝试将this.setState 绑定到langEnlangEn。为什么?

    其次,所有这些事情的发生都是因为函数有自己的上下文。

    方法调用是否使用bind:

    ...
    <button onClick={this.langEn.bind(this)}>EN</button>
    ...
    

    或使用箭头键功能(它们没有自己的上下文):

    langEn = () => {
      this.setState({language: 'es'}, () => console.log("Language changed to es"));
    }
    

    【讨论】:

    • 当我使用绑定时,我收到一条错误消息“无法读取未定义的属性“绑定””
    • @TiernO 你不应该绑定 this.setState,而是绑定函数调用(例如,langEn)。看上面的代码。
    • 你得到错误是因为你试图绑定当前函数上下文的未定义方法setState
    猜你喜欢
    • 1970-01-01
    • 2020-03-05
    • 2021-12-09
    • 1970-01-01
    • 2019-04-09
    • 2019-12-30
    • 2017-05-30
    • 2018-12-16
    • 2018-12-05
    相关资源
    最近更新 更多