React - 具有输入的可拖动组件在单击该输入时失去焦点的能力

Posted

技术标签:

【中文标题】React - 具有输入的可拖动组件在单击该输入时失去焦点的能力【英文标题】:React - Draggable components with inputs lose the ability to focus when clicking that input 【发布时间】:2018-03-07 18:22:12 【问题描述】:
<Draggable axis="y"
      grid=[135,135]
      onStop=this.handleStop
      defaultPosition=x: this.props.task.positionX, y: this.props.task.positionY,>
    <div id="edit-task-component">
      <form onSubmit=this.handleSubmit id="edit-task-form" className="edit-task-form">
        <input type="text" name="name" onChange=this.handleChange placeholder="Name" value=this.state.name required/>
        <input type="text" name="description" onChange=this.handleChange placeholder="Description" value=this.state.description required/>
        <button className="btn submit-btn" type="submit">Save </button>
      </form>
    </div>
 </Draggable>

发生的情况是我将单击输入,它会聚焦一秒钟然后失去焦点——所以我无法输入输入。我必须单击它几次才能真正聚焦,因此允许我输入输入。点击一次后如何让它保持专注?单击输入后,我尝试将自动对焦设置为true,但这也不起作用。有什么想法吗?

【问题讨论】:

可能,您的组件正在重新渲染 - 也与 Draggable IMO - 相关;这就是为什么你会失去对输入的关注。 【参考方案1】:

    使用enableUserSelectHack,这不会干扰现有样式

    例如&lt;Draggable enableUserSelectHack=false&gt;

    使用cancel 道具

    eg: 给任何类名,没关系

    <Draggable cancel=".just-name"> <input className="just-name" placeholder="Add text here" /> </Draggable>

【讨论】:

【参考方案2】:

通过handle 启用拖动效果更好,您也可以轻松避免此类问题。

这是官方文档给出的demo:

return (
        <Draggable
            axis="x"
            handle=".handle"
            start=x: 0, y: 0
            grid=[25, 25]
            zIndex=100
            onStart=this.handleStart
            onDrag=this.handleDrag
            onStop=this.handleStop>
            <div>
                <div className="handle">Drag from here</div>
                <div>This readme is really dragging on...</div>
            </div>
        </Draggable>
    );

查看doc

这里的句柄是一个CSS选择器

【讨论】:

以上是关于React - 具有输入的可拖动组件在单击该输入时失去焦点的能力的主要内容,如果未能解决你的问题,请参考以下文章

具有多轴问题的可拖动图例

在 React 中重新渲染条件渲染组件

使用 React 单击时使用输入值更新 URL

单击时 React 输入字段的值仍然存在

React-draggable npm 包可防止在输入字段内单击

React.js:在更改状态的输入字段中单击取消时如何返回先前的状态值[重复]