如何转换 mapStateToProps 中的异步数据?

How to transform async data in mapStateToProps?

那么,我的问题是您如何使用异步数据进行这种数据转换?有没有办法暂停 mapStateToProps 的执行并等待数据在映射之前被 returned?

第一次发帖,如有不明白之处敬请见谅。

您的组件应该对基础数据的变化做出反应。所以你可以渲染这样的东西:

getSchedules(emps) {
 return emps.map(employee => <SomeEmployeeRenderingComponent emp={employee} /> );
}
render() {
  return (
   <div>{this.getSchedules(this.props.employees).bind(this)}</div>
  )
}

并且 mapstatetoprops 变为:

function mapStateToProps(state) {

  const rota = {
   id: null,
   date: moment(),
   notes: null,
   events: [null, null, null, null, null, null, null],
   published: null,
   employees: state.firestore.ordered.employees
  };

  return rota
}

要快速使其正常工作,您只需执行以下操作:

function mapStateToProps(state) {

    const employees = state.firestore.ordered.employees;

    const schedules = employees
        ? employees.map(employee => ({
            id: employee.id,
            name: {
                first: employee.name.first,
                last: employee.name.last
            },
            schedule: [null, null, null, null, null, null, null]
        }))
        : undefined;

    const rota = {
        id: null,
        date: moment(),
        notes: null,
        events: [null, null, null, null, null, null, null],
        published: null,
        body: schedules
    };

    return { rota }
}

然后,在您的组件中,您可以检查 rota 对象的 schedules 属性,如果它仍然未定义,则呈现一些内容以指示数据尚未加载。

不过,将如此复杂的逻辑放入 mapStateToProps 对我来说是一种反模式。您可以使用选择器模式让您的代码更有条理。