0

我试图通过查看富文本示例来理解 Slate.js ,但我遇到了以下我不理解的代码片段。

const isBlockActive = (editor, format) => {
    const [match] = Editor.nodes(editor, {
      match: n => n.type === format,
  })

  return !!match
}

我不是 javascript 方面的专家,而且我对 typescript 和 slate.js 都是新手,所以对于无法更好地提出我的问题,我提前道歉,但这是我目前所了解的以及我仍然不确定的内容:

(1) Editor.nodes() 是一个返回 Iterable 的方法。什么是“const [match]”表示法?这是javascript还是打字稿?

(2) " match" in " const [match]" 和 " match" in " match : n => n.type === format" 一样吗?如果是这样,这是否意味着“ const [match]”是一个数组,其中一个元素是一个函数?如果是这种情况似乎很奇怪,那么为什么还要费心让 Editor.nodes() 返回一个 Iterable 呢?

(3)我知道双感叹号给了我一个布尔对象,但是由于我无法弄清楚 match 是函数还是可迭代的还是其他东西,所以我不知道它的真假!!match告诉了我什么Editor.nodes() 返回的初始迭代。

感谢您为我困惑的大脑提供的任何启发!

4

2 回答 2

2

这称为数组解构match是一个包含Editor.nodes函数返回的数组的第一个元素(或者更确切地说是迭代器产生的第一个值)的变量。它几乎不等于:

  const match = Editor.nodes(...)[0];

或者更准确地说:

 const _it = Editor.nodes(...)[Symbol.iterator]().next();
 const match = _it.done ? undefined : _it.value;
于 2020-02-01T20:39:24.983 回答
0

(1) Editor.nodes() 是一个返回 Iterable 的方法。什么是“const [match]”表示法?这是javascript还是打字稿?

它是 JavaScript(和 TypeScript)数组解构。Editor.nodes 返回一个可迭代的可迭代对象以创建一个数组,并将该数组的第一个元素分配给match. 我们只对是否至少有一个匹配感兴趣,因此查看数组的第一个元素会告诉我们这一点。

(2) “const [match]”中的“match”和“match : n => n.type === format”中的“match”一样吗?如果是这样,这是否意味着“const [match]”是一个数组,其中一个元素是一个函数?如果是这种情况似乎很奇怪,那么为什么还要费心让 Editor.nodes() 返回一个 Iterable 呢?

这两个变量是完全不同的,并且可以(应该?)以不同的方式命名以使事情更清楚。Editor.nodes() 是Editor接口/API 的一部分,用于许多不同的事情。在这种情况下,我们只对第一个元素感兴趣。您可以使用它来查找和迭代 editor.children 中您的match函数为其返回 true 的所有节点。

(3)我知道双感叹号给了我一个布尔对象,但是由于我无法弄清楚 match 是函数还是可迭代的还是其他东西,所以我不知道 !!match 的真假告诉了我什么我关于 Editor.nodes() 返回的初始迭代。

结果match是一个节点对象,或者undefined如果它不匹配任何对象。一个对象是真实的,而未定义的是虚假的,并且做!只是将其转换为布尔值。

于 2020-07-31T22:14:01.627 回答