文本编辑器 Svelte 组件

文本编辑器 Svelte 组件代表 文本编辑器 组件。

文本编辑器组件

包含以下组件

文本编辑器属性

属性类型默认值描述
<TextEditor> 属性
value字符串

文本编辑器的初始 html 内容值。

placeholder字符串编辑器占位符内容,在为空时显示。默认情况下未指定
resizable布尔值false使编辑器可调整大小(当其高度适合其内容时)
mode字符串toolbar

文本编辑器按钮模式。可以是

  • toolbar - 它将在文本编辑器容器元素中添加带有编辑器按钮的工具栏
  • popover - 它将在编辑器中选定文本上方显示带有编辑器按钮的弹出框气泡
  • keyboard-toolbar - 带有编辑器按钮的工具栏将在编辑器处于焦点时出现在虚拟键盘顶部。仅在 iOS、Android Cordova 应用程序和 Android Chrome 中受支持。当不支持时,它将回退到 popover 模式。
buttons数组

带有编辑器按钮的数组,或带有编辑器按钮的数组的数组(组)。默认情况下所有按钮都启用,其默认值为

[
  ['bold', 'italic', 'underline', 'strikeThrough'],
  ['orderedList', 'unorderedList'],
  ['link', 'image'],
  ['paragraph', 'h1', 'h2', 'h3'],
  ['alignLeft', 'alignCenter', 'alignRight', 'alignJustify'],
  ['subscript', 'superscript'],
  ['indent', 'outdent'],
]
dividers布尔值true在按钮组之间添加视觉分隔线
imageUrlText字符串插入图片 URL图片 URL 请求时出现的提示文本
linkUrlText字符串插入链接 URL链接 URL 请求时出现的提示文本
clearFormattingOnPaste布尔值true启用后,它将清除从剪贴板粘贴的任何格式
customButtons对象

包含自定义按钮的对象。对象属性键是应在 buttons 中使用的按钮 ID 以启用它。

例如,要指定将添加 <hr> 的自定义按钮,我们可以使用以下声明

<TextEditor
  customButtons={{
    // property key is the button id
    hr: {
      // button html content
      content: '&lt;hr&gt;',
      // button click handler
      onClick(event, buttonEl) {
        document.execCommand('insertHorizontalRule', false);
      }
    }
  }}
  buttons={['bold', 'italic', 'hr']}
/>
`

文本编辑器事件

事件参数描述
<TextEditor> 事件
textEditorChange(value)当编辑器值发生更改时将触发该事件
textEditorInput该事件将在编辑器的内容“输入”事件上触发
textEditorFocus该事件将在编辑器内容获得焦点时触发
textEditorBlur该事件将在编辑器内容失去焦点时触发
textEditorButtonClick(buttonId)该事件将在点击编辑器按钮时触发
textEditorKeyboardOpen当编辑器键盘工具栏出现时将触发该事件
textEditorKeyboardClose当编辑器键盘工具栏消失时将触发该事件
textEditorPopoverOpen该事件将在打开编辑器弹出框时触发
textEditorPopoverClose该事件将在关闭编辑器弹出框时触发
textEditorBeforeDestroy在销毁 Text Editor 实例之前将触发该事件

访问文本编辑器实例

如果您需要使用 文本编辑器 API,您可以通过调用 .instance() 组件方法来访问其已初始化的实例。例如

<TextEditor bind:this={component}>...</TextEditor>

<script>
  let component;

  // to get instance in some method
  component.instance()
</script>


示例

text-editor.svelte
<script>
  import {
    Page,
    Navbar,
    BlockTitle,
    BlockHeader,
    Block,
    TextEditor,
    List,
    ListInput,
  } from 'framework7-svelte';

  const customButtons = {
    hr: {
      content: '<hr>',
      // eslint-disable-next-line
      onClick(editor, buttonEl) {
        document.execCommand('insertHorizontalRule', false);
      },
    },
  };

  let customValue = `<p>Lorem, ipsum dolor sit amet consectetur adipisicing elit. Consequatur sunt, sapiente quis eligendi consectetur hic asperiores assumenda quidem dolore quasi iusto tenetur commodi qui ullam sint sed alias! Consequatur, dolor!</p>
      <p>Provident reiciendis exercitationem reprehenderit amet repellat laborum, sequi id quam quis quo quos facere veniam ad libero dolorum animi. Nobis, illum culpa explicabo dolorem vitae ut dolor at reprehenderit magnam?</p>
      <p>Qui, animi. Dolores dicta, nobis aut expedita enim eum assumenda modi, blanditiis voluptatibus excepturi non pariatur. Facilis fugit facere sequi molestias nemo in, suscipit inventore consequuntur, repellat perferendis, voluptas odit.</p>
      <p>Tempora voluptates, doloribus architecto eligendi numquam facilis perspiciatis autem quam voluptas maxime ratione harum laudantium cum deleniti. In, alias deserunt voluptatibus eligendi libero nobis est unde et perspiciatis cumque voluptatum.</p>
      <p>Quam error doloribus qui laboriosam eligendi. Aspernatur quam pariatur perspiciatis reprehenderit atque dicta culpa, aut rem? Assumenda, quibusdam? Reprehenderit necessitatibus facere nemo iure maiores porro voluptates accusamus quibusdam. Nesciunt, assumenda?</p>`;

  let listEditorValue = '';
</script>

<Page>
  <Navbar title="Text Editor" />

  <Block>
    <p>
      Framework7 comes with a touch-friendly Rich Text Editor component. It is based on modern
      "contenteditable" API so it should work everywhere as is.
    </p>
    <p>
      It comes with the basic set of formatting features. But its functionality can be easily
      extended and customized to fit any requirements.
    </p>
  </Block>

  <BlockTitle>Default Setup</BlockTitle>
  <TextEditor />

  <BlockTitle>With Placeholder</BlockTitle>
  <TextEditor placeholder="Enter text..." />

  <BlockTitle>With Default Value</BlockTitle>
  <TextEditor
    placeholder="Enter text..."
    value={customValue}
    onTextEditorChange={(value) => (customValue = value)}
  />

  <BlockTitle>Specific Buttons</BlockTitle>
  <BlockHeader>It is possible to customize which buttons (commands) to show.</BlockHeader>
  <TextEditor
    placeholder="Enter text..."
    buttons={[
      ['bold', 'italic', 'underline', 'strikeThrough'],
      ['orderedList', 'unorderedList'],
    ]}
  />

  <BlockTitle>Custom Button</BlockTitle>
  <BlockHeader>
    It is possible to create custom editor buttons. Here is the custom "hr" button that adds
    horizontal rule:
  </BlockHeader>
  <TextEditor
    placeholder="Enter text..."
    {customButtons}
    buttons={[['bold', 'italic', 'underline', 'strikeThrough'], 'hr']}
  />

  <BlockTitle>Resizable</BlockTitle>
  <BlockHeader>Editor will be resized based on its content.</BlockHeader>
  <TextEditor
    placeholder="Enter text..."
    resizable
    buttons={['bold', 'italic', 'underline', 'strikeThrough']}
  />

  <BlockTitle>Popover Mode</BlockTitle>
  <BlockHeader>
    In this mode, there is no toolbar with buttons, but they appear as popover when you select any
    text in editor.
  </BlockHeader>
  <TextEditor
    placeholder="Enter text..."
    mode="popover"
    buttons={['bold', 'italic', 'underline', 'strikeThrough']}
    style="--f7-text-editor-height: 150px"
  />

  <BlockTitle>Keyboard Toolbar Mode</BlockTitle>
  <BlockHeader>
    In this mode, toolbar with buttons will appear on top of virtual keyboard when editor is in the
    focus. It is supported only in iOS, Android cordova apps and in Android Chrome. When not
    supported it will fallback to "popover" mode.
  </BlockHeader>
  <TextEditor
    placeholder="Enter text..."
    mode="keyboard-toolbar"
    style="--f7-text-editor-height: 150px"
  />

  <BlockTitle>As List Input</BlockTitle>
  <BlockHeader>
    Text editor can be used in list with other inputs. In this example it is enabled with
    "keyboard-toolbar"/"popover" type for "About" field.
  </BlockHeader>
  <List strongIos dividersIos outlineIos>
    <ListInput type="text" label="Name" placeholder="Your name" />
    <ListInput
      type="texteditor"
      label="About"
      placeholder="About"
      resizable
      textEditorParams={{
        mode: 'popover',
        buttons: ['bold', 'italic', 'underline', 'strikeThrough'],
      }}
      value={listEditorValue}
      onTextEditorChange={(value) => (listEditorValue = value)}
    />
  </List>
</Page>