javascript - 在 Axios 调用后设置状态后无法让 React 组件更新

标签 javascript ruby-on-rails reactjs axios

我有一个应该显示某些类别的 React 组件。我正在努力允许用户编辑类别。我显示一个表单,然后在 editCategory 中返回结果。然后,我正在对 Rails 后端进行 Axios 调用。 PUT 请求成功,但是当我尝试设置状态时,它仍在使用 PUT 请求之前的类别数据。所以 State 没有更新。

我已经尝试在 PUT 请求之后执行 GET 请求,然后尝试在 GET 结果之后设置状态,但它仍然只是提取 PUT 请求之前的状态。尽管如果我刷新,我的更改就在那里。所以后端正在运行。

class Categories extends React.Component { 
 state = { categories: [], toggleEditCat: false,  }

  componentDidMount() {
   axios.get(`/api/menus/${this.props.menuId}/categories`)
     .then( res => {
     this.setState({ categories:res.data })
    })
  }

componentDidUpdate() {
  this.render()
}

editCategory = (name, description, id) => {
 const category = { name, description}
 axios.put(`/api/menus/${this.props.menuId}/categories/${id}`, { 
 category })

 axios.get(`/api/menus/${this.props.menuId}/categories`)
  .then(res => {
   this.setState({ categories: res.data }, () => 
   console.log(this.state.categories))
 })
}  

}

render () {
 return (
  <Segment>
    <div>
      return this.state.categories.map(c => {
      return (
       <ul key={c.id}>
        <h3>Category Name: {c.name}</h3> 
       </ul>
      )
    </div>
  </Segment>
 )
}

有没有一种方法可以在 PUT 请求之后重新呈现,以确保当我发出第二个 GET 请求时,我得到了更新的结果?我以为 setState 应该重新呈现,但我想我在那里遗漏了一些东西。感谢您的帮助。

最佳答案

您同时执行放置和获取操作,因此不会获得更新的值。您可以使用异步等待

试试下面的代码

editCategory = async (name, description, id) => {
 const category = { name, description}
 const updated = await axios.put(`/api/menus/${this.props.menuId}/categories/${id}`, {category });

 if(updated){
   axios.get(`/api/menus/${this.props.menuId}/categories`)
    .then(res => {
    this.setState({ categories: res.data }, () => 
     console.log(this.state.categories));
    });
  }  
}

关于javascript - 在 Axios 调用后设置状态后无法让 React 组件更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54261535/

相关文章:

javascript - ReactJS 类组件使用 contenteditable 元素渲染 array.map

javascript - 是否有一个 javascript 库可用于合并 2 个或更多 zip 文件而不解压它们

ruby-on-rails - 使用网络摄像头的 Web 应用程序...任何 Rails 插件/gem?

jquery - 带 Rails 的 DataTable 无法提交多页项目

mysql按多数票排序

javascript - React - 从子组件更新状态,然后根据状态执行某些操作

javascript - 如何在我的 React 应用程序中嵌入 Facebook 发送按钮?

javascript - Python 在警报中单击按钮

javascript - SVG 填充背景图像

javascript - 将 Redux 状态传递给 React 组件