【问题标题】:react-draggable not working with custom componentsreact-draggable 不适用于自定义组件
【发布时间】:2019-02-11 22:54:40
【问题描述】:

https://github.com/mzabriskie/react-draggable

如何让自定义组件拖动?

点击后以下工作

import React from 'react';
import { DraggableCore } from 'react-draggable';

export default class Hello extends React.Component {

  onStart = () => {
    console.log('here');
  }

  render() {
    return (
      <DraggableCore
        onStart={this.onStart}
      >
        <h1>Drag me!</h1>
      </DraggableCore>
    );
  }
}

这不是

import React from 'react';
import { DraggableCore } from 'react-draggable';

class Test extends React.Component {
  render() {
    return (
      <h1>{this.props.children}</h1>
    );
  }
}

export default class Hello extends React.Component {

  onStart = () => {
    console.log('here');
  }

  render() {
    return (
      <DraggableCore
        onStart={this.onStart}
      >
        <Test>Drag me!</Test>
      </DraggableCore>
    );
  }
}

唯一的区别是它现在使用自定义组件Test,而不是直接使用h1

https://stackblitz.com/edit/react-ev9iyu?file=Hello.js

我已尝试转发 ref。我也尝试将其包装在 Fragment

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    DraggableCore 内用div 包裹您的组件:

    <DraggableCore onStart={this.onStart}>
      <div>
        <Test>Drag me!</Test>
      </div>
    </DraggableCore>
    

    【讨论】:

    • 当我拖动 SVG 时会怎样?将 直接放入 可以,但我想封装它!
    【解决方案2】:

    我在这里玩游戏太晚了,但我希望这对某人有所帮助。你必须给你的组件一个休息道具。您需要这样做,因为 DraggableCore 复制组件并将多个事件侦听器放在组件上。查看 DraggableCore 的渲染。 https://github.com/react-grid-layout/react-draggable/blob/master/lib/DraggableCore.js。您的组件需要能够接收这些事件侦听器。

    const Test = ({ children, ...rest }) => {
      return (
        <div {...rest}>{children}</div>
      )
    }
    
    const Hello = () => {
      const handleStart = () => console.log('here');
    
      return (
        <DraggableCore
          onStart={handleStart}
        >
          <Test>Drag me!</Test>
        </DraggableCore>
      );
    }
    

    【讨论】:

    • 嗨,这不正确。在您的示例中,您没有将任何道具传递给 Test,因此 rest 将始终为空,您也无法将 react 道具传播到 div - 您将在控制台中收到错误消息,说明它们不是dom 属性
    • 给出的答案对于这个问题是正确的
    • 我的建议对我有用。我将 {...rest} 传递给自定义组件上的 div 并且它起作用了
    猜你喜欢
    • 1970-01-01
    • 2023-01-01
    • 2017-10-19
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 2018-12-20
    相关资源
    最近更新 更多