使用 setState 推入数组 - React Native
Push into arrays with setState - React Native
我是 React Native 的新手,我正在使用来自不同 url 的 api 开发一个项目。当我使用 url 的提取时,我想用 setState 设置我的状态,但是当我尝试它时,console.warn 显示我的数组是空的。我的代码有什么问题?感谢任何反馈:)
constructor() {
super();
this.state = {
location: [],
current: [],
condition: [],
cities: ["london", "paris", "hongkong", "buenos_aires"]
}
}
componentDidMount() {
let fetches = []
this.state.cities.forEach(
city => {
let resp = fetch('http://api.weatherapi.com/v1/current.json?key=10eb2b8701194b128b2122427211005&q=' + city + '&aqi=no').then(res => res.json());
fetches.push(resp)
}
)
Promise.all(fetches).then(jsonList => {
jsonList.forEach(
json => {
this.setState(state => {
const location = state.location.concat(json.location)
const current = state.current.concat(json.current)
const condition = state.condition.concat(json.condition)
return {
location,
current,
condition,
}
})
})
}).catch(function (error) {
console.error(error)
})
console.warn(this.state)
}
setState
不会立即更新状态——它会在下一次渲染时更新。假设您实际上是从 API 获取数据,您的 console.warn
显示的是当前渲染的状态。
您可以使用回调函数(setState
的第二个参数)查看设置后的值。
您也可以使用数组传播一次性完成所有更新。
Promise.all(fetches).then(jsonList => {
this.setState(state => {
return {
location: [...state.location, ...jsonList.map(i => i.location)],
current: [...current, ...jsonList.map(i => i.current)],
condition: [...state.condition, ...jsonList.map(i => i.condition)],
}
},() => {
console.log(this.state);
});
})
我是 React Native 的新手,我正在使用来自不同 url 的 api 开发一个项目。当我使用 url 的提取时,我想用 setState 设置我的状态,但是当我尝试它时,console.warn 显示我的数组是空的。我的代码有什么问题?感谢任何反馈:)
constructor() {
super();
this.state = {
location: [],
current: [],
condition: [],
cities: ["london", "paris", "hongkong", "buenos_aires"]
}
}
componentDidMount() {
let fetches = []
this.state.cities.forEach(
city => {
let resp = fetch('http://api.weatherapi.com/v1/current.json?key=10eb2b8701194b128b2122427211005&q=' + city + '&aqi=no').then(res => res.json());
fetches.push(resp)
}
)
Promise.all(fetches).then(jsonList => {
jsonList.forEach(
json => {
this.setState(state => {
const location = state.location.concat(json.location)
const current = state.current.concat(json.current)
const condition = state.condition.concat(json.condition)
return {
location,
current,
condition,
}
})
})
}).catch(function (error) {
console.error(error)
})
console.warn(this.state)
}
setState
不会立即更新状态——它会在下一次渲染时更新。假设您实际上是从 API 获取数据,您的 console.warn
显示的是当前渲染的状态。
您可以使用回调函数(setState
的第二个参数)查看设置后的值。
您也可以使用数组传播一次性完成所有更新。
Promise.all(fetches).then(jsonList => {
this.setState(state => {
return {
location: [...state.location, ...jsonList.map(i => i.location)],
current: [...current, ...jsonList.map(i => i.current)],
condition: [...state.condition, ...jsonList.map(i => i.condition)],
}
},() => {
console.log(this.state);
});
})