Previous:
定制 Block 节点


应用自定义格式

在上一节中我们已经了解了如何定制在不同容器内渲染不同文本的 block 节点。不过,Slate 所支持的不仅仅是 "block" 而已。

在本文中,我们将展示如何添加自定义的格式选项,如 加粗斜体代码块中划线 等。

让我们从之前的应用开始:

class App extends React.Component {

  state = {
    state: initialState,
    schema: {
      nodes: {
        code: CodeNode
      }
    }
  }

  onChange = ({ state }) => {
    this.setState({ state })
  }

  onKeyDown = (event, data, change) => {
    if (event.which != 67 || !event.metaKey || !event.altKey) return
    event.preventDefault()
    const isCode = change.state.blocks.some(block => block.type == 'code')

    change.setBlock(isCode ? 'paragraph' : 'code')
    return true
  }

  render() {
    return (
      <Editor
        state={this.state.state}
        schema={this.state.schema}
        onChange={this.onChange}
        onKeyDown={this.onKeyDown}
      />
    )
  }

}

现在,我们可以编辑 onKeyDown 回调来让按下 ⌘-B 时,添加一个 "bold" mark 到当前选中的文本中:

class App extends React.Component {

  state = {
    state: initialState,
    schema: {
      nodes: {
        code: CodeNode
      }
    }
  }

  onChange = ({ state }) => {
    this.setState({ state })
  }

  onKeyDown = (event, data, change) => {
    if (!event.metaKey) return

    // 根据按键键值判断操作…
    switch (event.which) {
      // 当按下 "B" 时,为文本添加 "bold" mark。
      case 66: {
        event.preventDefault()
        change.addMark('bold')
        return true
      }
      // 当按下 "`" 时,仍使用已有的代码块操作逻辑。
      case 67: {
        if (!event.altKey) return
        const isCode = change.state.blocks.some(block => block.type == 'code')
        event.preventDefault()
        change.setBlock(isCode ? 'paragraph' : 'code')
        return true
      }
    }
  }

  render() {
    return (
      <Editor
        schema={this.state.schema}
        state={this.state.state}
        onChange={this.onChange}
        onKeyDown={this.onKeyDown}
      />
    )
  }

}

可以了,现在我们已经完成了快捷键回调的配置了…不过!如果你这时候碰巧选中了一段文本并按下 ⌘-B 的话,控制台中会产生一条报错。这时由于你还没有告诉 Slate 如何渲染一个 "bold" mark。

对每种你想要添加到 schema 中的 mark 类型,你都需要在 Slate 中为它指定一个类似节点那样的 "renderer"。现在让我们来定义 bold 类型的 mark 吧:

// 定义一个 React 组件来渲染粗体文本。
function BoldMark(props) {
  return <strong>{props.children}</strong>
}

够简单吧?

现在,我们来为 Slate 添加 mark 信息吧。 我们需要将 mark 添加到 schema 对象中的 mark 属性下。 并且,我们可以通过将 addMark 更改为 toggleMark 的方式来支持对 mark 的开闭。

function BoldMark(props) {
  return <strong>{props.children}</strong>
}

class App extends React.Component {

  state = {
    state: initialState,
    schema: {
      nodes: {
        code: CodeNode
      },
      // 添加 "bold" mark 到 schema 中…
      marks: {
        bold: BoldMark
      }
    }
  }

  onChange = ({ state }) => {
    this.setState({ state })
  }

  onKeyDown = (event, data, change) => {
    if (!event.metaKey) return

    switch (event.which) {
      case 66: {
        event.preventDefault()
        change.toggleMark('bold')
        return true
      }
      case 67: {
        if (!event.altKey) return
        const isCode = change.state.blocks.some(block => block.type == 'code')
        event.preventDefault()
        state.setBlock(isCode ? 'paragraph' : 'code')
        return true
      }
    }
  }

  render() {
    return (
      <Editor
        schema={this.state.schema}
        state={this.state.state}
        onChange={this.onChange}
        onKeyDown={this.onKeyDown}
      />
    )
  }

}

现在,只要你选中了一段文本并按下 ⌘-B,就能看到它被加粗了!神奇吧!


Next:
使用插件


results matching ""

    No results matching ""