Previous:
安装 Slate


添加事件回调

很好,现在你已经安装了 Slate 并将它渲染到页面上了。并且当你输入文本时,相应的变更能够显示出来。不过,编辑一个纯文本的字符串肯定满足不了你。

Slate 的强大之处在于它十分容易定制。和你所习惯的 React 组件一样,Slate 支持传入事件回调(event handlers)以在特定事件触发时执行。你已经看到了 onChange 回调可用于存储改变后的编辑器状态,不过让我们试着更进一步吧…

我们将展示如何使用 onKeyDown 回调以在用户按键时更改编辑器内容。

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

class App extends React.Component {

  state = {
    state: initialState
  }

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

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

}

现在我们将添加 onKeyDown 回调:

class App extends React.Component {

  state = {
    state: initialState
  }

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

  // 定义一个新的回调函数,在按键时记录下按下的 key code。
  onKeyDown = (event, data, change) => {
    console.log(event.which)
  }

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

}

不错,这样一来每当在编辑器中按键时,你就能看到键位对应的 code 显示在控制台中了。这并没有什么大用处,不过至少我们知道代码跑通了。

现在我们的目标是真正地更改编辑内容。对这个示例而言,我们不妨实现在用户按下 & 时向内容中添加 and 来满足需求。

我们的 onKeyDown 回调大致应该形如:

class App extends React.Component {

  state = {
    state: initialState
  }

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

  onKeyDown = (event, data, change) => {
    // 若按下的键不是 shift + "7" 则不返回 change。
    if (event.which != 55 || !event.shiftKey) return

    // 阻止插入 "&" 至编辑内容的行为。
    event.preventDefault()

    // 在当前光标位置插入 "and" 字符以更改 state。
    change.insertText('and')
    return true
  }

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

}

在这样修改后,试试输入 &,你会发现它自动变成了 and

这个示例向你展示了 Slate 回调操作的基本概念。每一个回调在调用时都会传入 event 对象与当前的编辑器 state。如果你返回了一个新的 state,编辑器就会得到更新。简单吧!


Next:
定制 Block 节点


results matching ""

    No results matching ""