首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在`axios.post()之后更新状态

在`axios.post()之后更新状态
EN

Stack Overflow用户
提问于 2019-12-30 12:49:34
回答 1查看 1.2K关注 0票数 0

场景

使用Express框架来修改MongoDB,我可以将文档添加到名为faculties的集合中。此外,当我可以在post方法完成后检查时,在集合name中显示文档属性faculties的下拉框。但是,当我传递状态,并使用:faculties从它检索const { faculties } = state;集合,然后检查集合faculties文档数组的属性name时,它将不会显示数据库中最近添加的内容。(我正在寻找新插入的名为facultyexampleFaculty文档的属性'id‘,以实现多到多的关系)。

尝试

  1. --我尝试应用forceUpdate()来更新状态,但据我所知,这将更新render而不是状态。不过,呈现是更新的,但状态不是。这是implementation:

代码语言:javascript
复制
this.forceUpdate();
axios.post('http://localhost:3001/api/putFaculty', {name: message});
this.forceUpdate();
ManyToManyDbMain.Main(message,collectionName,this.state) // implement many to many relationships in db

  1. I尝试this.setState(this.state);更新状态:

代码语言:javascript
复制
this.forceUpdate();
axios.post('http://localhost:3001/api/putFaculty', {name: message});
this.forceUpdate();
this.setState(this.state);
ManyToManyDbMain.Main(message,collectionName,this.state) // implement many to many relationships in db

  1. 我尝试直接调用fetch方法来更新状态:

代码语言:javascript
复制
this.forceUpdate();
axios.post('http://localhost:3001/api/putFaculty', {name: message});
this.forceUpdate();
this.getFaculties()
this.setState(this.state);

ManyToManyDbMain.Main(message,collectionName,this.state) // implement many to many relationships in db

其中,提取方法包括:

代码语言:javascript
复制
// read the mongodb collection faculties in database "education"
    getFaculties= () => {
        fetch('http://localhost:3001/api/getFaculties')
                .then((data) => data.json())
                //set property "faculties" within the state" (won't throw error if you haven't defined property "faculties" within state".
                .then((res) => this.setState({ faculties: res.data })); 
    };

  1. 使用axiom.post(..)方法的响应来读取新的设备:

代码语言:javascript
复制
axios.post('http://localhost:3001/api/putFaculty', {name: message})
                          .then(response => {
                            const {faculties} = this.state;
                            alert(response.data)
                            alert(response.name)
                            faculties.push(response.data);
                            this.setState({faculties});
                          })

但是这会返回一个object Object,我还不知道如何读取该对象的属性,我尝试用:response.map((dat) => dat.name)将其映射到一个.name属性中,但是响应中没有名为map的函数。

  1. ,因为状态每秒钟使用:

自动更新。

代码语言:javascript
复制
this.getFaculties();
        if (!this.state.intervalIsSet) {
            let interval = setInterval(this.getFaculties, 1000);
            this.setState({ intervalIsSet: interval });
        }

  1. ,我尝试添加一个5秒的睡眠方法,但错误地期望状态会在状态传递给ManyToManyDbMain.Main()方法之前自动更新。相反,在代码继续之前,网站/代码被冻结了7秒(意味着状态也没有被更新)。

问题

如何在axios.post()之后更新状态,以便将最新的集合faculties文档包含在传递给ManyToManyDbMain.Main(..)的状态中

忽略快捷方式/XY-问题解决方案:

以下xy问题的解决方案是公认的,但没有被说服.

  1. --我可以手动为所有文档生成所有的Id,然后将它们推送到数据库中,这样,当我需要时,Id就在App.js中了。然而,在DB中实现多对多关系的原因是,它被设计成一个小型数据库(可能被许多用户使用),因此我希望以更大的数据库为代价减少计算时间(应用搜索查询查找子集id)。这也意味着我不想在网站上创建一个单独的系统来管理所有创建的Id,并在MongoDb已经优化了Id分配系统的情况下阻止双Id。
  2. I可以每隔n毫秒添加第二个循环,检查是否有布尔值指示是否添加了新的教员,并从那里启动一个"get方法“。但我认为,这使得代码不必要地复杂、难以测试、在多个用户中可能不可靠,而且计算量很大,这是我正在努力避免的。
EN

回答 1

Stack Overflow用户

发布于 2019-12-30 13:01:11

可以使用axios .then()方法来设置组件的状态。

例如-

代码语言:javascript
复制
axios.get('http://localhost:3001/api/getFaculties')
  .then(res => {
    /** Console here to get an actual response from server */
    console.log(res);
    this.setState({
      faculties: res.data.results
    });
  })
  .catch(function(error) {
    console.log(error);
  });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59531138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档