Javascript 使用React而不使用Redux切换语言
我正在尝试在React中创建天气应用程序。我想使用Javascript 使用React而不使用Redux切换语言,javascript,reactjs,weather-api,Javascript,Reactjs,Weather Api,我正在尝试在React中创建天气应用程序。我想使用onClick切换应用程序语言 这是到目前为止我的代码 import React, { Component } from "react"; import axios from "axios"; import "./App.css"; class App extends Component { componentDidMount() { this.setState({ isLoading: true });
onClick
切换应用程序语言
这是到目前为止我的代码
import React, { Component } from "react";
import axios from "axios";
import "./App.css";
class App extends Component {
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)
});
});
}
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)
});
}
};
convertCode = givenCode => {
if (this.state.lang === "en") {
if (
givenCode === 200 ||
givenCode === 201 ||
givenCode === 202 ||
givenCode === 230 ||
givenCode === 231 ||
givenCode === 232 ||
givenCode === 233 ||
givenCode === "200" ||
givenCode === "201" ||
givenCode === "202" ||
givenCode === "230" ||
givenCode === "231" ||
givenCode === "232" ||
givenCode === "233"
) {
return "Thunderstorms";
} else if (
givenCode === 300 ||
givenCode === 301 ||
givenCode === 302 ||
givenCode === "300" ||
givenCode === "301" ||
givenCode === "302"
) {
return "Drizzle";
}
..............
..............
IF CONDITION FOR THE OTHER LANGUAGE
};
render() {
if (!this.state.isLoading) {
return (
<div className="App">
<div className="container">
<div className="languageSwitcher">
<i className="fa fa-language" onClick={this.switchLanguage} />
</div>
<div className="location">
<i className="fa fa-location-arrow" /> {this.state.loc}
</div>
{this.state.lang === "en" && (
<div className="temperature">It's {this.state.temp} degrees.</div>
)}
{this.state.lang === "hi" && (
<div className="temperature">
तापमान {this.state.temp} डिग्री है।
</div>
)}
<div className="description">{this.state.desc}</div>
</div>
</div>
);
} else {
return <div className="loading">Fetching weather data...</div>;
}
}
}
export default App;
import React,{Component}来自“React”;
从“axios”导入axios;
导入“/App.css”;
类应用程序扩展组件{
componentDidMount(){
这是我的国家({
孤岛加载:正确
});
axios
.get(“天气api路径”)
。然后(res=>{
console.log(res.data.data[0]);
const{city_name,temp,weather}=res.data.data[0];
这是我的国家({
地点:城市名称,
临时工:临时工,
代码:weather.code,
孤岛加载:false
});
这是我的国家({
desc:this.convertCode(this.state.code)
});
});
}
switchLanguage=()=>{
如果(this.state.lang==“en”){
这是我的国家({
朗:“你好”,
desc:this.convertCode(this.state.code)
});
}否则{
这是我的国家({
朗:“嗯,
desc:this.convertCode(this.state.code)
});
}
};
convertCode=givenCode=>{
如果(this.state.lang==“en”){
如果(
给定代码===200||
给定代码===201||
给定代码===202||
给定代码===230||
给定代码===231||
给定代码===232||
给定代码===233||
给定代码==“200”||
givenCode==“201”||
给定代码==“202”||
givenCode==“230”||
givenCode==“231”||
给定代码==“232”||
givenCode==“233”
) {
返回“雷雨”;
}否则如果(
给定代码===300||
给定代码===301||
给定代码===302||
givenCode==“300”||
givenCode==“301”||
givenCode==“302”
) {
返回“毛毛雨”;
}
..............
..............
另一种语言的IF条件
};
render(){
如果(!this.state.isLoading){
返回(
{this.state.loc}
{this.state.lang==“en”&&(
这是{this.state.temp}度。
)}
{this.state.lang==“hi”&&(
तापमान {this.state.temp}डिग्री है।
)}
{this.state.desc}
);
}否则{
返回获取天气数据。。。;
}
}
}
导出默认应用程序;
除了带有className=“desc”
的div
总是落后一个阶段之外,其他一切都正常工作。我的意思是当state.lang
为en
时,它会在hi
中显示文本,反之亦然
我刚开始学习React,所以代码很混乱。很抱歉
谢谢。您有两个状态管理问题和一个执行流问题,其中一个(或可能更多)导致您提到的行为(但在任何情况下都需要修复):
This.state
在调用This.setState
后,不会立即具有更新的状态switchLanguage
),则必须使用回调传递到的setState
版本,而不是对象传递到的版本;在回调中,使用回调接收到的最新状态对象作为参数this.setState({/*…*/desc:this.convertCode(/*…*/)})时
,在调用setState
之前调用convertCode
,并将其返回值作为传递对象上属性的值传递到setState
。因此,即使它不是上面的问题2,它仍然会有一个基本的控制流问题,convertCode
我看到这个.state.lang即将过时this.state.lang
convertCode
以选择性地接受要使用的lang
(默认为this.state.lang
):
…然后解决设置状态和使用convertCode
的各种问题。第一个是在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
});
});
}
在switchLanguage
中,问题2和问题3都存在:
我们可以通过使用回调表单并将要使用的语言传递到convertCode
中来解决这两个问题:
this.setState(prevState => ({
loc: city_name,
temp: temp,
code: weather.code,
isLoading: false,
desc: this.convertCode(weather.code, prevState.lang),
}));
// 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
用于lang
检查和将code
传递给此方法。convertCode
如果在convertCode
方法中使用以前的lang状态,则可以将新的lang传递给它:
convertCode = (givenCode, lang) => {
if (lang === "en") {
...
然后在您的switchLanguage
方法中:
this.setState({
lang: "hi",
desc: this.convertCode(this.state.code, "hi")
});
编辑:首选setState的功能版本,以避免在此.state.code
更新时出现不一致:
this.setState(prevState => ({
lang: "hi",
desc: this.convertCode(prevState.code, "hi")
}));
你的意思是你需要点击
onClick
两次它才能工作?@KuchBhi我想他的意思是如果语言是印地语,那么描述就用英语,而如果语言是英语,那么描述就用印地语。看看这是否有帮助:是的@SivcanSingh是对的。应用程序默认加载en
。所以当我onClick
有一次,语言应该改为hi
,除了desc
之外的所有元素都会这样。如果hi
一切都变成hi
,但是desc
变成en
。如果不清楚,我很抱歉。@sequel检查这篇文章:我认为我们可以相信这个的值。state.code
在这种情况下,因为它无法通过语言开关批量更新。我同意,但我不认为每个人都必须盲目遵守这一规则,因为它可以防止批量
this.setState({
lang: "hi",
desc: this.convertCode(this.state.code, "hi")
});
this.setState(prevState => ({
lang: "hi",
desc: this.convertCode(prevState.code, "hi")
}));