Skip to content

两种模式 ​

mode 默认是 design,页面 / 变量 / 二维码 / 水印 / 打印扩展默认注册,工具栏默认给出 ["template", "font", "paragraph", "insert", "table", "page", "watermark"] 七组。

内容用 createStarterDocument() 装一份真实文档,第一次打开就能看到主标题、二级标题、正文、 金额变量(小写与中文大写各一次)、普通表格、无边框布局表和一个二维码 —— 空文档也能用,只是这些 能力都得自己先写一遍 ProseMirror JSON 才看得见。二维码节点只存内容,位图是异步生成的,所以 同步的工厂没法把它一起给你;宿主也不必为此做任何事:二维码扩展在文档打开后会为每一个「有载荷、 还没有位图」的节点补上位图,不需要谁记得调 regenerateQRCode()。

填写模式 ​

填写模式的文档是只读的,工具栏默认不渲染,变量按值显示。唯一的例外是「模板」页签:模板如果 不是由 template(kind: "remote")定死的,打印员就得能自己挑一份本机模板来填,所以那时只 渲染这一个页签。填写数据通过 data 传入,按变量的 key 查表(company.name 这样的点号路径 同样有效)。

填写模式

点「打开填写对话框」可以看到按变量类型生成的表单。

填写模式,文档只读;点右侧按钮打开填写对话框。

同一个组件的两种用法,模式决定了几乎其他一切:

design 设计fill 填写
用途编写模板填好并打印
文档可编辑只读
工具栏按 tools 渲染默认不渲染,只在模板没被 template 定死时渲染「模板」一个页签
变量显示为带标签的徽标,点击可编辑显示为解析后的值
持久化保存模板不保存任何东西
模板列表按源的 load 策略默认等操作员手动载入
页面设置可改纸张 / 方向 / 页边距只读

mode 是响应式的。当前实现会 watch 模式并就地 setEditable()、通知变量的渲染层重画, 文档和选区都不受影响,所以设计 ↔ 填写可以随时来回切,切回去时不需要重新载入模板。

模式切换

同一个 SEditor 实例、同一份文档、同一个选区。

当前模式:设计 design
vue
<script setup lang="ts">
import { ref } from "vue";
import type { EditorMode } from "@snail-js/editor";

const mode = ref<EditorMode>("design");
</script>

<template>
  <!-- 或者 v-model:mode,组件会 emit update:mode -->
  <SEditor v-model="doc" :mode="mode" :data="values" @update:mode="mode = $event" />
</template>

design?: boolean 是 mode 的旧写法,仍然接受,但两者同时给出时 mode 优先。

基于 MIT 许可发布