网站搜索

javascript - SolidJS - 如何获取当前组件实例


是否有一种方法可以访问实例/获取当前在 SolidJS 中渲染/激活的组件的引用,从而访问其当前的 props、信号、内部状态、效果等?

我正在寻找类似 React 的 __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner(但也可以在生产环境中使用)或 Svelte 的运行时内部 get_current_component() 的东西。给一点背景,我之所以需要它,是因为我正在构建一个库,该库提供的函数应该能够访问当前使用该函数的组件的 props。

我尝试过使用 SolidJS getOwner(),但我不确定自己是否理解了它。我找不到关于组件当前 props、信号或副作用的任何参考。

有没有什么方法可以在 Solid 中实现它,或者有没有什么“技巧”可以实现类似的效果?

提前谢谢

答案#1

由于 Solid 的工作原理以及它处理“组件”的方式,这类东西是有限的、不可用的,或者仅在开发中可用。在生产中,Solid 会丢弃它不需要的部分。

问题是,“组件实例”在 Solid 中本身并不存在,这与 Svelte 或 React 不同。它只是信号和反应的图。什么是组件?只是一个返回一些 DOM 元素的函数,通过将它们添加到图中来创建一些信号和计算,然后……它会被垃圾回收,仅此而已。生产环境中的组件与任何其他函数(hook)没有区别。

当然,该图在某种程度上仍然可以分析。(在生产环境中稍微少一点)你可以看到所有的计算(createEffect、createMemo 等)以及它们当前观察的信号。除此之外没有太多内容。可能还有上下文。我们理解的 Props —— 一个由父组件传给子组件的响应式对象 —— 只是一个带有一些 getter 的对象传给某个函数 —— 它并不存在于响应式图中作为独立实体。你仍然可以访问其中的信号 —— 但前提是它们被用于某些效果中 —— 响应式图的某个节点会引用它们。

有点像这样:https://playground.solidjs.com/?hash=597826062&version=1.4.1

所以,如果你正在创建一个打算在生产环境中使用的库——我宁愿建议你通过参数/属性明确提供你想要的数据,而不是通过访问内部来获取。

但是如果你想在开发过程中对反应性图进行一些可视化,你可以查看这个调试器的源代码:https://github.com/thetarnav/solid-devtools/tree/main/packages/debugger