关于Slate框架Editor.nodes()函数匹配规则的疑问
问题解答:Slate Editor.nodes() 匹配规则解析
核心问题源于你对Editor.nodes配置中universal: true的作用理解偏差,以下针对两个困惑点逐一解释:
关于universal: true的核心作用
当设置universal: true时,Editor.nodes只会返回所有被选区覆盖的节点都满足match条件的节点集合。如果选区中存在任意一个节点不匹配规则,最终匹配结果会是空数组。
困惑点1:选中“this is”时返回false
假设你的文本被拆分为两个独立的Text节点:
- 节点1:
{ text: "this ", bold: undefined }(无加粗样式) - 节点2:
{ text: "is", bold: true }(有加粗样式)
当你选中“this is”时,选区同时覆盖这两个节点。由于universal: true要求所有被覆盖节点必须全部满足node.bold === true,但第一个节点不满足条件,因此Editor.nodes返回空数组,最终matchArray[0]为undefined,函数返回false。
困惑点2:选中“is editable”时返回false
同理,此时选区覆盖两个Text节点:
- 节点1:
{ text: "is", bold: true }(有加粗样式) - 节点2:
{ text: " editable", bold: undefined }(无加粗样式)
你在控制台看到的ret value: true只是单个节点的匹配结果,但universal: true的规则会过滤掉所有不满足“全节点匹配”的结果,因此最终matchArray仍然是空数组,函数返回false。
逻辑调整建议(可选)
如果你希望按钮状态为「只要选区中有任意文本加粗就返回true」,只需将universal改为false:
const matchList = Editor.nodes(editor, { match: (node) => node.bold === true, universal: false, // 修改为false });
此时只要选区中存在至少一个加粗的Text节点,matchArray就会包含该节点,函数返回true。
若你的需求是「只有全部选中文本都加粗时才返回true」,当前逻辑是符合预期的,返回false是正常行为。
内容的提问来源于stack exchange,提问作者shiqin zhang
相关产品推荐
相关产品推荐

