Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 重新选择选择器结构_Javascript_Reactjs_Redux_Reselect - Fatal编程技术网

Javascript 重新选择选择器结构

Javascript 重新选择选择器结构,javascript,reactjs,redux,reselect,Javascript,Reactjs,Redux,Reselect,我有以下示例结构 userId: { savedEvents: { eventId: true, eventId: true, eventId: true, }, organisedEvents: { eventId: true, eventId: true, eventId: true, }, attendingEvents: { eventId: true, eventId: true,

我有以下示例结构

userId: {
  savedEvents: {
     eventId: true,
     eventId: true,
     eventId: true,
  },
  organisedEvents: {
     eventId: true,
     eventId: true,
     eventId: true,
  },
  attendingEvents: {
     eventId: true,
     eventId: true,
     eventId: true,
  }
}
我正在使用reselects createSelector方法尝试和链接选择器,以优化内存和重用业务逻辑

例如:-

userOrganisedEventsSelector
返回已组织事件ID的列表

activeUserOrganisedEventsSelector
将UserOrganizedEventSelector的输出与已应用的一组筛选器一起使用

sortedActiveUserOrganisedEventsSelector 
对ActiveUserOrganizedEventSelector的输出进行排序

上述三种方法接受一个包含userId的prop对象,从中可以确定组织的事件

问题:-

userOrganisedEventsSelector
  • 我希望所有三种事件类型(savedEvents、OrganizedEvents和AttentingEvents)具有相同的功能

  • 在某些情况下,我希望由props提供userId,而在其他情况下,我需要使用state提供的userId

  • 我正在寻求帮助或建议如何实现这一点,而不创建30多个功能,同时保持通过重新选择记忆的好处

    我建议你试一试。这是一个很小的
    重新选择
    包装器,当我发现自己在一个类似于你的场景中编写了几乎相同的选择器时,我编写了它

    它将允许您在传递不同的参数(例如,
    userID
    )时不重复选择器代码,并更好地管理选择器缓存

    这里有几行伪代码,只要你走上正确的轨道:

    import createSelector from 'reselect';
    import createCachedSelector from 're-reselect';
    
    // Normal reselect selector:
    // getUserEvents(state, userId)
    const getUserEvents = createSelector(
      state => state.events
      (state, userId) => userId,            // Get user from state if userId not provided
      (events, userId) => events[userId],   // Return user's events
    );
    
    // Cached re-reselect selector (cached by eventType):
    // getUserEventsOfType(state, userId, eventType = 'ALL')
    const getUserEventsOfType = createCachedSelector(
      getUserEvents,                        // Get events from getUserEvents
      (state, userId, eventType = 'ALL') => eventType,
      (userEvents, eventType) => userEvents[eventType]  // Just pseudo code!
    )(
      // Keep memoization when calling selector with different eventType
      (state, userId, eventType = 'ALL') => eventType,
    );
    

    碰巧,我今天早上也偶然发现了你的自由。谢谢你的示例和库。我已经尝试了重新选择库。我有一个疑问。对于selectorA,如果我们使用userid作为缓存键,我可以使用userid作为selectorB的键吗?