javascript - 将新 Prop 合并到状态中的正确方法

标签 javascript reactjs redux react-big-calendar getderivedstatefromprops

我目前正在使用react-big-calendar开发日历组件。

我目前有一个包装器,可以从数据库中提取数据并将其发送到日历组件中。不过,我正在开发一项功能,可以从任何地方将日历事件“发送”到该组件。

目前我只有用例,来自网站的内置通知系统,将有一个功能可以将外部事件作为通知发送到您自己的日历中。 不过,我可能想通过我的套接字服务器 (socket.io) 将事件从另一个 Web 应用程序推送到用户日历。

从技术上来说,我不确定在 React 中“正确”的处理方式是什么。

我现在的做法是添加

 static getDerivedStateFromProps(nextProps, prevState){
    if(nextProps.propInput === true){
        nextProps.reset()
        return {events : {...prevState.events, ...nextProps.events}}
    } else return null
}

在我的 CalendarWrapper 中,它基本上为我执行以下操作: 1)我更新发送到包装器的 Prop ,无论是从父组件还是从 redux 存储(我将使用第二个) 2) 这会触发 getDrivedStateFromProps 并检查它是否接收到 propInput 为 true,如果是这样,它将作为 props 向下发送的新事件合并到日历的当前事件中。 3) 然后它运行一个回调函数(nextProps.reset()),将 propInput 重置为 FALSE,这会触发 getDrivedStateFromProps 的另一次运行,但这次返回 null 并且不会导致新的 setState。

这是我自己梦想的解决方案,涉及如何将新事件从 redux 存储推送到此日历包装器。这似乎很不正统,但对我来说,这是获得纯 redux 和所有内容都保存在 redux 中的中间立场,并拥有每个组件的本地状态的唯一方法。

有没有技术上更好、更有效的方法来解决这个问题?

提前致谢。

最佳答案

我会保存发送到 redux 的新事件的时间戳(而不是 bool 值 propInput)。比较“上次更新时间”足以做出更新决定 - 无需清除 propInput 标志(没有 reset() 调用...reducers...等。 )。

您甚至不需要将此时间戳存储在状态中 - 无需使用 getDerivedStateFromProps (“在每次渲染时触发,无论原因如何”)- 经典解决办法:

componentDidUpdate(prevProps) {
  if (this.props.newEventsTime !== prevProps.newEventsTime) {
    setState({events : {...this.state.events, ...this.props.newEvents}})
  }
}

应该更优化

shouldComponentUpdate(nextProps, nextState) {
  if (nextProps.newEventsTime !== this.props.newEventsTime) {
    setState({events : {...this.state.events, ...this.props.newEvents}});
    return false; // no render needed in this pass
  }
  return (nextState.events === this.state.events) ? false : true;
}

- 更新事件对象引用更改。

关于javascript - 将新 Prop 合并到状态中的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56199398/

相关文章:

javascript - Pom Pom 程序不调整大小

javascript - 无法在 firefox 扩展中加载 oauth.io (oauth.js)

javascript - 用 javascript 中的文字对象替换 switch case(在 c++ 中)

reactjs - index.css 与 "create-react-app"创建的默认应用程序中的 App.css -- 有什么区别?

javascript - Redux 表单和同构获取总是向服务器提交空白表单

javascript - 是否可以通过 JavaScript 获取对评论元素/ block 的引用?

reactjs - 取消后不会调用操作 redux-saga

reactjs - 阻止浏览器窗口尝试容纳 Appbar Tabs 中的项目,也许?

javascript - 将正则表达式保存到 Redux 存储中?

reactjs - React.js : How to get all props component expects?