Javascript Redux-如何对更改作出一次反应

Javascript Redux-如何对更改作出一次反应,javascript,ecmascript-6,redux,Javascript,Ecmascript 6,Redux,我正在使用redux对应用程序状态的更改做出反应,并根据我的状态呈现ui。现在,某些组件需要一次方法调用 以下示例: 我有一个网格。在网格中选择一个项目会更改我的应用程序的状态,我将selected属性设置为此项目 添加项目时,将“我的状态”的selected属性设置为添加的项目。但是网格需要调用grid.clearCache()来实际呈现添加的项 这两种情况下的状态实际上看起来相同,如果不需要,我不想调用clearCache函数。这些项不是状态的一部分,由组件本身延迟加载 将clearcach

我正在使用redux对应用程序状态的更改做出反应,并根据我的状态呈现ui。现在,某些组件需要一次方法调用

以下示例:

我有一个网格。在网格中选择一个项目会更改我的应用程序的状态,我将
selected
属性设置为此项目

添加项目时,将“我的状态”的
selected
属性设置为添加的项目。但是网格需要调用
grid.clearCache()
来实际呈现添加的项

这两种情况下的状态实际上看起来相同,如果不需要,我不想调用
clearCache
函数。这些项不是状态的一部分,由组件本身延迟加载

clearcache
属性添加到状态并在之后将其设置回原来的状态感觉不太正确


我如何实现期望的行为?在这种情况下,如何正确地设计状态?

如何存储像firstUpdate:true这样的附加标志?

我对您的问题了解得不够。如果你添加了新的道具,道具会改变,所以网格会自动更新(感谢React magic)。无需再调用一次
grid.clearCache()

这是我为你的问题设计的简单减速机

const preState = {
  items: {
    1: {
      id: 1,
      itemName: '1'
    },
    2: {
      id: 2,
      itemName: '2'
    }
  },
  order: [1, 2],
  selectedItem: 1
}

export default (state = preState, action) => {
  switch (action.type) {
    case 'SELECT_ITEM':
      return {
        ...state,
        selectedItem: action.itemId
      }
    case 'ADD_NEW_ITEM':
      return {
        ...state,
        items: {
          ...state.items,
          [action.item.id]: action.item
        },
        order: [...state.order, action.item.id],
        selectedItem: action.item.id
      }
    default:
      return state;
  }
}

您的
网格组件
应该从redux store中读取
项目
选择编辑项
订单
,如果您需要对项目进行排序)。

是的,这是我的想法。但在下一次州变时,该标志仍然正确。然后我必须调用一个操作将状态设置回false。调用两个动作来对一个更改做出反应,感觉有点尴尬。这是正确的redux方法吗?如果需要对应用程序状态进行两次(连续)更改,则可以调用两个操作,也可以用于调试和日志记录。redux+Immutable,我认为不需要关心何时调用render方法,操作只关心状态的更改。然后redux将导致UI重新呈现。这些项目是惰性加载的(例如,在滚动时)并显示可能的数千种元素。所以我不想将项目作为状态的一部分保存,但不是所有的元素都显示在视图中,对吗?您应该只在商店中保留少量物品,同时继续添加新物品/切片旧物品(可能一次管理大约100~500件最新物品)。另一方面,如果将数据保持在React状态/Redux存储中,则情况相同。这只是关于如何设计应用程序状态。如果您不将数据保存在状态中,那么您还要将它们保存在哪里?网格是一个我自己没有编写的web组件,但它的工作方式与您描述的一样。我为它提供了一个数据提供者func。此数据提供程序从indexeddb检索其数据。我只在状态中存储过滤器、排序器和滚动位置,而不存储数据本身。如果将数据添加到indexeddb,网格必须再次检索其所有数据,这就是为什么我必须调用clearcache。在其他应用程序中,我可能会处理事件。我明白了。。。我认为您可以使用
forceUpdate()
强制组件重新渲染,而无需任何状态更改。