减速器行为

2024-02-11

据我了解,当调用一个操作时,所有减速器都会做出响应。如果动作存在于switch case的reducer语句,它执行。如果没有,那么case: default执行保留现有状态。

当该操作存在于减速器中但它尝试更新的特定属性不存在时,它似乎表现正常,因为没有任何可更新的内容。

例如,我有一个动作创建器,用于设置visible我的模态属性。每个模态都有自己的Id。我的代码如下所示:

export default (state = initialState, action) => {
   case types.SET_MODAL_IS_VISIBLE:
      return Object.assign({}, state,
         { modal22: action.value }
      )}

我有SET_MODAL_IS_VISIBLE在多个减速器中,但是如果modal22没有在特定的减速器中定义,没有任何反应,也没有错误。

现在,我有一个抛出错误的场景。我构建了一个通用日期选择器组件,可以用作单个独立的日期选择器,也可以“链接到”另一个日期选择器。如果我需要用户给我两个日期,例如,第二个场景很有用。开始和结束日期。

我还构建了一个功能,如果日期选择器与另一个日期选择器结合使用,当用户在第一个日期选择器中设置日期时,我会在第二个日期选择器中禁用该日期之前的所有日期,因为我不希望用户无意中选择了早于开始日期的结束日期。

我定义我的日期选择器如下:

const initialState = {
    datePickers: {
        "startDatePicker": {
            activeDate: "8/25/2017",
            disabledBefore: "",
            linkedTo: "endDatePicker"
         },
         "endDatePicker": {
            activeDate: "",
            disabledBefore: "8/25/2017" // This date is set when the user sets the active date in startDatePicker
            linkedTo: ""
       }
    }
}

这种情况有点有趣,因为我的减速器中一个属性的状态更改正在触发另一个属性的状态更改。这并不难做到,而且我有办法控制更新的时间。

设置禁用日期的操作如下所示:

...
case types.SET_DISABLED_DATES:
    return Object.assign({}, state,
       datePickers: Object.assign({}, state.datePickers, {
          datePickers[action.datePickerId]: Object.assign({}, state.datePickers[action.datePickerId], {
             disabledBefore: action.value
          })
    })

请记住,我可以而且应该能够设置disabledBefore即使日期选择器作为独立的选择器使用。所以,我需要我的SET_DISABLED_DATES在每个减速机中。

我遇到的问题是每当我打电话时SET_DISABLED_DATES,我在减速器中遇到错误,其中日期选择器用作单个/独立的日期选择器,因为其对的日期选择器 ID 未在减速器中定义。

例如,在projectsReducer我可以使用日期选择器作为一对的一部分,所以两者startDatePicker and endDatePicker已定义并且一切正常。

但我可能在中使用单实例日期选择器tasksReducer这也响应了SET_DISABLED_DATES调用但失败,因为找不到endDatePicker。在这种情况下,tasksReducer正在响应我设置的调用disabledDates的财产endDatePicker in projectsReducer.

我已经发布了两个关于此问题的问题,我在这里看到的唯一真正的解决方案是我需要在我的减速器中有一个如下所示的条件:

...
case types.SET_DISABLED_DATES:
   if(typeof state.datePickers[action.datePickerId] !== "undefined") { // Making sure that what I'm trying to update exists in the reducer
      return Object.assign({}, state,
       datePickers: Object.assign({}, state.datePickers, {
          datePickers[action.datePickerId]: Object.assign({}, state.datePickers[action.datePickerId], {
             disabledBefore: action.value
          })
    })
   } else {
      return state;
   }

诚然,这看起来有点像拼凑,但我真的无法在这里想出另一个解决方案。

同样,问题是只要所有减速器都响应SET_DISABLED_DATES,保证特定的日期选择器不会出现,并且Object.assign()会抛出错误。

有什么建议么?减速器中的简单条件是这里的方法吗?这是一个拼凑吗?

附:我尝试了这段代码,它工作正常并解决了问题。一方面,我觉得这有点反模式,但另一方面,在尝试更新之前确保我要在减速器中更新的属性存在似乎是个好主意。我非常感谢您对此的反馈。谢谢。


您只是在设置状态之前在减速器中进行基本验证。那完全没问题。我认为检查动作创建器中的存储以防止对不在存储中的对象分派动作(无论如何你会怎么做!)。

我不明白的是,日期选择器如何链接到不在商店中的另一个日期选择器?也许在组件上分派创建和拆卸操作didMount and willUnmount?

我不知道您的全部要求,但我认为我们可以使其变得简单得多。我会做这样的事情:

商店:

{
  datePickers: {
    id1: {
      value: '',
      minValue: '',
      maxValue: '',
    },
    id2: {
      value: '',
      minValue: '',
      maxValue: '',
    }
  }
}

现在,除非您正在制作某种始终成对运行的耦合日期选择器组件,否则我相信最干净的方法是在链接的日期选择器中设置禁用值mapDispactchToProps在您的父组件中运行。

这就是你要设置的地方ids 到组件,并且您确切地知道应该在另一个组件之前禁用哪个组件。

就像是:

dispatch => ({
  setArrivalDate(value) {
    dispatch(datePickerActions.setValue(arrivalDateId, value);
    dispatch(datePickerActions.setMaxValue(depatureDateId, value);
  },
  setDepatureDate(value) {
    dispatch(datePickerActions.setValue(depatureDateId, value);
    dispatch(datePickerActions.setMinValue(arrivalDateId, value);
  }
})

这可能不够抽象,但很干净。

如果您有配对组件,您可以执行相同的操作,但您仍然需要知道哪个日期早于另一个日期。围绕它进行通用抽象会很麻烦。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

减速器行为 的相关文章

  • react-native-screens:compileDebugKotlin 错误

    失败 构建失败并出现异常 什么地方出了错 任务 react native screens compileDebugKotlin 执行失败 评估任务 react native screens compileDebugKotlin 的属性 fi
  • React.JS:类型错误:无法读取 findLoader 处未定义的属性“过滤器”

    我正在按照教程进行工作 https www fullstackreact com articles react tutorial cloning yelp routing https www fullstackreact com artic
  • 全新安装 create-next-app 后,无效的 href 传递给路由器错误

    在我的本地计算机上安装 nextjs 应用程序后 使用create next app我在控制台中收到此错误Invalid href passed to router 有谁知道如何解决它 我尝试使用to属性而不是href属性在Link组件的但
  • Enzyme - 测试嵌套组件是否正确呈现

    我正在尝试测试当通过简单的布尔值更新状态时 在父组件中其子组件是否正确呈现 在父组件下面 class Parent extends Component render const isReady this state const props
  • 将字符串渲染为 React 组件

    我想用字符串作为我从另一个页面动态接收的输入来渲染反应组件 但是我会有反应组件的参考资料 这是例子 Page1 loadPage div div
  • React/Jest - 如何模拟触摸“滑动”事件

    我有一个组件 每当完成滑动交互时就会触发函数调用 这种滑动交互可以由 touchEvent 或 mouseEvent 执行 我的目标是检查每当发生滑动时该函数是否被调用 但我在玩笑测试中无法模拟 touchEvent 使用 swiper r
  • 如何将React JS状态保存到本地存储中

    我不知道如何将 React js 状态存储到本地存储中 import React Component from react import App css import auth createUserProfileDocument from
  • 如何在MUI GridList中实现图块的水平滚动?

    这是我的 JS 页面 我需要在其中实现GridList组件显示多个图块 并且在列表大小超出屏幕限制后可水平滚动 import React useState from react import Header from common heade
  • React Hooks 常量组件与功能组件

    我理解函数组件和类组件之间的区别 但是 const 组件和函数组件之间有什么区别 e g const Home gt return div Home div To function Home return div Home div 两者都可
  • 使用 React JS 进行多个文件上传

    我试图弄清楚如何在 React JS 中循环多个文件上传 最终我希望能够循环遍历每个文件 以便我可以判断是否仅上传 PNG JPG 和 MP3 文件 我还希望 PNG JPG 文件限制为 5MB MP3 文件限制为 2MB 到目前为止 我不
  • React 组件渲染被调用两次而不改变状态

    我正在渲染一个简单的反应组件 其中没有设置状态和道具 我在渲染函数中仅将文本记录到控制台一次 但它被记录了两次 rendering counter rendering counter 下面是counter js组件的代码 import Re
  • 对函数而非组件做出延迟加载反应

    我正在开发一个 React v16 应用程序 需要加载一个重型 IMO 库来导出 xlsx 数据 我正在使用功能组件 挂钩 我了解并使用过
  • React JS“this”没有按预期工作

    我有下面的代码 save function var this this console log this refs itemText this setState isEditing false function console log In
  • Hooks setState 总是落后一步

    我使用了 useState 钩子 应该在每次下拉按钮的值发生变化时触发设置状态方法 在钩子中 但设置状态总是落后一步 我已经看到了使用基于类的组件的传统 setState 方法的解决方案 但是如何使用钩子解决此问题useState
  • Antd select 元素:如何禁用输入?

    我正在尝试使用模式 multiple 的选择元素 我希望禁用输入 这意味着用户只能在现有选项之间进行选择 而不能输入文本 我该怎么做呢 我的元素 import Select from antd import antd dist antd c
  • Font-Awesome 添加了 aria-hidden 属性,可防止图标出现在浏览器中 [SSR]

    我想在我的 Next js 项目中包含一些 Font Awesome 图标 我已经添加了需要的 标记到我的头部 然后 i i 标记到我的渲染方法 如果我在浏览器中打开该网站 它会向我发出以下控制台警告 index js 1 警告 来自服务器
  • 在 React 中过滤数据的最佳方法是什么?

    我正在建立该国餐馆的目录 该 API 返回一组对象 每个对象都包含诸如restaurantName restaurantLocation restaurantPriceRange 等字段 我想创建一个过滤组件 它将餐厅数组减少到仅包含那些符
  • 在nextjs中获取URL路径名

    我有一个登录页面和布局组件 布局组件有标题 我不想在登录中显示标题 为此 我想获取 url 路径名 基于路径名显示标题 import as constlocalStorage from helpers localstorage import
  • 如何编写具有依赖状态的 redux 减速器

    我正在开发一个 React Redux 应用程序 它允许将 小部件 添加到页面并在 2D 空间中进行操作 要求可以同时选择和操作多个小部件 我当前状态树的简化版本如下所示 widgets widget 1 x 100 y 200 widge
  • 如何在 React 应用程序中访问浏览器 cookie

    这个问题有点受欢迎 但我没有这么幸运 我主要是一名后端人员 所以我一边工作一边学习 我有一个名为connect sid和价值12345 我在 chrome 开发工具中看到了这一点 在我的反应应用程序中 我控制台记录了document coo

随机推荐