Как я могу ограничить перетаскиваемый элемент в теле, отключить выделение текста и включить ввод формы? - PullRequest
0 голосов
/ 28 сентября 2018

Я использую react-draggable.

Мне нужно предотвратить перетаскивание элемента за пределы элемента body, запретить выделение текста и включить ввод данных формы внутри перетаскиваемого элемента.

import React from "react";
import ReactDOM from "react-dom";
import Draggable from "react-draggable";

function App() {
  return (
    <div className="App">
      <div>Loren ipsum blah blah</div>
      <Draggable bounds='body'>
        <div className="inner">
          <h4>Drag me</h4>
          <textarea/>
          <input />
          <input type='checkbox' />
        </div>
      </Draggable>
   </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

Приведенный выше код помешает выделению текста, но textarea и input использовать нельзя.Флажок работает.

Я пытался использовать enableUserSelectHack={false} для включения ввода формы внутри div.inner.Хотя для ввода разрешенного текста можно выбрать , когда , пользователь перетаскивает курсор над окном просмотра.

Есть ли способ ограничить перетаскиваемый элемент в теле, отключить выбор текста и включить ввод формыпри использовании react-draggable?

1 Ответ

0 голосов
/ 29 сентября 2018

Используйте React state и создайте кнопку-переключатель, чтобы разрешить / запретить перетаскивание (в то же время это оказывает обратный эффект для входных данных).

Чтобы ограничить область перетаскивания, вы можете указать ее следующим образом:

bounds={{left: number, top: number, right: number, bottom: number}}

или использовать:

bounds="parent"

для ограничения движения в пределах offsetParent узла (в приведенном ниже примере это height и width из <div className="container">).

Более подробную информацию можно найти здесь .

Рабочий пример: https://codesandbox.io/s/k5n52xq70r (ограничения height и width, указанные в styles.cssтаблица стилей)

компоненты / App.js

import React, { Component } from "react";
import Draggable from "react-draggable";

export default class App extends Component {
  state = { disabled: false };

  toggleDraggable = () => this.setState(prevState => ({ disabled: !this.state.disabled }));

  render = () => {
    const { disabled } = this.state;
    return (
      <div className="container">
        <Draggable disabled={disabled} bounds="parent">
          <div style={{ width: 200 }} className={!disabled ? "draggable" : null}>
            <h4 style={{ height: 20 }}>{!disabled && "Drag Me"}</h4>
            <textarea disabled={!disabled} className="uk-textarea"/>
            <input disabled={!disabled} className="uk-input" />
            <input className="uk-checkbox" type="checkbox" disabled={!disabled}/>
            <br />
            <button className="uk-button uk-button-primary" onClick={this.toggleDraggable}>
              {disabled ? "Enable" : "Disable"} Drag
            </button>
          </div>
        </Draggable>
      </div>
    );
  };
}

styles.css

.container {
  height: calc(100vh - 50px);
  width: calc(100vh - 100px);
  padding: 20px;
}

.draggable {
  cursor: -webkit-grab;
  cursor: grab;
}

.uk-input,
.uk-textarea,
.uk-checkbox {
   margin-bottom: 10px;
}
...