【问题标题】:How to set redux initial state for array of objects?如何为对象数组设置 redux 初始状态?
【发布时间】:2019-02-01 12:54:11
【问题描述】:

我正在为我的 react 应用程序使用 redux。我正在从 api 获取用户数据,用它更新 redux 状态并将其显示到我的组件中。数据是对象列表。导致我出现问题的原因是设置 redux 初始状态。

Reducer 初始状态:

const initState = {
    users: []
}

减速器动作

case 'GET_USERS':
    return {
        users: action.users
    }
});

在组件中渲染

{this.props.users[1].name}

在第一次渲染时,我收到错误无法从未定义的属性中读取。这是因为第一次渲染数据尚未存储,并且具有该属性的对象还不存在。如果我设置初始状态,我可以解决这个问题:

const initState = {
    users: [
        {name: "", age: ""},
        {name: "", age: ""}
    ]
}

在这种情况下,具有属性的对象将存在,我不会得到错误。但我不知道我将拥有多少个对象,并且我不想为每个对象及其属性设置初始状态。那么如何正确设置呢?

【问题讨论】:

  • 例如,您需要使用地图迭代数组,然后在地图内渲染项目。在这种情况下,如果数组为空,则不会进行渲染。
  • 我认为您应该扩展您的渲染方法,以充分向我们展示您尝试输出的内容。

标签: javascript arrays object redux


【解决方案1】:

只需检查它是否存在并有条件地渲染

{this.props.users.length > 1 ? this.props.users[1].name : 'Not enough elements!'}

【讨论】:

    【解决方案2】:

    您不应该像这样通过用户的位置来呈现用户。要么迭代所有用户,要么研究规范化数据

    <div>
      {users.map(user) => (
        <div>{users.name}</div>
      )}
    </div>
    

    https://redux.js.org/recipes/structuring-reducers/normalizing-state-shape

    【讨论】:

    • 但是当它更深入时它不起作用..例如 users.name.firstname
    【解决方案3】:

    我会使用一个空数组并在渲染之前检查 [].length 属性。

    【讨论】:

      【解决方案4】:

      你提到你的对象结构

      {name: "", age: ""}
      

      然后你提到如何访问users.name.firstname。如果您收到undefined,则表示您的 dara 尚未加载到您的用户数组中。因此,使用一个空数组进行实例化,例如 users:[] 并添加以下内容:

      const YourComponent = (props) => {
        if (users.length === 0){
          return <div> Loading </div>
        }
        return(
          <div>
            {users.map(user => 
              <div>
                {user.name}
              </div>  
            )}
          </div>
        )
      }
      

      您的组件将在您的数组被填充之前加载,并将返回 Loading div。当数组被填充时,组件将重新渲染并映射出你的数组。

      【讨论】:

      • 我知道这种方法,但我想避免在每个组件中使用 if 语句,当然必须有更好的方法
      • 这是一种常见的做法,因此除非您有特定的原因,否则您可以在所有组件中使用它。或者,查看 react-loadable
      猜你喜欢
      • 2021-03-10
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      • 1970-01-01
      • 2021-06-04
      相关资源
      最近更新 更多