React-native-router-flux: التنصت المزدوج حرائق الإجراءات مرتين

تم إنشاؤها على ١٤ أغسطس ٢٠١٧  ·  29تعليقات  ·  مصدر: aksonov/react-native-router-flux

إصدار

أخبرنا بالإصدارات التي تستخدمها:

  • رد فعل-أصلي-موجه-تدفق v4.0.17 (v3 غير مدعوم)
  • رد فعل أصلي v0.46.4

سلوك متوقع

عندما يتم تشغيل إجراء تنقل من خلال onPress (فرقعة أو مفتاح Actions.key العادي) ، فليس هناك احتمال أن يتم تشغيل إجراء التنقل مرتين. يجب أن تقوم الضغطة الأولى بتعطيل جميع المطابع الأخرى حتى يتم الانتقال.

السلوك الفعلي

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

خطوات التكاثر

سهل حقًا: فقط افتح مثال RNRF وانقر مرتين كالمجنون. في بعض الأحيان تشتعل الأحداث مرة واحدة ، وأحيانًا مرتين.

needs response from author

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

هذا حل بديل أستخدمه في الوقت الحالي:

لكل زر يؤدي إلى إجراء تنقل ، يمكنك التفاف كل هذه العملية في حالة if مثل:

if(Actions.currentScene == currentSceneKey) {

// Do your treatement here

}

حيث يكون currentSceneKey هو مفتاح المشهد من حيث يتم تشغيل الإجراء.

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

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

import { sceneKeys } from './const/sceneKeys'

if(Actions.currentScene == sceneKeys.currentSceneKey) {

// Do your treatement here

}

تعمل أيضًا مع أزرار الرأس المحددة مباشرة في Router.js (أفضل تعريفها في المشهد الخاص بهم من خلال التنقل الثابت).

ملاحظة: يعمل مع مشاهد شريط علامات التبويب أيضًا ، ولكن كن على دراية بأن المفتاح الذي تم إنشاؤه بواسطة Actions.currentScenes لمشاهد شريط علامات التبويب هو المفتاح الذي حددته في Router.js مسبوقًا بـ "_" لذا تأكد من إضافته في مفتاح المشهد الحالي الخاص بك

أتمنى أنها تساعدك ؛)

ال 29 كومينتر

لتوضيح هذه المشكلة بشكل أكبر ، قمت بعمل صورة GIF لمشروع المثال ، aksonov ،

rnrf double click issue

@ abeltje1 هل وجدت طريقة لإصلاح هذا؟ لم ألاحظ ذلك من قبل ولكن بعد المحاولة لاحظت نفس المشكلة. الآن أحتاج إلى إصلاحه لأنه خطأ كبير في UX.

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

aksonov شكرا جزيلا! سوف أتحقق من ذلك في غضون بضع دقائق ، وسأخبرك بذلك. أنت حقا لا تستطيع التكاثر؟ هذا غريب .. كنت أستخدم محاكي iOS 10 أيضًا (XCode 8.3.3).

هتافات

aksonov لقد جربت

لقد أعدت إظهار هذه المشكلة - كانت المشكلة في refresh ضمن componentDidMount من تسجيل الدخول. يبدو مضادًا للنمط ويجب عدم استخدامه - يجب استخدام onEnter بدلاً من ذلك.

حسنًا ، لا أفهم تمامًا ما تحاول قوله. في تطبيقي الخاص ، يحدث ذلك حرفيًا على كل زر قمت بربط Actions.key به. في المثال ، يحدث هذا أيضًا في كل انتقال ممكن (كما ترى في GIF ، ليس فقط عند تسجيل الدخول ولكن أيضًا عند التسجيل). كيف يمكن أن يكون ذلك بسبب componentDidMount من تسجيل الدخول ولكنه يظهر أيضًا في المشاهد الأخرى؟

أنا آسف إذا لم أفهمها بشكل صحيح ، لكنني أجد صعوبة في اكتشاف ذلك.

عذرًا ، لقد تمكنت من إعادة إنتاجه فقط من خلال تسجيل الدخول. ربما لديّ فأرة سيئة (Apple one) لا تسمح للنقر بشكل أسرع. على أي حال ، يرجى التحقق من المشكلة ذات الصلة ، يبدو أنها مشكلة في رد الفعل والملاحة.

أنت على حق ، إنها مشكلة تنقل رد فعل. لكن ماذا علينا أن نفعل الآن؟ انتظرهم حتى يصلحوا الأمر (مع حالة معالجة المشكلة الحالية لـ React Navigation يمكن أن تستغرق وقتًا طويلاً)؟ أو إصلاحه داخل RNRF؟ أم هل يجب على جميع المطورين تنفيذ حلولهم الخاصة حتى يصلح React Navigation المشكلة؟

ماذا تقترح؟

هتافات

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

ستفعل ، شكرا للمساعدة!

أنا أيضا لدي مشكلة

يرجى التحقق من أحدث ماجستير الآن.

إنه يعمل مع جميع الإجراءات باستثناء pop (استدعاء pop يدويًا) ، تقدم رائع جدًا!

ما زال لدي نفس المشكلة

رد فعل - جهاز التوجيه الأصلي - تدفق v4.0.0 بيتا 18
رد فعل أصلي v0.46.4

gtauniverse اقرأ تعليقي أعلاه

aksonov مساعدة. كيفية تثبيت أحدث نسخة رئيسية؟

لا تزال المشكلة تحدث مع أحدث إصدار! كيف تتعامل مع هذا؟

aksonov ، لدي نفس المشكلة هنا مع rnrf 4.0.0-beta.27 و rn 0.52

لقد كنت أواصل تتبع هذه المشكلة لفترة طويلة جدًا ولاحظت أن ميزة التنقل المتفاعل مؤخرًا أضافت دعمًا للتنقل المعرّف (https://github.com/react-navigation/react-navigation/pull/3393) ، والذي من شأنه أن يحل هذه المشكلة. هل هذا الإصدار من رد الفعل والملاحة مدعوم بالفعل في أحدث نسخة تجريبية من جهاز التوجيه الأصلي المتفاعل؟

لا ، نحن ننتظر حتى يتم تثبيت 1.0 API الجديد

شكرًا لردك ، هل لديك مسار عمل لإصلاح هذه المشكلة حتى يحين ذلك الوقت أو ETA للحصول على مستقر 1.0؟

هذا حل بديل أستخدمه في الوقت الحالي:

لكل زر يؤدي إلى إجراء تنقل ، يمكنك التفاف كل هذه العملية في حالة if مثل:

if(Actions.currentScene == currentSceneKey) {

// Do your treatement here

}

حيث يكون currentSceneKey هو مفتاح المشهد من حيث يتم تشغيل الإجراء.

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

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

import { sceneKeys } from './const/sceneKeys'

if(Actions.currentScene == sceneKeys.currentSceneKey) {

// Do your treatement here

}

تعمل أيضًا مع أزرار الرأس المحددة مباشرة في Router.js (أفضل تعريفها في المشهد الخاص بهم من خلال التنقل الثابت).

ملاحظة: يعمل مع مشاهد شريط علامات التبويب أيضًا ، ولكن كن على دراية بأن المفتاح الذي تم إنشاؤه بواسطة Actions.currentScenes لمشاهد شريط علامات التبويب هو المفتاح الذي حددته في Router.js مسبوقًا بـ "_" لذا تأكد من إضافته في مفتاح المشهد الحالي الخاص بك

أتمنى أنها تساعدك ؛)

ربما يكون أبسط حل بديل يستخدم لكل مثيل Actions.xxx()

<Button onPress={() => Actions.currentScene !== "page1" ? Actions.page1() : {}} >Page 1</Button>

يتمتع

hammooooody هذا يعمل بشكل جيد بالنسبة لي.

اقرأ من خلال https://github.com/react-navigation/react-navigation/pull/3393 ولكن لم تستطع العثور على أي طريقة مضمنة لتشغيله - ربما فاته شيء واضح ... (؟)

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

مثال على الاستخدام

import * as actions from './config/actions';

<TouchableOpacity
    onPress={() =>
        actions.push('venueItemView', { id, summary: this.props.venueData })
    }
>

Actions.js (ملف مساعد)

import { Actions } from 'react-native-router-flux';

export const push = (destinationScene, props) => {
    // console.log('push', destinationScene, Actions.currentScene, props);
    if (Actions.currentScene === destinationScene) {
        return;
    }
    return Actions[destinationScene](props);
};

جميل @ e10a!

أنت تنقذ حياتي @ e10a 👍 D.

هل هناك أي طريقة يمكن من خلالها دمج هذا الفحص في RNRF افتراضيًا؟

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