【发布时间】:2021-10-23 10:27:19
【问题描述】:
说到状态集中,我知道如何使用 context api 和 Redux。但是要恢复这种状态,我们总是必须在 react 组件中。
在一个不在 React 组件内部的通用函数中访问全局状态/变量的最佳策略是什么?
在环境变量中不是一个选项,因为该值在应用程序运行后更改。而且出于安全原因,我不想放入 cookie 或本地存储。
索引.ts
import React from 'react';
import ReactDOM from 'react-dom';
import { ApolloProvider } from 'react-apollo';
import apolloClient from './services/apollo';
import { PersonalTokenProvider } from './providers/personal-token';
import './index.css';
import App from './App';
ReactDOM.render(
<React.StrictMode>
<PersonalTokenProvider>
<ApolloProvider client={apolloClient}>
<App />
</ApolloProvider>
</PersonalTokenProvider>
</React.StrictMode>,
document.getElementById('root'),
);
PresonalToken 上下文提供者
import React, { useState } from 'react';
interface ProviderProps {
children: JSX.Element[] | JSX.Element;
}
export const PersonalTokenContext = React.createContext({});
export const PersonalTokenProvider: React.FC<ProviderProps> = (
props: ProviderProps,
) => {
const [token, setToken] = useState<string | null>(null);
const { children } = props;
return (
<PersonalTokenContext.Provider value={{ token, setToken }}>
{children}
</PersonalTokenContext.Provider>
);
};
apollo 客户端配置
import { useContext } from 'react';
import { ApolloClient } from 'apollo-client';
import { HttpLink } from 'apollo-link-http';
import { InMemoryCache } from 'apollo-cache-inmemory';
import { PersonalTokenContext } from '../providers/personal-token';
//cant do this
const {token} = useContext(PersonalTokenContext)
const httpLink = new HttpLink({
uri: 'https://api.github.com/graphql',
headers: {
authorization: `Bearer ${token}`,
},
});
const client = new ApolloClient({
link: httpLink,
cache: new InMemoryCache(),
});
export default client;
【问题讨论】:
-
我想你错过了
useSelector, react-redux.js.org/api/hooks ? -
老兄,我在玩 github graphQL api,我想让用户插入个人令牌,之后它必须可供 ApolloClient 使用。我不认为创建一个数据库只是为了保存它是一种选择。
-
表单组件将 update a token context,自定义 apollo 提供程序(带有中间件链接)将使用该上下文来设置正确的标题。
-
@EmileBergeron 我真的不想为此使用 redux,我会更新我的问题,以便您可以看到我在做什么,我想我明白了中间件的意义
-
@EmileBergeron 已更新
标签: javascript reactjs react-native