this.setState不能在componentWillMount()上工作?

时间:2017-08-27 19:46:36

标签: javascript reactjs

我希望状态依赖于服务器数据。我想过使用componentWillMount:

componentWillMount() {
    this.setState( async ({getPublicTodosLength}, props) => {
      const result =  await this.getPublicTodosLengthForPagination();
      console.log("result = ", result) // returns the length but not assigned on this.state.getPublicTodosLength
      return { getPublicTodosLength: result+getPublicTodosLength }
    });
  }

  getPublicTodosLengthForPagination = async () => { // get publicTodos length since we cannot get it declared on createPaginationContainer
        const getPublicTodosLengthQueryText = `
          query TodoListHomeQuery {# filename+Query
            viewer {
              publicTodos {
                edges {
                  node {
                    id
                  }
                }
              }
            }
          }`
    const getPublicTodosLengthQuery = { text: getPublicTodosLengthQueryText }
    const  result = await this.props.relay.environment._network.fetch(getPublicTodosLengthQuery, {})
    return await result.data.viewer.publicTodos.edges.length; 
  }

有值,但是我的getPublicTodosLength状态没有赋值?我想我不必在这里绑定,因为结果返回我想在getPublicTodosLength状态分配的数据

4 个答案:

答案 0 :(得分:0)

可能你可以使用:

代码段:

(async ({getPublicTodosLength}, props) => {
      const result =  await this.getPublicTodosLengthForPagination();
      console.log("result = ", result);
      return { getPublicTodosLength: result + getPublicTodosLength }
})).then((v)=> this.setState(v));

如果有效,请告诉我。

答案 1 :(得分:0)

为什么不做这样的事呢?

...
async componentWillMount() {
  const getPublicTodosLength = this.state.getPublicTodosLength;
  const result = await this.getPublicTodosLengthForPagination();
  this.setState({
    getPublicTodosLength: result+getPublicTodosLength,
  });
}
...

它更简单,更容易阅读。我认为原始代码的问题是在setState()中使用异步函数。在转换后的代码中,创建了另一个包装函数,然后它可能会松散上下文。

答案 2 :(得分:0)

如果您希望依赖于服务器数据,则应使用B

  在安装发生之前立即调用

componentWillMount()。它在 render()之前调用,因此在此方法中同步设置状态不会触发重新渲染。避免在此方法中引入任何副作用或订阅。   这是服务器渲染上唯一的生命周期钩子。通常,我们建议使用构造函数()。

     装载组件后立即调用

componentDidMount()。需要DOM节点的初始化应该放在这里。 如果您需要从远程端点加载数据,这是实例化网络请求的好地方。在此方法中设置状态将触发重新渲染。

From React Doc

答案 3 :(得分:0)

我决定让componentWillMount异步并且效果很好。

这是代码:

componentWillMount = async () => {
    let result =  await this.getPublicTodosLengthForPagination();
    this.setState((prevState, props) => {
      return { 
        getPublicTodosLength: result 
      }
    });
  }