如下是一个自定义Hook:
export const useImplementWidgets = (widgets: WidgetSchema[]): React.ReactNode => {
const topLevelWidgets = useMemo(() => getTopLevelWidgets(widgets), [widgets]);
return (
<React.Fragment>
{topLevelWidgets.map((widget) => (
<ImplWidget key={widget.id} widget={widget} />
))}
</React.Fragment>
);
};
我发现定义Hook和定义普通的js函数对比,除了use开头的命名规范之外没有任何差异:
1、请问定义Hook和定义普通的js函数还有哪些区别吗?
2、自定义 Hook 可以调用其他的 React Hook,如 useState, useEffect 等。普通函数不能这样做。请问这个是如何实现这个约束的呢(普通函数不能这样使用,是运行时检查use开头的函数吗)?
3、使用位置:自定义 Hook 只能在 React 函数组件或其他 Hook 中调用,而不能在普通 JavaScript 函数中使用。请问这个是如何实现的呢?
4、上下文访问:自定义 Hook 可以访问 React 的上下文(如通过 useContext),普通函数则不能。请问这个是Hook和Js自定函数的差异是如何实现的呢?
或许2.3.4 是一个问题,那就是Hook能实现的功能是什么机制让它和普通js函数不能实现此功能相区别开来的。
这是因为 React 在渲染组件的时候提供了渲染上下文。例如 React 通过链表保存组件的状态信息,useState 定义组件状态时就是在操作这个链表。这个上下文通过
resolveDispatcher
获取,如果上下文为空,那么在开发模式下将打印一个警告