文字編輯器 React 元件

文字編輯器 React 元件代表 文字編輯器 元件。

文字編輯器元件

包含下列元件

文字編輯器屬性

屬性類型預設值說明
<TextEditor> 屬性
value字串

文字編輯器初始 html 內容值。

placeholder字串編輯器 placeholder 內容,在編輯器為空時顯示。預設未指定
resizable布林值false讓編輯器可調整大小(其高度會符合其內容)
mode字串工具列

文字編輯器按鈕模式。可以是

  • toolbar - 會在文字編輯器容器元素中加入包含編輯器按鈕的工具列
  • popover - 會在編輯器中選取文字的上方顯示包含編輯器按鈕的 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);
      }
    }
  }}
  {/* now we use custom button id "hr" to add it to buttons */}
  buttons={['bold', 'italic', 'hr']}
/>
`

文字編輯器事件

事件引數說明
<TextEditor> 事件
textEditorChange(值)當編輯器值已變更時,會觸發事件
textEditorInput事件將在編輯器的內容「輸入」事件中觸發
textEditorFocus事件將在編輯器的內容焦點中觸發
textEditorBlur事件將在編輯器的內容模糊中觸發
textEditorButtonClick(buttonId)事件將在編輯器按鈕點擊中觸發
textEditorKeyboardOpen事件將在編輯器鍵盤工具列出現時觸發
textEditorKeyboardClose事件將在編輯器鍵盤工具列消失時觸發
textEditorPopoverOpen事件將在編輯器彈出視窗開啟時觸發
textEditorPopoverClose事件將在編輯器彈出視窗關閉時觸發
textEditorBeforeDestroy事件將在 Text Editor 執行個體即將被銷毀之前觸發

範例

text-editor.jsx
import React, { useState } from 'react';
import {
  Page,
  Navbar,
  BlockTitle,
  BlockHeader,
  Block,
  TextEditor,
  List,
  ListInput,
} from 'framework7-react';

export default () => {
  const customButtons = {
    hr: {
      content: '<hr>',
      onClick() {
        document.execCommand('insertHorizontalRule', false);
      },
    },
  };

  const [customValue, setCustomValue] =
    useState(`<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>`);

  const [listEditorValue, setListEditorValue] = useState('');

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

      <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) => setCustomValue(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={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) => setListEditorValue(value)}
        />
      </List>
    </Page>
  );
};