如何在 draft.js 中设置默认字体系列和大小

How to set default font family and size in draft.js

我正在学习 draft.js 编辑器,但找不到如何配置默认字体系列和字体大小。

我这样试过:

let editorState = EditorState.createEmpty();

let newState = RichUtils.toggleBlockType(
    editorState,
    'aligncenter'
);

newState = RichUtils.toggleInlineStyle(
    newState,
    'FONT_SIZE_36'
);
newState = RichUtils.toggleInlineStyle(
    newState,
    'TIMES_NEW_ROMAN'
);

奇怪的是,aligncenter 样式工作正常,但是 font sizefamily 消失了当组件获得焦点时。

你能建议正确的方法吗?

使用RichUtils.toggleInlineStyle()用于修改当前选择的文本范围(或设置将在当前光标位置输入的文本的内联样式)。没有办法使用它来设置整个文档的默认内联样式(也不推荐这样做)。

要获得默认样式,您应该使用 CSS 并为整个编辑器设置您想要的样式。然后,当用户需要非默认样式(例如从下拉列表中选择字体大小)时,您应该使用 toggleInlineStyle 覆盖特定文本范围的这些样式。

这是要点。目前,您可以使用 styleMap 预定义这些内联样式,但当用户选择任意字体系列(或大小或颜色)时,您无法真正即时创建它们。

在尝试为 react-rte.org.

实现颜色选择器时,我也一直在努力解决这个问题

(从技术上讲,您 可以 即时添加样式,但它不会触发重新渲染,因此这不是真正可用的。)

这里有一个未解决的问题: https://github.com/facebook/draft-js/issues/52

我预计这将在一周左右的时间内得到解决,我可以使用示例代码编辑此答案以完成您想要的。

如果您尝试在 draft.js 编辑器中设置默认字体大小,只需像下面这样设置您的组件

请注意 div 包裹在编辑器、EmojiSuggestions 和 mentionSuggestion 组件周围。只需将编辑器的 className 设置为您的字体大小。在我的例子中是 fs-1。请注意,我添加了一个来自附加 scss 文件的 editorStyles.editor class。这包含编辑器的一些 scss。

这是 scss 的样子,如果您只是想编辑默认字体样式,则无需添加它

只是展示这个,不需要设置默认字体大小。这是在 div wrapper

中完成的
.editor {
  box-sizing: border-box;
  border: 1px solid #ddd;
  cursor: text;
  padding: 16px;
  border-radius: 2px;
  margin-bottom: 9px;
  box-shadow: inset 0px 1px 8px -3px #ABABAB;
  background: #fefefe;
}

.editor :global(.public-DraftEditor-content) {
  min-height: 140px;
}

.mention {
  color: #2c7be5
}



 <div 
              style={{minHeight: "7em", maxHeight: "10em", overflow: "auto"}}
              className={`border border-2x border-300 bg-light rounded-soft fs-1 ${editorStyles.editor}` }
              onClick={() => { messageFieldRef.current.focus(); }}
            >
            <Editor
              editorKey={'editor'}
              currentContent={ContentState}
              editorState={tempEditorState ? tempEditorState : editorState}
              onChange={setEditorState}
              plugins={plugins}
              ref={messageFieldRef}
            />
            <EmojiSuggestions />
            <MentionSuggestions
              open={open}
              onOpenChange={onOpenChange}
              suggestions={suggestions}
              onSearchChange={onSearchChange}
              onAddMention={(e) => {// get the mention object selected
              }}
              entryComponent={Entry}
              />
            </div>
            <div>
                <EmojiSelect closeOnEmojiSelect />
              <span color="light" className="px-3 py-1 bg-soft-info rounded-capsule shadow-none fs--1 ml-3" >
                <FontAwesomeIcon icon="tags" transform="left-3"/>
                 Press <strong>@</strong>  while typing to insert custom fields
              </span>
            </div>