ReactJs上下文-如何用传入的状态替换当前组件的状态

时间:2018-08-04 13:25:39

标签: javascript reactjs react-component react-context

我试图了解ReactJs上下文,并最终在显示状态名称和countNumber方面取得了一些进展。

但是我仍然在努力找出如何替换当前状态,该状态用于我的formatCount()函数中。

在下面的示例中,有人可以让我知道您将如何做吗?

我想在上下文中使用该数字,例如5在formatCount()方法中,所以它类似于

    formatCount() {
        const currentCount = {c.state.currentCount};
        return currentCount === 0 ? "Zero" : currentCount;
    }

enter image description here

这是我的上下文

import React, { Component } from "react";
export const CounterContext = React.createContext();

export default class CounterProvider extends Component {
    state = {
        state: { name: 'bob', currentCount: 5 },
    }
    render() {
        return (
            <CounterContext.Provider value={ this.state }>
                {this.props.children}
            </CounterContext.Provider>
        )
    }
}

这是我的计数器组件

import React, { Component } from "react";
import { RouteComponentProps } from "react-router";
import { CounterContext } from "../contexts/context.js";

export class Counter extends Component {
    state = { currentCount: 7 }

    render() {
        return <div className="m-2">
            <CounterContext.Consumer>
                {c =>
                    <div className="m-2">
                        <p>My name is {c.state.name} - {c.state.currentCount}</p>
                        <span className={this.getBadgeClasses()}>{this.formatCount()}</span>
                        <button className="btn btn btn-primary btn-sm m-2" onClick={() => { this.incrementCounter() }}>Increment</button>
                        <button className="btn btn-danger btn-sm m-2" onClick={() => { this.incrementCounter() }}>Delete</button>
                    </div>
                }
            </CounterContext.Consumer>
        </div>;
    }

    formatCount() {
        const currentCount = this.state.currentCount;
        return currentCount === 0 ? "Zero" : currentCount;
    }

    getBadgeClasses() {
        let classes = "badge m-2 badge-";
        classes += this.state.currentCount === 0 ? "warning" : "primary";
        return classes;
    }

    incrementCounter() {
        this.setState({
            currentCount: this.state.currentCount + 1
        });
    }
}

2 个答案:

答案 0 :(得分:0)

我不太确定您在此处使用CounterContext的情况,如果对您的问题有误读,对不起。

当您说“状态传递失败”时-您是在尝试更新状态并显示更新后的状态吗?

为此,您需要使用构造函数初始化状态:

constructor() {
    super();
    this.state = {
      currentCount: 7
    };
  };

然后您可以根据需要使用this.setState({})更新状态。

答案 1 :(得分:0)

第一步是将要调用的方法(更新状态的方法)移到CounterProvider类中。然后将方法传递给状态对象。完成之后,您现在可以将Counter类更新为类似的内容:

<CounterContext.Consumer>
   {(c, methodName) =>
     <div className="m-2">
         My name is {c.state.name}
         <button onClick={methodName}></button>
     </div>
   }
</CounterContext.Consumer>

请注意,为了简化操作,我使用了methodeName并删除了对CounterContext.Consumer组件的修改。

您可以了解有关Context API的更多信息:https://reactjs.org/docs/context.html