reactjs 从上下文转移数据存储

k5hmc34c  于 2023-05-06  发布在  React
关注(0)|答案(1)|浏览(113)

bounty还有3天到期。回答此问题可获得+50声望奖励。Paul正在寻找典型答案

项目描述:我有一个网站,其中每个页面上都有一个带有过滤器的侧边栏(一个小原型,以便您了解其本质,在此链接https://codesandbox.io/s/dank-cherry-zl553c)。
实施:我创建了一个FiltersContextWrapper并将其放在App.js中。要记住过滤器的状态(边栏是否打开,过滤器本身是否打开,以及过滤器值本身)在网站的任何页面上。
问题:当我开始深入研究时,我意识到,在上下文中传递函数是非常糟糕的做法。从上下文使用函数会使代码变得不可预测。我需要存储过滤器的状态并使用它,而不是从外部更改组件状态。
也就是说:我隐藏了上下文中数据更改所基于的所有操作。几乎不可能跟踪数据将从何处更改。一般来说,功能不应该位于状态管理器中,包括上下文。实际上,在状态管理器中,我需要存储过滤器本身的状态,并使用将绑定到相应存储的函数更改它们。
我相信一个很好的图书馆是反冲。我想问一下社区我怎样才能把我的代码翻译到这个库中
所有的代码都来自我上面粘贴的链接。这里(因为这是stackoverflow规则所要求的)我将给出代码FiltersContextWrapper

export default function FiltersContextWrapper({ children }) {
  const [hideSidebar, setHideSidebar] = useState(true);

  const [filterRequestURLOpen, setFilterRequestURLOpen] = useState(false);
  const [filterDateTimeOpen, setFilterDateTimeOpen] = useState(false);

  const start = moment("2023-01-01").set({ hour: "00", minute: "00" });
  const end = moment(moment().startOf("day"))
    .add(1, "days")
    .subtract(1, "seconds");
  const [time, setTime] = useState({ start, end });
  const resetDate = () => {
    setTime({
      start,
      end
    });
  };

  const resetAll = () => {
    setTime({
      start,
      end
    });
  };

  return (
    <filtersContext.Provider
      value={{
        hideSidebar,
        setHideSidebar,
        filterRequestURLOpen,
        setFilterRequestURLOpen,
        filterDateTimeOpen,
        setFilterDateTimeOpen,
        time,
        setTime,
        resetDate,
        resetAll
      }}
    >
      {children}
    </filtersContext.Provider>
  );
}

export const filtersContext = createContext({
  hideSidebar: false,
  setHideSidebar: () => {},
  filterRequestURLOpen: false,
  setFilterRequestURLOpen: () => {},
  filterDateTimeOpen: false,
  setFilterDateTimeOpen: () => {},
  time: false,
  setTime: () => {},
  resetDate: () => {},
  resetAll: () => {}
});
cnjp1d6j

cnjp1d6j1#

我相信你不需要使用一个外部库(或者至少你可以实现类似的结果没有它)的功能,你想实现。请检查这些文件。
https://react.dev/learn/scaling-up-with-reducer-and-context
如果您愿意,我可以帮助您重构您的真实的应用程序,所以不要羞于提问

相关问题