javascript - NativeBase 列表未更新

标签 javascript react-native redux reducers rerender

所以我得到了一个看起来像这样的对象:

[
  {
    title
    data: [
      {
        id
        name
        checked
      } 
    ]
  },
  ... ( * n item)
]

这些状态位于 reducer 中,因此位于存储中。 当我单击某个项目时,我会切换选中状态。

reducer :

switch(action.type) {
    case TOGGLE_ITEM:
        const { row, column } = action.payload
        let newState = state.slice()
        newState[row].data[column].checked = !newState[row].data[column].checked
        console.warn(`the references are: ${newState == state ? 'same' : 'different'}`)
        return newState

以及组件(屏幕连接到商店):

<List dataArray={list}
                    renderRow={(item, sectionID, row) =>
                        <View>
                            <ListItem itemDivider>
                                <Text>
                                    {item.title}
                                </Text>
                            </ListItem>
                            <List dataArray={item.data}
                                renderRow={(subitem, sectionID, column) =>
                                    <Item
                                        toggled={subitem.checked}
                                        text={subitem.name}
                                        onPress={()=>toggleItem(row, column)}
                                    />
                                }
                            />
                        </View>
export default connect(
    state=>({
        list: state.list
    }), {
        toggleItem
    }
)(ListScreen)

当我切换某些内容时,我可以看到商店中的状态发生了变化,并且我可以看到引用也发生了变化,但列表不会触发更新。 :/

最佳答案

你正在改变你的状态。这是反对 Redux 的。 您应该返回一份您所在州的副本。

  const newState = state.map((value, index) => {
    if (index != row) {
      return value
    }

    return {
      ...value,
      data: value.data.map((dataValue, dataIndex) => {
        if (dataIndex != column) {
          return dataValue
        }

        return {
          ...dataValue,
          checked: !dataValue.checked
        }
      })
    }
  })

注意:NativeBase 将返回一个“字符串”索引值。这就是我们不使用 !== 的原因。您可以通过 parseInt 将行和列转换为整数。

关于javascript - NativeBase 列表未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51057562/

相关文章:

javascript - 如何在 Javascript 中添加 JSON 属性?

javascript - 单击 Firebase 数据和 React Native 获取列表项信息

javascript - 为什么我收到错误 : TypeError: Cannot read property 'map' of undefined?

android - 在 React Native 上定位 android 30 sdk 时,Linking.canOpenURL 返回 false

reactjs - React、Redux、React-Router?

javascript - 为每个项目变量添加 +x

javascript - 使用日期字符串数组在 Bootstrap 日期选择器中设置禁用月份不起作用

javascript - 如何在函数调用之间设置超时?

javascript - 为什么 react-redux 会创建多个状态?

javascript - 如何在 redux 中获取 ById