solid-js - 如何在 Solid.js 中使用 Ref?

标签 solid-js

所以我正在学习并开始使用Solid.js,我想知道我们如何处理solid.js中的ref,就像react中的useRef一样。

我检查了文档,我尝试了这样的事情:

      let navigationOuterRef: HTMLDivElement
      let navigationRef: HTMLUListElement
    
     const MenuNavbar = (props: {layoutDatas: LayoutNavigation[]}) => {
        
       const [priorityItems, setPriorityItems] = createSignal<LayoutNavigation[]>(props.layoutDatas);
      
      //....
    
      return (
        <div ref={navigationOuterRef} class="....">
          <ul ref={navigationRef} class="...">
            <For each={priorityItems()}>
              {(labelName) => (
                <li class="flex items-center cursor-pointer">
                  {labelName.label}
                </li>
              )}
            </For>
          </ul>
        //...

它有效...但我收到了类似的警告消息

computations created outside a createRoot or render will never be disposed

所以我认为问题是我在组件外部创建了引用,因此如果没有适当的上下文,如果卸载它就无法处理它,但是如果我在组件中移动引用声明,我在 TS 中会出现此错误

Variable 'navigationOuterRef' is used before being assigned.

那么我做错了什么,正确的方法是什么?

最佳答案

是的,组件要求您在正确的所有者下运行它们,即 render 函数,或者通过 createRoot 函数或其他组件创建的根。这是构建所有权图所必需的,该图显示谁拥有谁,以便在处置组件时,其资源将被清理。因此,警告消息与 refs 无关,而是与在响应式上下文之外创建的组件有关。

除此之外,refs 是底层 DOM 节点的句柄。它们有两种类型:变量和函数。

变量表单要求您使用 onMount 钩子(Hook),因为当组件加载时, ref 将是未定义的,只有在渲染阶段完成后它们才指向实际的 DOM 元素。

let ref;

console.log(ref); // undefined

onMount(() => console.log(ref)); // div

<div ref={ref} />

为什么它们不能立即可用是因为 Solid 在构建 DOM 树时运行赋值操作。

<div ref={el => ref=el} /> 

变量形式基本上是函数形式的语法糖。

由于 ref 最初不可用,因此 ref 元素的正确类型是:

let navigationOuterRef: HTMLDivElement | undefined;

如果不输入undefined,则会出现类型错误:

Variable 'X' is used before being assigned

一旦 DOM 节点可用,函数表单就会接收 DOM 元素:

function handleRef(ref: HTMLDivElement) {
  console.log(ref); // div
}

<div ref={handleRef} />

编译后的代码在创建 DOM 树时调用 ref 函数。

https://www.solidjs.com/docs/latest#ref

关于solid-js - 如何在 Solid.js 中使用 Ref?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76671464/

相关文章:

typescript - 如何获取 solidjs 信号的先前值?

javascript - 如何向同一个 HTML 元素上的 Solid.js 组件添加多个事件处理程序?

solid-js - Solid App Router 元素不是渲染组件 - 对象对象

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

typescript - 使用 :___ throw errors for typescript in JSX 的 SolidJS 指令

javascript - SolidJS - 如何使用外部依赖触发 createEffect?

solid-js - 全局状态的 `createContext()` 和 `createSignal()` 之间的区别

typescript - 相当于 React.HTMLProps<...> 的 Solid JS

typescript - 使用 SolidJS 中的 fetch API 渲染远程数据

typescript - Solid.js <select> onchange 事件 : Property 'value' does not exist on type 'EventTarget'