我试图了解ReactJs上下文,并最终在显示状态名称和countNumber方面取得了一些进展。
但是我仍然在努力找出如何替换当前状态,该状态用于我的formatCount()函数中。
在下面的示例中,有人可以让我知道您将如何做吗?
我想在上下文中使用该数字,例如5在formatCount()方法中,所以它类似于
formatCount() {
const currentCount = {c.state.currentCount};
return currentCount === 0 ? "Zero" : currentCount;
}
这是我的上下文
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
});
}
}
答案 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