调试
在基本的应用程序中,console.log
可能是我们调试原子的最好朋友,但是当应用程序变得更大并且我们有更多的原子要使用时,日志记录就不是调试原子的好方法了。
Jotai 提供了两种调试原子的方式,React Dev Tools 和 Redux Dev tools。 对于读取值和简单的调试,React Dev Tools 可能适合您,但对于时间旅行和设置值等更复杂的任务,Redux Dev Tools 将是更好的选择。
调试标签
值得一提的是,我们在 Jotai 中有一个叫做 Debug labels 的概念,可以帮助我们进行调试。
默认情况下,每个 Jotai 状态都有像 1:<no debugLabel>
这样的标签,数字是自动分配给每个原子的内部 key
。 但是您可以为原子添加标签,以帮助您使用 debugLabel
更轻松地区分它们。
const countAtom = atom(0);// countAtom 的 debugLabel 默认是 'atom1'if (process.env.NODE_ENV !== "production") {countAtom.debugLabel = "count";// debugLabel 现在是 'count'}
Jotai 提供了一个 Babel 和一个 SWC 插件,它会自动为每个原子添加一个 debugLabel,这使我们的事情变得更容易。 有关详细信息,请查看 jotai/babel 和 @swc-jotai/debug -label
使用 React 开发工具
您可以使用 React 开发工具
检查 Jotai 状态。 实现 useDebugValue
在自定义 hook 中使用。 请记住,它仅适用于开发模式
(例如 NODE_ENV === 'development'
)。
使用原子
useAtom
为原子值调用 useDebugValue
,所以如果您在 React Dev Tools 中选择消耗 Jotai 原子的组件,您会看到组件中使用的每个原子的“Atom” hook 以及它现在具有的值 .
使用 AtomsDebugValue
useAtomsDebugValue
捕获 Provider 下的组件 树中的所有原子(或无提供者模式下的整个树),并且 useDebugValue
用于所有原子值。
如果您在 React Dev Tools 中导航到具有 useAtomsDebugValue 的组件,我们可以看到一个自定义 hook AtomsDebugValue
,它允许您查看所有原子值及其依赖项。
一个用例是将 hook 放在 Provider
组件下面:
const DebugAtoms = () => {useAtomsDebugValue();return null;};const Root = () => (<Provider><DebugAtoms /><App /></Provider>);
使用 Redux 开发者工具
您还可以使用 Redux DevTools 检查原子,具有时间旅行和值分配等许多功能。
useAtomDevtools
useAtomDevtools
是一个 React hook,用于管理特定原子的 ReduxDevTools 集成。
如果您有一个特定的原子需要调试,useAtomDevtools
可能是一个不错的选择。
const countAtom = atom(0)// 如果我们有更多原子,建议设置 countAtom.debugLabelfunction Counter() {const [count, setCount] = useAtom(countAtom)useAtomDevtools(countAtom)
现在,如果我们尝试 setCount,我们可以看到 Redux 开发工具会立即记录这些更改。
时间旅行
有时我们需要切换到原子状态的特定值,通过时间旅行这是可能的。 您可以将鼠标悬停在您在开发工具中看到的每个操作,并在那里看到 Jump 选项,单击它您就可以切换到该特定值。
暂停
如果我们不记录原子的变化,我们可以使用 Pausing 功能观察那些。
Dispatch
可以使用 Dispatch 功能在原子上设置值。 您可以通过单击 Show Dispatcher 按钮来执行此操作。
这会将 countAtoms
的值设置为 5。
我们应该注意,该值将由 JSON.parse 解析,因此请传递支持的值。
useAtomsDevtools
useAtomsDevtools
是useAtomDevtools
的包罗万象的版本,它显示 store 中的所有原子,而不是显示特定的原子。
如果您想在一个地方跟踪所有原子,我们建议您使用这个 hook。 这意味着放置在这个 hook 底部(在 React 树中)的每个原子上的每个动作都将被 Redux 开发工具捕获。
此 hook 支持 useAtomDevtools
的每个功能,但还有一个额外的功能,其中包括提供有关原子依赖项的更多信息,例如:
{"values": {"atom1:count": 0,"atom2:doubleCount": 0,"atom3:half": 0,"atom4:sum": 0},"dependents": {"atom1:count": ["atom1:count", "atom2:doubleCount", "atom4:sum"],"atom2:doubleCount": ["atom3:half", "atom4:sum"],"atom3:half": ["atom4:sum"],"atom4:sum": []}}
冻结原子
为了找到你不小心试图改变存储在原子中的对象的错误,你
可以使用 freezeAtom
或者
freezeAtomCreator
来自 jotai/utils
包。
它返回用 Object.freeze
深度冻结的原子值。