React-dnd: لقطة شاشة سيئة عند السحب المنتظم ، وحركة متقطعة عند معاينة السحب المخصصة

تم إنشاؤها على ٨ مايو ٢٠١٦  ·  22تعليقات  ·  مصدر: react-dnd/react-dnd

مثل الكثيرين ، لدي قائمة بالبطاقات القابلة للفرز. في حالتي ، كل بطاقة هي جزء من محتوى منشور مدونة وبعض هذه المقتطفات عبارة عن مقتطفات رمز يتم عرضها باستخدام react-codemirror . تضمنت معاينة السحب للقصاصات خلفية بيضاء كبيرة كانت مساوية للعرض والارتفاع للنص داخل محرر رمز المرمز. كان هذا غير مرغوب فيه ، لذا حاولت إصلاحه باستخدام CSS ولكن لم يحالفني الحظ ، ولأنني قرأت المزيد من الوثائق ، أعتقد أنه غير ممكن لأن dnd تقوم بتصوير عقدة dom قبل تطبيق أي فئات أو أنماط جديدة عليها (من فضلك صححني إذا كان هذا خطأ بالطبع)

نظرًا لأنني لم أتمكن من تشغيل css ، فقد حاولت استخدام طبقة سحب مخصصة لإظهار شيء مختلف للمعاينة. يعمل هذا بشكل رائع باستثناء أن السحب يصبح متقطعًا حقًا حيث كان في الواقع سلسًا جدًا من قبل.

إليك مقطع فيديو يوضح المشكلة التي وصفتها للتو:

https://drive.google.com/file/d/0Bzbw-6Q_sVTySUNiNmJGcFVIQ00/view؟usp=sharing

وأفترض أنك سترغب أيضًا في رؤية بعض التعليمات البرمجية. ها هي طبقة السحب المخصصة الخاصة بي

import React, { Component, PropTypes } from 'react'
import { DragLayer } from 'react-dnd'

function collect(monitor) {
  return {
    item: monitor.getItem(),
    currentOffset: monitor.getSourceClientOffset(),
    isDragging: monitor.isDragging()
  }
}

const layerStyles = {
  position: 'fixed',
  pointerEvents: 'none',
  zIndex: 100,
  left: 0,
  top: 0,
  width: '20%',
  height: '100%'
}

function getItemStyles(props) {
  var currentOffset = props.currentOffset
  if (!currentOffset) {
    return {
      display: 'none'
    }
  }

  var x = currentOffset.x
  var y = currentOffset.y
  var transform = 'translate(' + x + 'px, ' + y + 'px)'
  return {
    transform: transform,
    WebkitTransform: transform
  }
}

class CardDragLayer extends Component {
  static propTypes = {
    item: PropTypes.object
  }

  render() {
    const { item, isDragging } = this.props

    if (!isDragging)
      return false

    return (
      <div style={layerStyles}>
        <div className='drag-preview' style={getItemStyles(this.props)}>
          <i className='fa fa-hand-scissors-o fa-6'></i>
        </div>
      </div>
    )
  }
}

export default DragLayer(collect)(CardDragLayer)

فيما يلي خيارات التكوين الخاصة بمصدر السحب وهدف الإسقاط

export const cardSource = {
  beginDrag(props) {
    return {
      index: props.index
    }
  }
}

export const cardTarget = {
  hover(props, monitor, component) {
    const dragIndex = monitor.getItem().index
    const hoverIndex = props.index

    if (dragIndex === hoverIndex)
      return

    props.swap(dragIndex, hoverIndex)
    monitor.getItem().index = hoverIndex;
  }
}

export function collectSource(connect, monitor) {
  return {
    connectDragSource: connect.dragSource(),
    connectDragPreview: connect.dragPreview(),
    isDragging: monitor.isDragging()
  }
}

export function collectTarget(connect) {
  return {
    connectDropTarget: connect.dropTarget()
  }
}

وهنا المكون Card الذي يتم سحبه

import React, { PropTypes, Component } from 'react'
import { Snippet, Markdown } from './Show'
import { DragSource, DropTarget } from 'react-dnd'
import { getEmptyImage } from 'react-dnd-html5-backend'
import { cardSource, cardTarget, collectSource, collectTarget } from './dragDropConfig'
import classnames from 'classnames'

class SnippetCard extends Component {
  options() {
    return {
      readOnly: true,
      scrollbarStyle: 'null',
      viewportMargin: Infinity
    }
  }

  render() {
    const { language, text } = this.props
    return(
      <Snippet
        options={this.options()}
        language={language.value}
        text={text.value} />
    )
  }
}

class MarkdownCard extends Component {
  render() {
    const { text } = this.props
    return (
      <div className='markdown-card'>
        <div className='card-content'>
          <Markdown text={text.value} />
        </div>
      </div>
    )
  }
}

const components = {
  snippet: SnippetCard,
  markdown: MarkdownCard
}

class Card extends Component {
  static propTypes = {
    connectDragSource: PropTypes.func.isRequired,
    connectDropTarget: PropTypes.func.isRequired,
    index: PropTypes.number.isRequired,
    block: PropTypes.object.isRequired,
    swap: PropTypes.func.isRequired
  }

  componentDidMount() {
    const { connectDragPreview } = this.props
    connectDragPreview(getEmptyImage(), {
      captureDraggingState: true
    })
  }

  render() {
    const { isDragging, block, connectDragSource, connectDropTarget } = this.props
    const Component = components[block.format.value]
    const classes = classnames('card', {
      dragging: isDragging
    })

    return connectDragSource(connectDropTarget((
      <div className={classes}>
        <div className='card-header'>
          <div>
            <label>
              {block.format.value}
            </label>
          </div>
          <Component {...block} />
        </div>
      </div>
    )))
  }
}

const Source = DragSource('card', cardSource, collectSource)(Card)
export default DropTarget('card', cardTarget, collectTarget)(Source)

اسمحوا لي أن أعرف إذا كنت بحاجة لرؤية أي رمز أكثر من ذلك ، أعتقد أن هذا يجب أن يكون كافياً.

اقتراحات لأي من أ) كيف يمكنني استخدام css لإخفاء الخلفية البيضاء أو ب) جعل سحب معاينة السحب المخصص أكثر سلاسة سيكون موضع تقدير كبير!

لاحظ أن هذا العمل جزء من دورة screencast حول إنشاء تطبيقات ذات تفاعل / إعادة وأنني أخطط لعمل 2-3 مقاطع فيديو قصيرة على رد الفعل-dnd لإظهار كيفية تنفيذ بطاقات حظر المحتوى القابلة للفرز. على أمل إطلاق سراح هؤلاء في أسرع وقت ممكن!

needs info wontfix

التعليق الأكثر فائدة

نعم ، لقد بدأنا بإزالة كل مكون للعثور على المكون الذي تسبب في المشكلة ، وبمجرد أن وجدناها ، انتقلنا إلى الجزء الذي تسبب في التباطؤ ، ثم على العنصر الخارجي الذي يمكنه قبول style param كتبنا: style={{transform: translate3d(0, 0, 0)}}

ال 22 كومينتر

لقد لاحظت تقطعًا أيضًا في برنامج dragLayer المخصص (فقط تشغيل مثال موقع الويب): http://gaearon.github.io/react-dnd/examples-drag-around-custom-drag-layer.html

كل شيء على ما يرام في Chrome ولكن الرسوم المتحركة متقطعة في Firefox. (على Linux Mint ، Firefox 46.0.1)

مكتبة رائعة بالمناسبة!

sslotsky هل سبق لك أن

إذا لم يكن الأمر كذلك ، فيمكنني الغوص في هذا الأمر ومعرفة ما إذا كان هناك أي شيء ذكي يمكننا القيام به في CSS ، أو بدلاً من ذلك أي شيء يمكننا القيام به لتقليل التقلب. أبلغ أشخاص آخرون أن أداء طبقة السحب المخصصة يترك الكثير مما هو مرغوب فيه.

كلا ، ما زلت لم أحسبها. سيكون الحل رائعًا عندما أقوم بتسجيل الفيديو التالي!

نحن نرى هذا أيضًا ، بالاشتراك في هذه المشكلة للحصول على أي تحديثات

kesne فقط علق لإبقاء هذا على قيد الحياة. إذا كان لديك أي تحديثات تستحق المشاركة ، فأنا متأكد من أننا نود أن نسمع عنها :)

نعم ، أود إيجاد حل لهذا أيضًا. إنني أتطلع إلى تنفيذ أكثر من مجرد لقطة شاشة للكائن القابل للسحب ، ولكن بشكل أساسي مكون رد فعل بسيط للغاية.

سوف أتناول هذا أيضًا. نحن نشهد أيضًا نفس المشكلة.

أنا أواجه هذا أيضًا .. سحب وإسقاط بسيط يعمل بشكل جيد. لكن لدي تطبيق معقد للغاية ، وهذا يحدث.

لديك نفس المشكلة. هل توصل أي شخص إلى حل أو حل بديل؟

@ alexey-belous قمنا بإلغاء هذه المكتبة وذهبنا مع https://github.com/bevacqua/react-dragula

نفس المشكلة هنا ، سأكون سعيدًا بأي تعليقات أخرى.

لقد كنت أقوم بالتحقيق في هذه المشكلة واكتشفت أن لقطة شاشة سحب عقدة dom شفافة فقط على Windows بشكل مستقل عن المتصفح.

تمكنت من تحسين الجودة بشكل كبير بمجرد إزالة console.log () من طريقة getItemStyles (الدعائم) الخاصة بي. هذا لا يساعد البروتوكول الاختياري ، ولكن ربما يتعثر شخص آخر هنا.

لذلك قمت باستنساخ هذا وتشغيل خادم dev ومثال معاينة السحب المخصص هو أيضًا متقطع. ومع ذلك ، عندما أقوم بإنشاء الموقع (عن طريق تشغيل npm run build-site ) ، يتم تحويل الموقع إلى ترميز منتظم (بدون مراجع مكون React) ويتم الآن تشغيل مثال معاينة السحب بسلاسة.

لذا فإن فرضيتي هي أن ReactDOM.renderToString ( ) يحسن أداء السحب والإفلات لمعاينة السحب المخصصة.

لا تزال هذه مشكلة كبيرة ... :(

592 يبدو أنه كان لي بعض الحظ ، لكنني لم أتمكن من التفرع والتحرير بعد. ربما يمكن لشخص آخر الوصول إليها قبل أن أفعل.

gaearon نحن نحبك يا رجل! لا تتركونا معلقين! وجهنا في الاتجاه الصحيح وأنا متأكد من أننا سنصلحها :)

كنت أواجه مشكلة في الرسوم المتحركة المتقطعة على طبقة سحب مخصصة واكتشفت أنها كانت بسبب شجرة DOM معقدة للغاية.

أعمل على تطبيق يحتوي على مكون جدول يمكنه عرض ما يصل إلى آلاف الصفوف والأعمدة من البيانات المجدولة ، مما يؤدي إلى إنشاء ما يشبه 4 عناصر DOM لكل خلية أو نحو ذلك. عندما كان الجدول فارغًا ، كانت طبقة السحب تعمل بشكل جيد ، ولكن مع زيادة كمية البيانات المعروضة في الجدول ، تباطأ أداء طبقة السحب المخصصة. (في هذه الحالة ، لا يشارك الجدول على الإطلاق في تشغيل مصادر السحب أو أهداف الإسقاط).

في هذه الحالة ، لم يتغير الأداء في Firefox ، بينما أصبح الأداء في Chrome أسوأ بشكل كبير كلما زاد تعقيد شجرة DOM.

تمكنت من حل المشكلة عن طريق دفع الجدول إلى طبقة التركيب الخاصة به في Chrome ، من خلال تصميمه بخاصية تحويل ثلاثية الأبعاد فارغة: transform: translate3d(0, 0, 0)

بعد ذلك ، كان الأداء مشابهًا للصفحة التجريبية. لست متأكدًا من الآثار المترتبة على هذه المكتبة ، ولكن من خلال دفع الأجزاء المعقدة من شجرة DOM للتطبيق الخاص بك إلى طبقات تكوين منفصلة ، قد تتمكن من إصلاح مشكلات الأداء لديك.

mgerring هل لديك المزيد من المعلومات حول كيفية القيام بذلك؟ أود تجربته على تطبيقي

نعم ، لقد بدأنا بإزالة كل مكون للعثور على المكون الذي تسبب في المشكلة ، وبمجرد أن وجدناها ، انتقلنا إلى الجزء الذي تسبب في التباطؤ ، ثم على العنصر الخارجي الذي يمكنه قبول style param كتبنا: style={{transform: translate3d(0, 0, 0)}}

قصدت ترك هذا التعليق على # 592 لكنني أعتقد أنه ينطبق هنا أيضًا

حل mgerring يعمل بالنسبة لي.

@ alexey-belous قمنا بإلغاء هذه المكتبة وذهبنا مع https://github.com/bevacqua/react-dragula
+1

تم وضع علامة على هذه المشكلة تلقائيًا على أنها قديمة نظرًا لعدم وجود نشاط حديث لها. سيتم إغلاقه إذا لم يحدث أي نشاط آخر. شكرا لمساهماتكم.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات