将看不见的逻辑添加到只读状态 redux - 反应

Posted

技术标签:

【中文标题】将看不见的逻辑添加到只读状态 redux - 反应【英文标题】:add unseen logic to readonly state redux - react 【发布时间】:2020-10-18 17:14:39 【问题描述】:

我的标准化事件如下所示:

"entities":
"events":
 "123":
   ... data
 
 "124":
   ...data
 

我在一个简单的材质 ui 列表中显示列表

现在,当单击按钮时,列表中的任何新项目现在都“看不见”并且不应被自动选择

我是否需要添加“看不见”:真/假。到基本的标准化数据?然后每次有新事件时发送更新?所以它看起来像:

"entities":
"events":
 "123":
   ... data
   unseen:false
 
 "124":
   ...data
   unseen: true
 

或者最好保留一个新的未见事件列表? 我正在寻找一种更好的方法来处理它

在这种情况下我需要更改只读状态吗?因为现在我只更新一个完整的对象

redux 状态:

export interface EventsEntities 
  events: 
    [id: string]: Event;
  ;

export interface EventState 
  readonly entities: EventsEntities;
  selectedItem: string | null;
  readonly result: string[];


【问题讨论】:

【参考方案1】:

假定 Redux 状态中的每个值都是只读的,因此在这两种情况下都不需要删除它。

您可以使用 Redux 操作更改 unseen 属性,例如


  type: 'toggle-unseen-event',
  eventId: '123',
  unseen: true

并像这样在减速器中处理它:

function eventsReducer(state, action) 
  switch(action.type) 
    ...
    case 'toggle-unseen-event':
      return 
        ...state,
        events: 
          ...state.events,
          [action.eventId]: 
            ...state.events[action.eventId],
            unseen: action.unseen
          
        
      
    ...
  

如您所见,我们不会改变事件对象,因此它可以是只读的。


Redux 状态的最佳设计取决于您想要使用数据的方式和位置。

如果某些组件中您仅使用事件数据(而不是 unseen),那么最好将未见事件列表保存在 Redux 状态中的单独位置,以便更改 unseen 属性不会导致重新渲染不关心它的组件。

但是,如果您在使用事件数据的任何地方都使用unseen 属性,那么最好将它们保存在同一个位置,这样您就不需要每次都合并看不见的列表和事件数据。

【讨论】:

我有一个显示事件列表的列表组件,我还需要看不见的,我选择了其他所有组件都使用的项目 在这种情况下,您可以简单地将unseen: true/false 保留在您的事件中,然后发送一个动作来设置它的值。 我如何处理只读状态?是否可以更新特定参数? 是的,您可以在不删除只读的情况下编辑对象。我将编辑答案并让我知道它是否清楚。

以上是关于将看不见的逻辑添加到只读状态 redux - 反应的主要内容,如果未能解决你的问题,请参考以下文章

只读事务@Transactional(readOnly = true)

每次使用反应路由器导航到redux组件时,如何阻止状态存储数据在redux组件中累积

如何使用从子组件传递给组件的反应变量更新 redux 状态

从非反应文件分派操作时 Redux 状态未更新

如何在不改变状态的情况下对 redux 操作做出反应

如何在同一个反应组件中使用本地状态和 redux 存储状态?