React组件Axios请求后setState不更新,无法重新渲染求助
解决React组件PUT请求后状态不更新的问题
我看了你的代码,问题主要出在异步请求的执行顺序和一个不必要的手动渲染调用上,咱们一步步来修复:
1. 异步请求顺序错误,导致GET拿到旧数据
你当前的editCategory方法里,axios.put和axios.get是并行发起的——PUT请求还没完成(后端还没把修改保存到数据库),GET请求就已经发出去了,自然拿到的还是旧数据。
要解决这个,得把GET请求放到PUT的then回调里,确保PUT完成后再去获取最新的分类数据:
editCategory = (name, description, id) => { const category = { name, description} // 先等待PUT请求完成,再发起GET axios.put(`/api/menus/${this.props.menuId}/categories/${id}`, { category }) .then(() => { // PUT成功后,再获取最新数据 return axios.get(`/api/menus/${this.props.menuId}/categories`) }) .then(res => { this.setState({ categories: res.data }, () => console.log(this.state.categories)) }) .catch(err => { // 别忘了处理错误哦 console.error('更新或获取分类失败:', err) }) }
甚至更高效的方式:如果你的Rails后端在PUT请求成功后会返回更新后的分类数据,那你可以直接用这个返回值更新state,不用再发一次GET请求,能少一次网络请求:
editCategory = (name, description, id) => { const category = { name, description} axios.put(`/api/menus/${this.props.menuId}/categories/${id}`, { category }) .then(res => { // 用返回的更新后的数据,替换state里对应的分类 const updatedCategories = this.state.categories.map(cat => cat.id === id ? res.data : cat ) this.setState({ categories: updatedCategories }) }) .catch(err => { console.error('更新分类失败:', err) }) }
2. 移除componentDidUpdate里的this.render()
React会在setState之后自动触发重新渲染,你手动调用this.render()不仅完全没必要,还会导致无限循环——因为componentDidUpdate会在每次渲染后调用,你在里面调用render又会触发更新,恶性循环。直接删掉这部分代码:
// 删掉这个无用且有害的方法! // componentDidUpdate() { // this.render() // }
3. 修正render方法的语法错误
你提供的render方法里有语法问题:return this.state.categories.map(...)外面多了个return,而且没有正确闭合,修正后的render应该是这样的:
render () { return ( <Segment> <div> {this.state.categories.map(c => { return ( <ul key={c.id}> <h3>Category Name: {c.name}</h3> </ul> ) })} </div> </Segment> ) }
做完这些修改后,当你编辑分类时,PUT请求完成后会拿到最新的数据更新state,React会自动重新渲染组件,你就能看到修改后的分类内容了。
内容的提问来源于stack exchange,提问作者Coltvant
相关产品推荐
相关产品推荐

