reactjs - 可以在每次渲染时取消订阅并重新订阅我的所有 @Lexical/react 命令监听器吗?

标签 reactjs lexicaljs

@lexical/react中,在没有依赖数组的useEffect中注册编辑器命令是否会带来重大损失(性能或其他)?

useEffect(() => {
  const unsubscribe = editor.registerCommand(
    KEY_ENTER_COMMAND,
    event => { /* ... */ },
    COMMAND_PRIORITY_HIGH
  )

  return unsubscribe
})

这是对 Lexical 的内部要求,还是仅仅是调用一个额外的简单函数的问题?或者这种方法还有其他缺点吗?

最佳答案

它相当便宜,在幕后我们只需从 map 和集合中添加/删除即可。但如果您不必执行这些操作,则会更便宜。

useCommandSubscription 是一个不错的抽象,一些(未经测试的)代码:

function useCommandSubscription<T>(command: LexicalCommand<T>, fn: CommandListener<T>, priority: CommandListenerPriority): void {
  const [editor] = useLexicalComposerContext();
  useLayoutEffect(() => {
    return editor.registerCommand(command, fn, priority);
  }, [editor]);
}
useCommandSubscription(FOO_COMMAND, () => { ... }, priority);

但请注意如何进一步优化我们提供的开箱即用功能:

useEffect(() => {
  // You can return immediately, no need to store the cleanup function in a variable
  return editor.registerCommand(...);
}, [editor]);

一个常见的用例是您一次监听多个命令/更新,您可以利用mergeRegister(来自@lexical/utils):

useEffect(() => {
  return mergeRegister(
    editor.registerCommand(..),
    editor.registerCommand(..),
    editor.registerUpdateListener(..),
}, [editor]);

旁注:聆听按键输入命令时要小心。 Android 与组合一起工作,不会触发按键输入事件。根据您的用例,您可能想要探索 INSERT_LINE_BREAK_COMMANDINSERT_PARAGRAPH_COMMAND、基于 LineBreakNodeParagraphNode 的转换或突 rebase 于这两个节点的监听器。

关于reactjs - 可以在每次渲染时取消订阅并重新订阅我的所有 @Lexical/react 命令监听器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72369771/

相关文章:

reactjs - "editable"属性不适用于 LexicalComposer

reactjs - 无法将 Lexical 解析为 HTML

javascript - 表格单元格中的工具提示定位

reactjs - Next.js Router.push() 自动重新加载页面

node.js - 在 Flow NPM 包中,抑制问题以使用户应用程序看不到错误的正确方法是什么?

javascript - 动态添加/删除表单输入

javascript - 帮助文件和外部函数的 Jest 测试

lexicaljs - 如何使用词法编辑器以编程方式添加文本?