Skip to content

元素

PreffX 直接将 JSX 标记转换为 DOM 元素。这允许您使用信号配置属性、属性和事件监听器的详细响应性。

实现特性:

  1. 响应性:使用信号系统(@preact/signals-core)来跟踪属性的变化
  2. 生命周期管理:元素被移除时自动删除事件处理程序和订阅
  3. 属性名称转换:将 camelCase 转换为 kebab-case 用于属性
  4. 命名空间支持:支持 HTML、SVG 和 MathML 元素

元素参数

$ 开头的参数直接设置 DOM 元素属性。如果将信号作为值传递,则该属性将与该信号同步:

tsx
// 静态属性
<div
  $innerHTML='<p>Content</p>'
></div>

// 动态属性
const textContent = signal('Text');
<div
  $textContent={textContent}
></div>

on 开头的参数作为事件监听器处理。您可以传递简单的处理函数或带有修饰符的对象。如果将信号作为值传递,则处理程序将与该信号同步:

tsx
// 静态事件监听器
<div
  onClick={() => console.log('clicked')}
></div>

// 带修饰符的静态事件监听器
<div
  onClick={{
    handler: () => console.log('Click'),
    // 阻止默认行为
    prevent: true,
    // 停止传播
    stop: true,    
    // 监听器在调用后会自动移除
    once: true,
    // 监听器永远不会调用 preventDefault()
    passive: true,
    // 事件将在 DOM 树中位于其下方的任何 EventTarget 之前分派给注册的监听器
    capture: true
  }}
></div>

// 动态事件监听器
const clickListener = signal(() => console.log('Click'));
<div
  onClick={clickListener}
></div>

其余参数作为属性进行处理:

tsx
// 静态属性
<div
  id='my-id'
  data-value='123'
  style='color:red;font-size:16px;'
  class='active'
>
</div>

<div
  style={{
    color: 'red',
    fontSize: '16px'
  }}
  class={{
    active: true,
    passive: false
  }}
>
</div>

// 动态属性
const classNames = signal(['active', 'base']);
<div
  class={classNames}
></div>

元素引用

$ref 参数允许您获取 DOM 元素的引用:

tsx
// 您可以使用回调
let elementRef;
<div
  $ref={(el) => { elementRef = el; }}
></div>
// 或信号
const signalRef = signal();
<div
  $ref={signalRef}
></div>

命名空间

通常不需要,但您可以使用 $ns 参数显式指定元素的命名空间:

tsx
<svg>
  <a $ns='svg'></a>
</svg>

根据 Apache-2.0 许可证发布。