我在React中有一个文本区,我想把它变成一个"记事本".这意味着我希望"tab"键缩进,而不是取消焦点.我看了this answer个,但我没法用它.这是我的代码:

handleKeyDown(event) {
    if (event.keyCode === 9) { // tab was pressed
        event.preventDefault();
        var val = this.state.scriptString,
            start = event.target.selectionStart,
            end = event.target.selectionEnd;

        this.setState({"scriptString": val.substring(0, start) + '\t' + val.substring(end)});
        // This line doesn't work. The caret position is always at the end of the line
        this.refs.input.selectionStart = this.refs.input.selectionEnd = start + 1;
    }
}
onScriptChange(event) {
   this.setState({scriptString: event.target.value});
}
render() {
    return (
        <textarea rows="30" cols="100" 
                  ref="input"
                  onKeyDown={this.handleKeyDown.bind(this)}
                  onChange={this.onScriptChange.bind(this)} 
                  value={this.state.scriptString}/>
    )
}

当我运行这个代码时,即使按下字符串中间的"tab"键,我的光标也会出现在字符串的末尾.有人知道如何正确设置光标位置吗?

推荐答案

当状态已更新时,必须更改光标位置after(setState()不会立即改变this.state)

为了做到这一点,必须将this.refs.input.selectionStart = this.refs.input.selectionEnd = start + 1;封装在一个函数中,并将其作为第二个参数传递给setState(回调).

handleKeyDown(event) {
      if (event.keyCode === 9) { // tab was pressed
          event.preventDefault();
          var val = this.state.scriptString,
          start = event.target.selectionStart,
          end = event.target.selectionEnd;
          this.setState(
              {
                  "scriptString": val.substring(0, start) + '\t' + val.substring(end)
              },
              () => {
                  this.refs.input.selectionStart = this.refs.input.selectionEnd = start + 1
              });
      }
 }

jsfiddle

Reactjs相关问答推荐

如何使用next.js以DOM为目标在映射中使用Ref

有没有办法将MUI网格元素与Flex-Start对齐?

React Context未正确更新

如何从Reaction-Arborist树获取排序数据

无法在下一个标头上使用 React hooks

如何测试根据 prop 更改 CSS 属性的 useEffect 钩子?

在 golang 服务器中刷新或直接 url 路径时响应 404

React Wordpress Apache 在索引之外重新加载 -> 未找到页面

useMemo 依赖项的行为

如何修改 react/jsx-no-useless-fragment 规则以允许 <>{children}

如何测试使用 React.createportal 呈现的组件?

Primereact 的日历组件在每个月 12 日之后使用非唯一键生成

损坏的图像 React useState

作为单个变量的 React 组件是否比 memoized 组件渲染得更快?

无法在 reactJS 中使用空包装器 <>

为什么我在此代码段中看不到 useEffect for count = 1?

如果两个组件在 React 中导入相同的 CSS 文件会发生什么?

你如何使用 refs 访问 React 中映射子项的值?

React - useParams() 不会失败 null / undefined 判断

调用函数以获取数据并在数据到达时导航到链接