Selection 模块包
Lexical 提供了一个 @lexical/selection 模块包,其中有一些关于选区的实用方法。
参考
- lexical-selection - Github
- @lexical/selection - documentation
注意
其中有一些方法的名称以 $ 符号开头,它们大部分是用于修改编辑器状态 EditorState 的,一般只能在 editor.update(callbackFn) 的回调函数 callbackFn 中实用
选区相关
$selectAll(selection)将给定的范围选区selection进行扩展(通过调整选区的 anchor 锚定一端和 focus 移动焦点一端),全选编辑器的所有内容$moveCaretSelection(selection, isHoldingShift, isBackward, granularity)根据给定的参数调整/修改给定的范围选区selection(可以用于移动或扩展一个「逻辑」单位 logical unit 选区范围)
它所接受的参数selection参数:需要调整的范围选区isHoldingShift参数:一个布尔值,表示当前是否按下Shift键(如果是则对选区进行扩展,否则对选区进行移动)isBackward参数:一个布尔值,表示选区的 focus 可移动的一端是否在 anchor 锚定一端之前(如果为true则调整选区需要反向调整,以保证在 focus 一端发生移动)granularity参数:可以是"character"|"word"|"lineboundary"这三个值之一,以表示调整的颗粒度/单位(按照"character"字符、"word" 单词还是 "lineboundary" 一行作为一个「逻辑」单位)
提示
如果选区的移动是按照
character字符作为单位,也可以使用$moveCharacter(selection, isHoldingShift, isBackward该方法其实是对以上方法的封装,针对当granularity参数设置为character时的一个别名/简化方法$shouldOverrideDefaultCharacterSelection(selection, isBackward)返回一个布尔值,以表示是否需要改变选取的默认行为(默认的选取行为是按照字符 character 来选取 ❓ )
参数isBackward是一个布尔值,表示选区的 focus 可移动的一端是否在 anchor 锚定一端之前
基于下一个节点的类型而定,如果下一个节点类型是块级的 ElementNode 元素节点或 DecoratorNode 装饰节点,则返回true提示
一般用于配合 DecoratorNode 节点使用,例如在富文本编辑器中,通过为
KEY_ARROW_LEFT_COMMAND和KEY_ARROW_RIGHT_COMMAND指令设置响应函数,「劫持」/自定义这些按键的行为,当选区/光标的下一个节点是装饰节点时,不采用默认行为,而设置其他行为以提供用户更符合直觉的操作createDOMRange(editor, anchorNode, _anchorOffset, focusNode, _focusOffset)基于给定节点anchorNode和focusNode,以及偏移量_anchorOffset和_focusOffset,创建一个 DOM 原生的 Range 选区范围createRectsFromDOMRange(editor, range)基于 DOM 原生的选区范围range创建一个 DOMRect,便于编辑器在屏幕中定位选区/光标的位置DOMRect
DOMRect 描述页面上的一个矩形的大小和位置,例如使用方法
Range.getBoundingClientRect()所返回的 DOMRect 对象描述了选区范围所对应的矩形。
节点相关
$cloneWithProperties(node)基于给定的节点node创建一个拷贝,它不仅具有相同的属性,而且还会设置好相同的父节点、前后兄弟节点,但是具有不同的 key 唯一标识符$isAtNodeEnd(point)返回一个布尔值,以判断给定的选区端点point是否位于某个节点的末尾$isParentElementRTL(selection)返回一个布尔值,以表示包裹给定的范围选区selection的节点(父节点,基于选区的 anchor 锚定「不动」的一端获取的父节点)的文本书写方式是否为 RTL 从右往左$setBlocksType(selection, createElement)将选区selection中的元素节点(而且是 block 块级元素类型)替换 replace 为给定的节点类型。参数crateElement是一个函数,它会返回一个元素节点(或其子类)$sliceSelectedTextNodeContent(selection, textNode)对给定的文本节点textNode的内容进行 slice 「裁剪」,只保留该文本节点被选区selection选中的部分内容。返回依然是该文本节点(但是其内容可能会被删除了部分)$wrapNodes(selection, createElement, wrappingElement?)将选取selection中的节点用 ElementNode 元素节点进行包裹,并插入 append 到给定的目标节点wrappingElement中selection参数:一个选区,其中的节点需要进行包裹crateElement参数:一个函数,该函数返回一个 ElementNode 元素节点(或子类),作为容器(用于包裹选区中的节点)wrappingElement(可选)参数:一个 ElementNode 元素节点,作为定位节点(经过包裹的节点会插入到该节点内)
trimTextContentFromAnchor(editor, anchor, delCount)从当地选区的 anchor 锚定点开始,向前删除特定数量delCount字符
如果删除的字符量大于锚点所在的节点,则会继续向前删除(邻近节点或父节点的)内容。如果是文本节点且内容全被删除,则该文本节点也会被移除;如果是祖先节点,则保留2个空格的缩进 ❓
样式相关
$addNodeStyle(node)从给定的文本节点node中提取出 CSS 样式(字符串形式),并解析为对象形式,暂存到一个映射里 ❓ 进行标准化,以及配合$patchStyleText(selection, path)使用 ❓$getSelectionStyleValueForProperty(selection, styleProperty, defaultValue?)在选区selection中寻找给定的 CSS 样式属性styleProperty的属性值(字符串)。
有多种情况- 如果选区有「预设」该 CSS 样式的属性,则优先返回其值
- 如果选区没有「预设」该 CSS 样式的属性,则分析选区中所有的 TextNode 文本节点,寻找这些节点针对 CSS 样式属性
styleProperty所设置的值。只有当应这些文本节点针对 CSS 样式属性都设置了相同的值,才返回其属性值,否则返回 '' - 最后一个(可选)参数
defaultValue是用于设置默认的样式值
$patchStyleText(selection, patch)将给定的 CSS 样式patch应用到选区中的 TextNode 文本节点
参数patch是一个对象,其中属性名称是各种 CSS 样式的属性,属性值是相应的 CSS 样式值
该方法可能会对文本节点执行节点分割 splitting 操作,以便只针对选中的部分字符设置 CSS 样式getStyleObjectFromCSS(css)解析传入的css行内样式(字符串形式),返回一个对象(其中属性名称是各种 CSS 样式的属性,属性值是相应的 CSS 样式值)