Skip to content

各框架接入 ​

同一个组件在四种环境下的写法。差异只在语法层,行为完全一致 —— 这一点由跨框架端到端测试保证: 同一套用例分别跑四个示例应用,每个应用跑 Chromium 桌面、Chromium 移动与 WebKit 桌面三种环境。

React / Next.js ​

tsx
import { PtButton, PtInput } from '@ptengine/ui-react';

export function Form() {
  const [value, setValue] = useState('');

  return (
    <>
      <PtInput value={value} onPtChange={event => setValue(event.detail)} />
      <PtButton variant="brand" onClick={submit}>
        提交
      </PtButton>
    </>
  );
}

内核里的事件是 ptChange,React 侧生成 onPtChange,event.detail 带类型。

Vue 3 / Nuxt ​

vue
<script setup lang="ts">
import { PtButton, PtInput } from '@ptengine/ui-vue';

const value = ref('');
</script>

<template>
  <PtInput v-model="value" />
  <PtButton variant="brand" @click="submit">提交</PtButton>
</template>

表单类组件已配好 v-model:文本控件绑 value,勾选类绑 checked,切换按钮(PtToggle)绑 pressed, 折叠面板(PtCollapsible)绑 open,出口都是 ptChange。

Angular 19+ ​

ts
import { PtButton, PtInput, TextValueAccessor } from '@ptengine/ui-angular';

@Component({
  standalone: true,
  imports: [FormsModule, PtButton, PtInput, TextValueAccessor],
  template: `
    <pt-input [(ngModel)]="value" name="q"></pt-input>
    <pt-button variant="brand" (click)="submit()">提交</pt-button>
  `
})
export class FormComponent {
  value = '';
}

别忘了 value accessor

standalone 组件必须在 imports 里显式带上用到的 accessor,否则 ngModel 找不到 accessor, 整棵变更检测会在第一次渲染就抛异常 —— 症状是「所有绑定都不更新」, 很容易误判成组件本身坏了。

accessor绑定的属性覆盖的元素
TextValueAccessorvalueinput、textarea、select、radio-group、tabs、accordion、menu-group、toggle-group、slider、native-select、combobox
BooleanValueAccessorcheckedcheckbox、switch
PressedValueAccessorpressedtoggle
OpenValueAccessoropencollapsible

原生 HTML ​

html
<pt-input id="q" placeholder="关键词"></pt-input>
<pt-button variant="brand">提交</pt-button>

<script type="module">
  document.querySelector('#q').addEventListener('ptChange', event => {
    console.log(event.detail);
  });
</script>

Svelte、Solid 等 ​

这些框架对自定义元素支持良好,不需要包装层:

bash
npm i @ptengine/ui
svelte
<script>
  import '@ptengine/ui/components/pt-button.js';
</script>

<pt-button variant="brand" on:click={submit}>提交</pt-button>

属性传值的一条通则 ​

字符串、数字、布尔可以走 attribute;对象和数组只能走 property。 原生 HTML 下 attribute 只能传字符串,所以复杂数据一律用 JS 赋值:

js
document.querySelector('pt-slider').value = [20, 80];

React / Vue / Angular 的包装层会自动判断该用哪种方式,你不用操心。

Apache-2.0 协议开源