【发布时间】:2021-06-02 01:50:01
【问题描述】:
我希望有条件地调用 useContext。这是我的原始代码,可以正常运行,但是 tslint 失败。
调用 useResourceScope 的组件 - 比如说 Component1
import { useEffect } from 'react';
export function useSubscribeListItemStore(
inputResources?: ResourceScope
) {
const resources = inputResources || useResourceScope();
const listItemStore = resources.consume(listItemStoreKey);
useEffect(function subscribeListItemStore() {
// do some logic
}, []);
}
定义 useResourceScope 的组件 - 比如说 Component2
import { createContext } from 'preact';
import { useContext } from 'preact/hooks';
export const ResourceScopeContext = createContext<ResourceScope | undefined>(undefined);
export function useResourceScope(): ResourceScope {
const resources = useContext(ResourceScopeContext);
if (!resources) {
throw new Error(
'error message'
);
}
return resources;
}
这给了我一个 tslint 错误:(react-hooks-nesting) 条件表达式中不能使用钩子
这是我解决此问题的尝试,但不起作用。它运行不正确,并且在 Component2 中的 useContext 行失败 我的想法是,由于 useContext 必须 被调用为了修复 tslint 错误,我决定使用不同的创建上下文有条件地调用 useContext。如果传入变量inputResources,它会调用useContext,并使用名为PlaceHolderContext 的占位符上下文,它会忽略并返回inputResources。如果不是,它会使用预期的ResourceScopeContext 值来处理useContext。
调用 useResourceScope 的组件 - 比如说 Component1
import { useEffect } from 'react';
export function useSubscribeListItemStore(
inputResources?: ResourceScope
) {
const resources = useResourceScope(inputResources);
const listItemStore = resources.consume(listItemStoreKey);
useEffect(function subscribeListItemStore() {
// do some logic
}, []);
}
定义 useResourceScope 的组件 - 比如说 Component2
import { createContext } from 'preact';
import { useContext } from 'preact/hooks';
export const ResourceScopeContext = createContext<ResourceScope | undefined>(undefined);
export function useResourceScope(inputResources?: ResourceScope): ResourceScope {
const PlaceHolderContext = createContext({ foo: 'bar' });
const createdContext = inputResources ? PlaceHolderContext : ResourceScopeContext;
const resources = useContext(createdContext as any);
if (inputResources) {
return inputResources;
}
if (!resources) {
throw new Error(
'error message'
);
}
return resources as any;
}
您能建议我如何在不破坏它的情况下解决 tslint 错误吗?
【问题讨论】:
标签: reactjs react-hooks preact use-context createcontext