如何在反应查询中存储本地状态?

Posted

技术标签:

【中文标题】如何在反应查询中存储本地状态?【英文标题】:How to store local states in react-query? 【发布时间】:2022-01-19 17:14:25 【问题描述】:

如何在 react-query 中存储本地状态?

例如,我有一个模态窗口,我想将其可见性存储在一个单独的钩子中,但是为了可以在我的应用程序的任何位置获取此状态,我尝试这样:

export const useSidebar = () => 
  const [isOpen, cycleOpen] = React.useState(false);

  const visible = () => 
    useQuery('sideBarVisible', () => cycleOpen(true));
  ;

  return 
    isOpen,
    visible,
  ;
;

但我得到了错误,换句话说,如何像在 redux 中一样全局存储可见性状态?

【问题讨论】:

我不确定你想做什么,但是要像redux一样全局存储数据,你可以使用React上下文reactjs.org/docs/context.html这样可以解决你的问题吗? 是的,但我只是想避开上下文。 @trickysneak 有什么特殊原因要避免使用上下文,上下文是专门为具有类似“全局”的值而创建的? 【参考方案1】:

您应该使用 React 上下文,它与 useState 结合可以创建一个可由上下文的所有子级访问的值,其中所有使用它的组件将在更新其值时重新呈现。

const SidebarContext = React.createContext(false);

const SidebarProvider = ( children, initialValue = false ) => 
  const [isOpen, setIsOpen] = React.useState(initialValue);

  return (
    <SidebarContext.Provider value=[isOpen, setIsOpen]>
      children
    </SidebarContext.Provider>
  );
;

// this is not required, it is just the same as using React.useContext, 
// it just changes the two imports for useContext + SidebarContext,
// with a single useSidebar import.
// i left it here because you might want to do more stuff in here
const useSidebar = () => 
  const contextValue = React.useContext(SidebarContext);
  return contextValue;
;

// this is to showcase the shared value
const UsingSidebar1 = () => 
  const [isOpen] = useSidebar();

  return (
    <div className="bordered">
      <h5>UsingSidebar1 component</h5>
      Sidebar is: isOpen.toString()
    </div>
  );
;

// this is to showcase the shared value and how the change 
// updates all relevant components
const UsingSidebar2 = () => 
  const [isOpen, setOpen] = useSidebar();

  return (
    <div className="bordered">
      <h5>UsingSidebar2 component</h5>
      Sidebar is: isOpen.toString()
      <br />
      <button onClick=() => setOpen(!isOpen)>toggle</button>
    </div>
  );
;

const App = () => (
  <SidebarProvider initialValue=false>
    <UsingSidebar1 />
    <UsingSidebar2 />
  </SidebarProvider>
);

ReactDOM.render(<App />, document.body)
.bordered 
  margin: 0.5em;
  padding: 0.5em;
  border: 1px solid tomato;
  border-radius: 2px;


h5 margin:0 0 0.5em 0
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.production.min.js"></script>

【讨论】:

以上是关于如何在反应查询中存储本地状态?的主要内容,如果未能解决你的问题,请参考以下文章

如何将反应js状态保存到本地存储中

如何在反应`<input =“file”/>`中获取图像的绝对路径并将其存储在本地状态中?

如何编辑本地存储值反应?

如何将 TextInput 的值存储到本地存储并在应用程序以本机反应启动时获取它们?

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

如何使用 Nuxt.js 在 vuex 状态中获取本地存储数据