我需要创建一个自定义钩子,该钩子应该包含将在我的页面中所有地方使用的所有处理程序。我的要求是;
因此,创建了一个 useHandlers 钩子sandbox
但是,由于 LogHandler不是函数
,因此无法从页面访问LogHandler有什么主意吗?
答案 0 :(得分:0)
为什么要获取LogHandler is not a function
的问题是因为它是undefined
,并且只有在调用HandlerComp
时才会被初始化:
export const userHandlers = (): IUseHandlers => {
// initialization skipped, so `LogHandler` is undefined
let LogHandler: () => void;
const HandlersComp: React.FunctionComponent<HandlersProps> = (
props: HandlersProps
) => {
// initialized here, but that's after `HandlersComp` gets caled
LogHandler = () => {
console.log("Hi from LogHandler");
};
return <></>;
};
return { HandlersComp, LogHandler };
}
我建议您像这样从HandlersComp
中移出初始化步骤:
export const useHandlers = (): IUseHandlers => {
const LogHandler: () => void = () => {
console.log("Hi from LogHandler");
};
const HandlersComp: React.FunctionComponent<HandlersProps> = (
props: HandlersProps
) => {
LogHandler()
return <></>;
};
return { HandlersComp, LogHandler };
};
一些注意事项:
HandlersComp
看起来应该是一个单独的可重用组件,而不是hook
LogHandler
看起来更像是一个实用函数,而不是hook
LogHandler
不应使用PascalCase
进行命名,因为应该为React
组件“保留”该名称; HandlersComp
很好,因为它看起来像是一个组件