reactjs - 同步加载 React Provider 组件的模式
问题描述
我的 :brain: 正在爆炸。
在我的应用程序的根目录中,我想设置一个 UserProvider(下面的简化版本)。
我希望它的所有消费者都相信 Provider 拥有用户。
通过以下实现,我需要对每次使用进行空检查:
const userContext = useContext(UserContext)
const userId = userContext!.id // I do not want that bang(!)
我目前的实现:
interface IUserContext {
id: string
email: string
}
const UserContext = React.createContext<IUserContext|null>(null);
const UserProvider: React.FC = ({ children }) => {
const [user, setUser] = useState(initalContext);
const [loading, setLoading] = useState(true);
useEffect(() => {
client
.query<CurrentUserQuery>({
query: currentUserQuery
})
.then((res) => {
if (res.error) {
logger(res.error);
}
if (res.data.me) {
setUser(res.data.me);
setLoading(false);
}
});
});
if (loading) {
return <Loading />;
}
return <UserContext.Provider value={user}>{children}</UserContext.Provider>;
};
我知道我可以做类似的事情:
const emptyUser = {
id: '',
email: ''
}
const UserContext = React.createContext(emptyUser);
但这对我来说真的很难闻。
有没有人想出一个干净的解决方案?
谢谢!
解决方案
您声明您的上下文接受 aIUserContext
或null
,这就是您需要 bang! 的原因。
从上下文中解包 a 的解决方案是User
如果用户是抛出异常null
(无论如何都不应该发生这种情况?)。然后 Typescript 会推断出您的用户实际上不是 null 而是实际的User
const userContext = createContext<User | null>(null)
const useUser = (): User => {
const user = useContext(userContext)
if (user === null) {
throw new Error('You forgot the provider')
}
return user // This is a User
}
推荐阅读
- node.js - Solidity:ParserError:预期的编译指示、导入指令或合同/接口/库定义
- android - RecyclerView 不显示项目
- mysql - 为什么 sqlite .dump 加密数据到 x'2384934..' 而不是原始数据?
- javascript - 画布到图像 base64 编码的 url 不显示图像
- android - 测试 ION 驱动程序时,libion 中的 DMAReadCached 失败
- android - 为什么 Chronometer 类中的 isTheFinalCountDown 方法会打开 YouTube 视频?
- javascript - table row not append to division table through javascript
- asp.net-mvc - Sending large data to wcf service returns me "504 (Gateway Time-out) error"
- c# - EF Core: How to ensure only one thread is updating a DB having async calls?
- javascript - 如何使用 ID 销毁画布并将新画布添加到同一 ID