代码之家  ›  专栏  ›  技术社区  ›  xoomer

ReactJS:这个。setState不是函数吗?

  •  0
  • xoomer  · 技术社区  · 8 年前

    我是ReactJS的新手,遇到一个错误“this.setState不是函数”。

    constructor() {
        super();
    
        this.state = {
            visible: false,
            navLinesShow: true
        };
    
        this.navOpen = this.navOpen.bind(this)
    
    }
    
    navOpen() {
        this.setState({
            navStatus: "navShow",
            navLinesShow: false
        });
    
        if ( this.state.visible === false) {
    
            setTimeout(function (){
    
                this.setState({
                    visible: true
                 });
    
            }, 3000);
    
        }
    

    可能的解决方案是什么?

    非常感谢。

    3 回复  |  直到 8 年前
        1
  •  6
  •   pinturic    8 年前

    是的,问题是setTimeout函数中的setTimeout“this”指的是函数本身:所以解决方案是典型的 var that = this :

    navOpen() {
    this.setState({
        navStatus: "navShow",
        navLinesShow: false
    });
    if ( this.state.visible === false) {
     var that = this;
        setTimeout(function (){
            that.setState({
                visible: true
             });
        }, 3000);
    }
    
        2
  •  3
  •   Aditya Singh    8 年前

    这是因为 this 由于运行时绑定,没有正确的值。您需要使用词法绑定。最好的解决方案是使用 ES6 箭头功能 () => {} 提供此值的词法绑定。即使有 setTimeout() 它的词法绑定将修复您得到的错误

    constructor() {
        super();
    
        this.state = {
            visible: false,
            navLinesShow: true
        };
    }
    
    navOpen = () => {
        this.setState({
            navStatus: "navShow",
            navLinesShow: false
        });
    
        if ( this.state.visible === false) {
            setTimeout(() => {
                this.setState({
                    visible: true
                 });
            }, 3000);
        }
    }
    
        3
  •  2
  •   sma    8 年前

    除了@pinturi的解决方案外,另一个解决方案是使用ES6箭头函数。如果您正在使用ES6/Babel等,可以使用箭头函数绑定词汇 this .

    navOpen() {
        this.setState({
            navStatus: "navShow",
            navLinesShow: false
        });
        if (!this.state.visible) {
            setTimeout(() => this.setState({visible: true}), 3000);
        }
    }