您有两个状态管理问题和一个执行流问题,其中一个(或可能多个)导致您提到的行为(但在任何情况下都需要修复):
-
State updates are asynchronous
. 这意味着
this.state
做
在事件发生后立即更新状态
this.setState
打电话。
-
因为状态更新是异步的,如果您是基于现有状态设置状态(您在一些地方,包括
switchLanguage
),你
必须
setState
-
当你这么做的时候
this.setState({/*...*/desc: this.convertCode(/*...*/)})
,你在打电话吗
convertCode
之前
打电话
,并将其返回值传递到
设置状态
作为对象上属性的值传递。因此,即使不是针对上面的问题2,它仍然有一个基本的控制流和问题
转换码
仍然会看到这本书即将过时
this.state.lang
.
转换码
有选择地接受
lang
使用(默认为
):
convertCode = (givenCode, lang = this.state.lang) => {
// ...use `lang`, not `this.state.lang`...
. 第一个是
componentDidMount
:
componentDidMount() {
this.setState({
isLoading: true
});
axios
.get("path to weather api")
.then(res => {
console.log(res.data.data[0]);
const { city_name, temp, weather } = res.data.data[0];
this.setState({
loc: city_name,
temp: temp,
code: weather.code,
isLoading: false
});
this.setState({
desc: this.convertCode(this.state.code) // <=== Error is here
});
});
}
this.state.code
this.state.lang
,所以我们需要使用回调窗体。相反,合并这两个调用并将lang传递给
:
this.setState(prevState => ({
loc: city_name,
temp: temp,
code: weather.code,
isLoading: false,
desc: this.convertCode(weather.code, prevState.lang),
}));
在
,问题2和问题3都存在:
// INCORRECT:
// A) Sets state based on state without callback
// B) Calls `convertCode` before `setState`
switchLanguage = () => {
if (this.state.lang === "en") {
this.setState({
lang: "hi",
desc: this.convertCode(this.state.code)
});
} else {
this.setState({
lang: "en",
desc: this.convertCode(this.state.code)
});
}
};
我们可以通过使用回调表单并将要使用的语言传递到
转换码
:
// Uses callback when setting state based on state
switchLanguage = () => {
this.setState(prevState => {
const lang = prevState.lang === "en" ? "hi": "en";
return {lang, desc: this.convertCode(prevState.code, lang)};
});
};
prevState
都是为了
朗
检查并通过
code
到
this.convertCode
.