在组件 ES6 之间反应 setState

Posted

技术标签:

【中文标题】在组件 ES6 之间反应 setState【英文标题】:React setState between components ES6 【发布时间】:2016-10-14 04:33:06 【问题描述】:

我有一个非常简单的应用程序,我正在尝试从子组件更新父组件的状态,如下所示:

import React from '../../../../../../../dependencies/node_modules/react';
import ReactDOM from '../../../../../../../dependencies/node_modules/react-dom';

class CalendarMain extends React.Component 
    constructor() 
        super();
    

    handleClick() 
        this.props.handleStateClick("State Changed");
    

    render() 
        return ( 
            <div>
                <div className="calendar">
                    this.props.checkIn
                    <button onClick= this.handleClick.bind(this) >Click Me</button>
                </div>
            </div>
        )
    


class CalendarApp extends React.Component 

    constructor() 
        super();

        this.state =  
            checkIn: "Check-in",
            checkOut: "Check-out",
            dateSelected: false 
        ;
    

    handleStateClick( newState ) 
        this.setState(
            checkIn: newState
        );
    

    render() 

        return (
            <div>
                <CalendarMain 
                    checkIn =  this.state.checkIn 
                    handleStateClick =  this.handleStateClick.bind(this) 
                />
            </div>
        );
    

我收到的错误是this.setState is not a function,我不知道为什么。任何帮助将不胜感激!

【问题讨论】:

确保您不会在其他地方意外地改变this.setState。即:this.setState = foo: 'bar' ; 只要注意到 ../../..... 确保相对路径保留在您的项目中,否则移动项目(上传到远程、在 github/npm 上发布等)可能会破坏这些路径。 您可能需要重新考虑您的项目层次结构 您导入 React 的方式非常……令人失望。 它实际上适用于最新版本的 React:jsfiddle.net/1uh9e8wx 【参考方案1】:

使用() =&gt; lambda 提供词法范围并在方法handleStateClick() 中绑定正确的 this 值:

handleStateClick = () => 
  this.setState(
    checkIn: newState
  );

【讨论】:

您可能想解释一下,这个功能是实验性的,并且要包含哪些 Babel 转换以使其工作。 假设 OP 已经在使用 ES6 类和导入,人们会假设他们已经具备了所有的必备环境设置 似乎有点牵强...你知道这是一个提议而不是 ES6 的一部分吗? 我认为它是这里提到的 ES6 的一部分:ecma-international.org/ecma-262/6.0/…。也许我遗漏了一些东西,你可以为我指出一些资源来解释你所解释的内容。如果您指的是使用转译器,我认为 OP 已经设置好了 您建议使用的语法似乎是 github.com/jeffmo/es-class-fields-and-static-properties 。这目前是第 1 阶段的提案,因此必须添加相应的插件或预设才能启用此功能。【参考方案2】:

this 在 ES6 样式语法中不是自动绑定的。

要么:

    在构造函数中绑定如下:this.func = this.func.bind(this) 对相关函数使用箭头函数语法,如下所示:func = () =&gt; ;

更多:https://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html#autobinding

【讨论】:

MDN documentation 关于箭头函数 (lambdas) 以获取更多参考 OP 似乎已经绑定了它:handleStateClick = this.handleStateClick.bind(this) .

以上是关于在组件 ES6 之间反应 setState的主要内容,如果未能解决你的问题,请参考以下文章

无法在反应组件中使用 setState

反应功能组件未从父组件更新 setState

卸载组件时对 setState 做出反应警告

有没有办法在反应中将 setState 导出到无状态组件之外?

如何解决反应原生 EventEmitterListener 警告

尝试在反应组件的返回中使用 setstate 更新状态并获得“最大更新深度超出错误”?