React-dnd: Как ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡ€Π΅Π²ΡŒΡŽ Π½Π° основС Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ пСрСтаскиваСмого элСмСнта?

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 20 Π°ΠΏΡ€. 2016  Β·  6ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: react-dnd/react-dnd

Π£ мСня Π΅ΡΡ‚ΡŒ пСрСтаскиваСмый тСкст, Π½ΠΎ я Ρ…ΠΎΡ‡Ρƒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ этот тСкст с ΡˆΠΈΡ€ΠΈΠ½ΠΎΠΉ / высотой, Ρ€Π°Π²Π½ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 20% ΠΎΡ‚ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, ΠΊΠ°ΠΊ я Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΡΡ‚ΠΈΠ»ΡŒ ΠΊ ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Ρƒ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ просмотра. Π― Π½Π΅ знаю, ΠΊΠ°ΠΊ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‚Π°Ρ€Π³Π΅Ρ‚ΠΈΠ½Π³ Π½Π° сам снимок экрана. Π’Π°ΠΌ Π² любом случаС?

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ этого с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°.

Π’ спСцификации DragSource Π² beginDrag которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для опрСдСлСния элСмСнта ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ экзСмпляр ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ Π² качСствС Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ добавляСтС Π΅Π³ΠΎ ΠΊ элСмСнту. ПозТС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ findDOMNode Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ фактичСский ΡƒΠ·Π΅Π».

Π˜Ρ‚Π°ΠΊ, сначала Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ экзСмпляр ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΊ элСмСнту.

  beginDrag({ id }, monitor, component) {
    return {
      id,
      component
    };
  },

ПозТС Π² DragLayer Π²Π°ΠΌ потрСбуСтся элСмСнт.

const CustomDragLayer = DragLayer(monitor => ({
  item: monitor.getItem(),
  isDragging: monitor.isDragging() // useful
}))(CustomDragLayer);

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² props CustomDragLayer Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ элСмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚.

class CustomDragLayer extends Component {
  constructor(props) {
    super(props);
    this.width;
    this.height;

    // Now you can eacily get height or width from node 
    const node = findDOMNode(props.item.component);
    console.log(node.clientWidth);
  }
...

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ findDOMNode находится Π² constructor , Π΅Π³ΠΎ нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² render ΠΈ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Π² этом Π½Π΅Ρ‚ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ нСобходимости, источник пСрСтаскивания, вСроятно, ΠΈΠΌΠ΅Π΅Ρ‚ статичСский Ρ€Π°Π·ΠΌΠ΅Ρ€.

ВсС 6 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΏΠΎ DragLayer (http://gaearon.github.io/react-dnd/examples-drag-around-custom-drag-layer.html)

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Ρƒ мСня похоТая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° - Ρ…ΠΎΡ‡Ρƒ Π΄Π°Ρ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ просмотра пСрСтаскивания ΠΈ Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, dnd Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ слишком большим - я попытался ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ изобраТСния с ΡˆΠΈΡ€ΠΈΠ½ΠΎΠΉ / высотой ΠΈ стилСм. W / h, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ connectDragPreview Π±Π΅Π· эффСкта. ΠŸΡ€ΠΎΡ‡Π΅ΡΠ°Π»ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΈ Π½Π΅ нашли упоминания ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° изобраТСния ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ просмотра. ЀактичСский элСмСнт html, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² этом случаС, ΠΏΠΎΡ…ΠΎΡ€ΠΎΠ½Π΅Π½ Π³Π»ΡƒΠ±ΠΎΠΊΠΎ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅, поэтому ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ труднодоступСн, поэтому Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ простым Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π±Ρ‹Π»ΠΎ Π±Ρ‹, Ссли Π±Ρ‹ connectDragPreview / dragPreview ΠΌΠΎΠ³ Π±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ измСнСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° (ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π»ΡƒΡ‡ΡˆΠ΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΡˆΠ»ΠΎ).

Π²ΠΎΡ‚ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π½Π΅Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠΎΠ΄ - установка ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΈ высоты изобраТСния Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ эффСкта Π½ΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ onload, Π½ΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ setDragImage:

componentDidMount = () => {
this.setDragImage ();
};

componentDidUpdate = () => {
this.setDragImage ();
};

setDragImage = () => {
const image = Π½ΠΎΠ²ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ();
image.src = this.props.imgUrl;
image.onload = () => {
image.width = image.height = 35;
this.props.connectDragPreview (ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅);
}
};

Π•ΡΡ‚ΡŒ новости ΠΏΠΎ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅?

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ этого с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°.

Π’ спСцификации DragSource Π² beginDrag которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для опрСдСлСния элСмСнта ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ экзСмпляр ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ Π² качСствС Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ добавляСтС Π΅Π³ΠΎ ΠΊ элСмСнту. ПозТС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ findDOMNode Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ фактичСский ΡƒΠ·Π΅Π».

Π˜Ρ‚Π°ΠΊ, сначала Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ экзСмпляр ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΊ элСмСнту.

  beginDrag({ id }, monitor, component) {
    return {
      id,
      component
    };
  },

ПозТС Π² DragLayer Π²Π°ΠΌ потрСбуСтся элСмСнт.

const CustomDragLayer = DragLayer(monitor => ({
  item: monitor.getItem(),
  isDragging: monitor.isDragging() // useful
}))(CustomDragLayer);

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² props CustomDragLayer Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ элСмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚.

class CustomDragLayer extends Component {
  constructor(props) {
    super(props);
    this.width;
    this.height;

    // Now you can eacily get height or width from node 
    const node = findDOMNode(props.item.component);
    console.log(node.clientWidth);
  }
...

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ findDOMNode находится Π² constructor , Π΅Π³ΠΎ нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² render ΠΈ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Π² этом Π½Π΅Ρ‚ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ нСобходимости, источник пСрСтаскивания, вСроятно, ΠΈΠΌΠ΅Π΅Ρ‚ статичСский Ρ€Π°Π·ΠΌΠ΅Ρ€.

@MrBr , спасибо, Ρ‡Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π±Ρ‹Π»Π° автоматичСски ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π° ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ°Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² послСднСС врСмя Π½Π΅ Π±Ρ‹Π»ΠΎ активности. Он Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚, Ссли большС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ активности. Бпасибо Π·Π° ваш Π²ΠΊΠ»Π°Π΄.

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ