Javascript 如何将currentState存储在react中,并在出现问题时重新设置?

Javascript 如何将currentState存储在react中,并在出现问题时重新设置?,javascript,arrays,reactjs,state,setstate,Javascript,Arrays,Reactjs,State,Setstate,我的问题是,当我更新帖子标题时,我无法保持当前状态,因此当我抛出一个错误以获取当前状态时,即我更改帖子标题之前的状态,我发现当前状态也更改为新状态,即我更改帖子标题之后的状态,即使我在更新之前初始化了它 我只想解释一下它是如何工作的 state = { posts: [], }; async componentDidMount() { const { data: posts } = await axios.get(apiEndPoint); this.setStat

我的问题是,当我更新帖子标题时,我无法保持当前状态,因此当我抛出一个错误以获取当前状态时,即我更改帖子标题之前的状态,我发现当前状态也更改为新状态,即我更改帖子标题之后的状态,即使我在更新之前初始化了它

我只想解释一下它是如何工作的

state = {
    posts: [],
  };

async componentDidMount() {
    const { data: posts } = await axios.get(apiEndPoint);
    this.setState({ posts });
  }

  handleUpdate = async (post) => {

    let currentState;
    currentState = this.state.posts;
    console.log(currentState[0].title);
    post.title = 'jsdhjs';

     try {
      await axios.put(apiEndPoint + '/' + post.id, post);
      throw new Error('');
    } catch (ex) {
      alert('Something Failed While Updating The Post');
      this.setState(currentState);
    }
  };

render(){
return(
          <tbody>
            {posts.map((post) => (
              <tr key={post.id}>
                <td>{post.title}</td>
                <td>
                  <button
                    className='btn btn-info btn-sm'
                    onClick={() => this.handleUpdate(post)}
                  >
                    Update
                  </button>
                </td>
              </tr>
            ))}
          </tbody>
       )

        }
状态={
员额:[],
};
异步组件didmount(){
const{data:posts}=await axios.get(apidendpoint);
this.setState({posts});
}
handleUpdate=异步(post)=>{
让我们陈述;
currentState=this.state.posts;
console.log(当前状态[0].title);
post.title='jsdhjs';
试一试{
等待axios.put(apidentpoint+'/'+post.id,post);
抛出新错误(“”);
}捕获(ex){
警报(“更新帖子时出现故障”);
此.setState(当前状态);
}
};
render(){
返回(
{posts.map((post)=>(
{post.title}
此.handleUpdate(post)}
>
更新
))}
)
}

您正在更改旧州的
标题

currentState = this.state.posts;
这不会复制当前状态的POST,它只会在局部变量中存储对它的引用

post.title = 'jsdhjs';
post
在这种情况下,也只是对当前状态下的一篇原始文章的引用-通过设置标题,您也将在
currentState
中设置标题,这就是错误情况下“重置”不起作用的原因

要避免这种情况,请确保不要直接在您的状态中变异任何内容-仅React应通过
setState
执行此操作

在您的情况下,一种方法是在更改标题之前浅层复制post对象,例如使用spread操作符:

const updatedPost={
邮递
标题:“jsdhjs”,
};
// ...
等待axios.put(apiEndPoint+'/'+updatedPost.id,updatedPost);
//TODO如果成功,请使用updatedPost调用this.setState

另外,您似乎只使用posts数组调用
setState
,而应该执行
setState({posts:currentState})
,以保持原始形状。但也许这只是问题的简化。

你正在改变你旧州的
标题

currentState = this.state.posts;
这不会复制当前状态的POST,它只会在局部变量中存储对它的引用

post.title = 'jsdhjs';
post
在这种情况下,也只是对当前状态下的一篇原始文章的引用-通过设置标题,您也将在
currentState
中设置标题,这就是错误情况下“重置”不起作用的原因

要避免这种情况,请确保不要直接在您的状态中变异任何内容-仅React应通过
setState
执行此操作

在您的情况下,一种方法是在更改标题之前浅层复制post对象,例如使用spread操作符:

const updatedPost={
邮递
标题:“jsdhjs”,
};
// ...
等待axios.put(apiEndPoint+'/'+updatedPost.id,updatedPost);
//TODO如果成功,请使用updatedPost调用this.setState

另外,您似乎只使用posts数组调用
setState
,而应该执行
setState({posts:currentState})
,以保持原始形状。但这可能只是问题的简化。

您的状态发生变化的原因在于javascript中对象的变化是如何工作的。有关更多信息,请参阅

您可以将
handleUpdate
功能更新到此

  handleUpdate = async (post) => {
     try {
      await axios.put(apiEndPoint + '/' + post.id, {...this.state.posts[0], title: 'jsdhjs'});
      throw new Error('');
    } catch (ex) {
      alert('Something Failed While Updating The Post');
    }
  };

这样,您就不必关心恢复到以前的组件状态,因为您从未对其进行过变异。

更改状态的原因在于对象的变异在javascript中的工作方式。有关更多信息,请参阅

您可以将
handleUpdate
功能更新到此

  handleUpdate = async (post) => {
     try {
      await axios.put(apiEndPoint + '/' + post.id, {...this.state.posts[0], title: 'jsdhjs'});
      throw new Error('');
    } catch (ex) {
      alert('Something Failed While Updating The Post');
    }
  };

这样,您就不必关心恢复到以前的组件状态,因为您从未对其进行过变异。

Omg非常感谢您!!感谢你在阅读和回答我的问题时浪费的时间再次感谢你!天哪,真的谢谢你!!感谢你在阅读和回答我的问题时浪费的时间再次感谢你!