【问题标题】:React button radio this.setState is not a function反应按钮单选 this.setState 不是函数
【发布时间】:2019-05-01 15:24:28
【问题描述】:

我有 2 个组件,一个父组件来管理状态和许多其他事情,还有一个带有一些 reactstrap 按钮单选的子组件,我正在尝试更改子按钮上的 onClick 状态,但出现错误:this. setState 不是一个函数,我无法弄清楚我的代码有什么问题 =>

//Parent
import React, { Component } from 'react';
import BtnRadio from './btnToggle';


class parent extends Component {

    state = {
        rSelected: true,
    }

    onRadioBtnClick(rSelected) {
        this.setState({ 
            rSelected:rSelected 
        });
    }

    render(){
        return (

            <div>
                <BtnToggle onRadioBtnClick={this.onRadioBtnClick} active={this.state.rSelected}/>
            </div>

        );
    }
};

export default AddAdmin;

//Chlid

import React from 'react';
import { Button, ButtonGroup } from 'reactstrap';

const BtnRadio = (props) => {

    return (
        <ButtonGroup>
            <Button color="light" onClick={() => props.onRadioBtnClick(true)} active={props.active === true}>Enable</Button>
            <Button color="light" onClick={() => props.onRadioBtnClick(false)} active={props.active === false}>Disabled</Button>
        </ButtonGroup>     
    );
};

export default BtnRadio;

有没有人可以指出我正确的方向,我猜我忘了绑定一些东西......

【问题讨论】:

    标签: javascript reactjs binding reactstrap


    【解决方案1】:

    问题是,当您使用非匿名函数时,this 会被覆盖,并且不会再引用该组件。由于您已经在使用 class properties,因此简单的解决方法是继续使用箭头函数,以保持 this 引用组件:

    onRadioBtnClick = (rSelected) => {
        this.setState({ 
            rSelected:rSelected 
        });
    }
    

    参见this medium article 中的#5,它解释了绑定this 以保持它引用组件的不同方式。

    【讨论】:

      【解决方案2】:
        <BtnToggle onRadioBtnClick={() => this.onRadioBtnClick()} active={this.state.rSelected}/>
      

      用于救援的箭头函数。

      【讨论】:

      • OP 已经在使用类属性(参见他的状态),因此没有理由不继续使用类属性,以避免将匿名函数附加到每个组件的性能下降。请参阅this article 了解更多信息。
      【解决方案3】:

      你应该像这样绑定你传递的函数:

      class parent extends Component {
      
          state = {
              rSelected: true,
          }
      
          onRadioBtnClick(rSelected) {
              this.setState({ 
                  rSelected:rSelected 
              });
          }
      
          render(){
              return (
      
                  <div>
                      <BtnToggle onRadioBtnClick={this.onRadioBtnClick.bind(this)} active={this.state.rSelected}/>
                  </div>
      
              );
          }
      }
      

      或者,您可以在将函数传递给构造函数之前绑定函数:

      class parent extends Component {
      
          state = {
              rSelected: true,
          }
      
          constructor() {
              super()
      
              this.onRadioBtnClick = this.onRadioBtnClick.bind(this)
          }
      
          onRadioBtnClick(rSelected) {
              this.setState({ 
                  rSelected:rSelected 
              });
          }
      
          render(){
              return (
      
                  <div>
                      <BtnToggle onRadioBtnClick={this.onRadioBtnClick} active={this.state.rSelected}/>
                  </div>
      
              );
          }
      }
      

      【讨论】:

      • @ŁukaszBlaszyński 仅供参考:你的意思是它甚至还没有在 ES 中,它是提案。不知道为什么这个答案会被否决。虽然箭头函数更优雅,但这个答案“更正确一点”。
      • @Solo 主要原因是,OP 已经证明他已经在使用类属性。没有理由向该组件添加构造函数(因此使事情变得复杂,尤其是在将道具传递给该组件时。)
      • @FrankerZ 很抱歉,您能否链接到一些文档或详细说明?我不明白它如何使事情复杂化。谢谢!
      • @Smarticles101 并不复杂,只是更烦人且更容易忘记。但你不应该得到这些反对票。
      • @Solo 好的,所以这只是个人喜好问题,谢谢
      猜你喜欢
      • 2015-08-06
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 2017-09-11
      相关资源
      最近更新 更多