Back to Plate

存储

docs/api/core/plate-store.cn.mdx

1.0.05.8 KB
Original Source

Plate 使用 jotai-x 来存储编辑器的状态。

Plate 存储

<API name="Store"> `PlateStoreState` 对象存储了 Plate 编辑器的状态。它包含了编辑器的 ID、当前值、插件以及其他设置的信息。 <APIState> <APIItem name="editor" type="PlateEditor"> Plate 编辑器的引用。
  • 默认值: createPlateFallbackEditor() </APIItem>
<APIItem name="id" type="string"> 用作 provider 作用域的唯一 ID。如果在同一个 React 树中有多个 `Plate`,请使用它。
  • 默认值: 随机 ID </APIItem>
<APIItem name="containerRef" type="React.RefObject<HTMLDivElement>"> 编辑器容器元素的引用。 </APIItem> <APIItem name="decorate" type="function" optional> 用于装饰编辑器中范围的函数。
ts
(options: { editor: PlateEditor; entry: NodeEntry }) => TRange[]
</APIItem> <APIItem name="isMounted" type="boolean" optional> `Editable` 是否已渲染,以便 slate DOM 可解析。 </APIItem> <APIItem name="onChange" type="function" optional> 编辑器状态变化时的受控回调函数。
ts
(options: { editor: PlateEditor; value: ValueOf<PlateEditor> }) => void
</APIItem> <APIItem name="onSelectionChange" type="function" optional> 编辑器选区变化时的受控回调函数。
ts
(options: { editor: PlateEditor; selection: TSelection }) => void
</APIItem> <APIItem name="onValueChange" type="function" optional> 编辑器子节点变化时的受控回调函数。
ts
(options: { editor: PlateEditor; value: ValueOf<PlateEditor> }) => void
</APIItem> <APIItem name="onNodeChange" type="function" optional> 节点操作发生时的受控回调函数。
ts
(options: {
  editor: PlateEditor;
  node: Descendant;
  operation: NodeOperation;
  prevNode: Descendant
}) => void

参数:

  • editor: Plate 编辑器实例
  • node: 操作后的节点
  • operation: 发生的节点操作(insert、remove、set、merge、split、move)
  • prevNode: 操作前的节点

注意: 对于 insert_noderemove_node 操作,nodeprevNode 包含相同的值,以避免空值情况。 </APIItem>

<APIItem name="onTextChange" type="function" optional> 文本操作发生时的受控回调函数。
ts
(options: {
  editor: PlateEditor;
  node: Descendant;
  operation: TextOperation;
  prevText: string;
  text: string
}) => void

参数:

  • editor: Plate 编辑器实例
  • node: 包含变化文本的父节点
  • operation: 发生的文本操作(insert_textremove_text
  • prevText: 操作前的文本内容
  • text: 操作后的文本内容 </APIItem>
<APIItem name="primary" type="boolean" optional> 编辑器是否是主要的。如果没有活跃的编辑器,PlateController 将使用第一个挂载的主要编辑器。
  • 默认值: true </APIItem>
<APIItem name="readOnly" type="boolean" optional> 编辑器是否为只读模式。 </APIItem> <APIItem name="renderElement" type="function" optional> 渲染编辑器中元素的函数。 </APIItem> <APIItem name="renderLeaf" type="function" optional> 渲染编辑器中叶子节点的函数。 </APIItem> <APIItem name="versionDecorate" type="number" optional> 调用 `redecorate` 时递增的版本号。这是 `decorate` 函数的依赖项。 </APIItem> <APIItem name="versionEditor" type="number" optional> 每次编辑器变化时递增的版本号。 </APIItem> <APIItem name="versionSelection" type="number" optional> 每次编辑器选区变化时递增的版本号。 </APIItem> <APIItem name="versionValue" type="number" optional> 每次编辑器子节点变化时递增的版本号。 </APIItem> </APIState> </API>

访问存储

ts
import { usePlateStore, useEditorRef, useEditorPlugin } from 'platejs/react'

// 直接访问存储
const store = usePlateStore(id?)

// 通过编辑器引用访问
const store = useEditorRef().store

// 通过插件上下文访问
const store = useEditorPlugin(myPlugin).store

注意:id 参数是可选的,默认使用最近的编辑器。

存储钩子

以下钩子可用于与 Plate 存储交互:

ts
import { usePlateState, usePlateValue, usePlateSet } from 'platejs/react'

usePlateState

获取和设置存储属性的值。

ts
const [readOnly, setReadOnly] = usePlateState('readOnly', id?)

usePlateValue

订阅存储属性的值。

ts
const readOnly = usePlateValue('readOnly', id?)

usePlateSet

设置存储属性的值。

ts
const setReadOnly = usePlateSet('readOnly', id?)

事件编辑器存储

该存储是一个对象,其属性键是事件名称(例如 'focus'),属性值是编辑器 ID

  • 这在有多个编辑器时非常有用,可以根据 DOM 事件(例如最近聚焦的编辑器)获取一个编辑器。
  • Plate 的核心插件之一将存储以下事件。
<API name="EventEditorStore"> <APIState> <APIItem name="blur" type="string | null">

最近失去焦点的编辑器 ID。

</APIItem> <APIItem name="focus" type="string | null">

当前正在聚焦的编辑器 ID。

</APIItem> <APIItem name="last" type="string | null">

最近的编辑器 ID。

</APIItem> </APIState> </API>
ts
import { EventEditorStore, useEventEditorValue } from 'platejs'

// 获取值
const focusedId = EventEditorStore.get('focus')

// 设置值
EventEditorStore.set('focus', editorId)

// 订阅变化
const focusedId = useEventEditorValue('focus')

useEventPlateId

获取最近的事件编辑器 ID。

<API name="useEventPlateId"> <APIParameters> <APIItem name="id" type="string | null">

如果定义了,则返回该 ID。

</APIItem> </APIParameters> <APIReturns type="string"> 如果可用,则返回上下文中的 plate id,否则返回最近的事件编辑器 ID 或 `PLATE_SCOPE`。 </APIReturns> </API>