الفرق بين المراجعتين لصفحة: «ReactNative/interactionmanager»
رقية-بورية (نقاش | مساهمات) طلا ملخص تعديل |
رقية-بورية (نقاش | مساهمات) ط مراجعة |
||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:InteractionManager في React Native}}</noinclude> | <noinclude>{{DISPLAYTITLE:InteractionManager في React Native}}</noinclude> | ||
يسمح InteractionManager بجدولة الأعمال طويلة الأمد بعد انتهاء أيّ تفاعلٍ، أو حركةٍ، ممّا يسمح لمحركات Javascript بالعمل | يسمح InteractionManager بجدولة الأعمال طويلة الأمد بعد انتهاء أيّ تفاعلٍ، أو حركةٍ، ممّا يسمح لمحركات [[JavaScript|Javascript]] بالعمل بسلاسةٍ، ويمكن للتطبيقات جدولة مهامّها لتعمل بعد التفاعلات (interactions)، وذلك كما يلي:<syntaxhighlight lang="java"> | ||
InteractionManager.runAfterInteractions(() => { | InteractionManager.runAfterInteractions(() => { | ||
// ...مهمة متزامنة طويلة الأمد... | // ...مهمة متزامنة طويلة الأمد... | ||
سطر 8: | سطر 6: | ||
</syntaxhighlight>كما توجد خياراتُ جدولةٍ بديلةٌ: | </syntaxhighlight>كما توجد خياراتُ جدولةٍ بديلةٌ: | ||
* <code> | * <code>()requestAnimationFrame</code>: للشّفرة البرمجية التي تحرّك العرض مع مرور الوقت. | ||
* <code>setImmediate/setTimeout | * <code>()setImmediate/setTimeout</code>: لتشغيل الشفرة البرمجية لاحقًا، مع ملاحظة إمكانية تأخّر الحركات. | ||
* <code> | * <code>()runAfterInteractions</code>: لتشغيل الشفرة البرمجية لاحقًا، دون تأخير الحركات الفعّالة. | ||
تَعتبر منظومة معالجة اللّمسات (touch handling system) التفاعل (interaction) هو لمسةٌ فعّالةٌ واحدةٌ، أو أكثر، وتقوم بتأخير استجابات <code> | تَعتبر منظومة معالجة اللّمسات (touch handling system) التفاعل (interaction) هو لمسةٌ فعّالةٌ واحدةٌ، أو أكثر، وتقوم بتأخير استجابات <code>()runAfterInteractions</code> حتى انتهاء جميع اللّمسات، أو إلغائها. | ||
يسمح InteractionManager كذلك | يسمح InteractionManager كذلك للتّطبيقات بتسجيل الحركات، وذلك بإنشاء التفاعل <code>handle</code> عند بداية الحركة، وحذفه عند اكتمالها:<syntaxhighlight lang="javascript"> | ||
var handle = InteractionManager.createInteractionHandle(); | var handle = InteractionManager.createInteractionHandle(); | ||
// تشغيل الحركة... (`runAfterInteractions` جدولة المهام) | // تشغيل الحركة... (`runAfterInteractions` جدولة المهام) | ||
سطر 20: | سطر 18: | ||
InteractionManager.clearInteractionHandle(handle); | InteractionManager.clearInteractionHandle(handle); | ||
// المهام المجدولة التي ستعمل بعد حذف جميع المعالجات | // المهام المجدولة التي ستعمل بعد حذف جميع المعالجات | ||
</syntaxhighlight>يأخذ التابع <code> | </syntaxhighlight>يأخذ التابع <code>()runAfterInteractions</code> دالة استجابةٍ صريحةٍ، أو الكائن <code>PromiseTask</code> مع التابع <code>gen</code> الذي يعيد وعدًا (Promise)، حيث يقبّل بشكلٍ تامٍّ (متضمناً الاعتماديّات غير المتزامنة التي تجدوِل مزيداً من المهام عن طريق <code>()runAfterInteractions</code>، إذا زُوِّد بالكائن <code>PromiseTask</code>، وذلك قبل مباشرة المهمّة التالية التي قد تكون جُدوِلت مسبقاً. | ||
تُنفَّذ المهام المجدولة مع بعضها على شكل حلقةٍ تكراريةٍ ضمن دُفعة <code>setImmediate</code> | تُنفَّذ المهام المجدولة مع بعضها على شكل حلقةٍ تكراريةٍ ضمن دُفعة <code>setImmediate</code> واحدةٍ؛ أمّا عند استدعاء <code>setDeadline</code> مع عددٍ موجبٍ، فيجدوَل تنفيذ المهام حتى الحدّ الأقصى فقط، وبتعابير JS، هو عبارة عن زمن تنفيذ حلقة الحدث من خلال <code>setTimeout</code>، ممّا يسمح للأحداث كاللمسات ببدء التّفاعلات، ويوقف تنفيذ المهام المجدولة، ويجعل التّطبيق أكثر استجابةً. | ||
__toc__ | __toc__ | ||
== مثال == | == مثال == | ||
سطر 167: | سطر 165: | ||
| | ||
export default App; | export default App; | ||
</syntaxhighlight><blockquote>'''ملاحظة.''' لا يعمل التابع <code>InteractionManager.runAfterInteractions | </syntaxhighlight><blockquote>'''ملاحظة.''' لا يعمل التابع <code>()InteractionManager.runAfterInteractions</code> كما ينبغي في الويب، إذ يُطلق آنيًّا دون انتظار انتهاء التفاعل.</blockquote> | ||
== التوابع == | == التوابع == | ||
=== <code> | === <code>()runAfterInteractions</code> === | ||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript"> | ||
static runAfterInteractions(task) | static runAfterInteractions(task) | ||
</syntaxhighlight>يقوم هذا التابع بجدولة الدالة لتعمل بعد إتمام جميع التفاعلات، ويعيد وعداً (promise) قابلاً للإنهاء. | </syntaxhighlight>يقوم هذا التابع بجدولة الدالة لتعمل بعد إتمام جميع التفاعلات، ويعيد وعداً (promise) قابلاً للإنهاء. | ||
=== <code> | === <code>()createInteractionHandle</code> === | ||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript"> | ||
static createInteractionHandle() | static createInteractionHandle() | ||
</syntaxhighlight>ينبّه التابع <code> | </syntaxhighlight>ينبّه التابع <code>()createInteractionHandle</code> المدير إلى بدء التفاعل. | ||
=== <code> | === <code>()clearInteractionHandle</code> === | ||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript"> | ||
static clearInteractionHandle(handle) | static clearInteractionHandle(handle) | ||
</syntaxhighlight>ينبّه هذا التابع المدير إلى اكتمال التفاعل. | </syntaxhighlight>ينبّه هذا التابع المدير إلى اكتمال التفاعل. | ||
=== <code> | === <code>()setDeadline</code> === | ||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript"> | ||
static setDeadline(deadline) | static setDeadline(deadline) |
مراجعة 10:49، 21 يناير 2021
يسمح InteractionManager بجدولة الأعمال طويلة الأمد بعد انتهاء أيّ تفاعلٍ، أو حركةٍ، ممّا يسمح لمحركات Javascript بالعمل بسلاسةٍ، ويمكن للتطبيقات جدولة مهامّها لتعمل بعد التفاعلات (interactions)، وذلك كما يلي:
InteractionManager.runAfterInteractions(() => {
// ...مهمة متزامنة طويلة الأمد...
});
كما توجد خياراتُ جدولةٍ بديلةٌ:
()requestAnimationFrame
: للشّفرة البرمجية التي تحرّك العرض مع مرور الوقت.()setImmediate/setTimeout
: لتشغيل الشفرة البرمجية لاحقًا، مع ملاحظة إمكانية تأخّر الحركات.()runAfterInteractions
: لتشغيل الشفرة البرمجية لاحقًا، دون تأخير الحركات الفعّالة.
تَعتبر منظومة معالجة اللّمسات (touch handling system) التفاعل (interaction) هو لمسةٌ فعّالةٌ واحدةٌ، أو أكثر، وتقوم بتأخير استجابات ()runAfterInteractions
حتى انتهاء جميع اللّمسات، أو إلغائها.
يسمح InteractionManager كذلك للتّطبيقات بتسجيل الحركات، وذلك بإنشاء التفاعل handle
عند بداية الحركة، وحذفه عند اكتمالها:
var handle = InteractionManager.createInteractionHandle();
// تشغيل الحركة... (`runAfterInteractions` جدولة المهام)
// فيما بعد, عند إتمام الحركة:
InteractionManager.clearInteractionHandle(handle);
// المهام المجدولة التي ستعمل بعد حذف جميع المعالجات
يأخذ التابع ()runAfterInteractions
دالة استجابةٍ صريحةٍ، أو الكائن PromiseTask
مع التابع gen
الذي يعيد وعدًا (Promise)، حيث يقبّل بشكلٍ تامٍّ (متضمناً الاعتماديّات غير المتزامنة التي تجدوِل مزيداً من المهام عن طريق ()runAfterInteractions
، إذا زُوِّد بالكائن PromiseTask
، وذلك قبل مباشرة المهمّة التالية التي قد تكون جُدوِلت مسبقاً.
تُنفَّذ المهام المجدولة مع بعضها على شكل حلقةٍ تكراريةٍ ضمن دُفعة setImmediate
واحدةٍ؛ أمّا عند استدعاء setDeadline
مع عددٍ موجبٍ، فيجدوَل تنفيذ المهام حتى الحدّ الأقصى فقط، وبتعابير JS، هو عبارة عن زمن تنفيذ حلقة الحدث من خلال setTimeout
، ممّا يسمح للأحداث كاللمسات ببدء التّفاعلات، ويوقف تنفيذ المهام المجدولة، ويجعل التّطبيق أكثر استجابةً.
مثال
أساسيّ
import React, { useState, useEffect } from "react";
import {
Alert,
Animated,
InteractionManager,
Platform,
StyleSheet,
Text,
View,
} from "react-native";
const instructions = Platform.select({
ios: "Press Cmd+R to reload,\n" + "Cmd+D or shake for dev menu",
android:
"Double tap R on your keyboard to reload,\n" +
"Shake or press menu button for dev menu",
});
const useMount = func => useEffect(() => func(), []);
const useFadeIn = (duration = 5000) => {
const [opacity] = useState(new Animated.Value(0));
// تشغيل الحركة بعد تثبيت المكون
useMount(() => {
// Animated.timing() ينشئ معالج التفاعل بشكل افتراضي
// false مساوية isInteraction ويلغى هذا السلوك بجعل قيمة
Animated.timing(opacity, {
toValue: 1,
duration,
}).start();
});
return opacity;
};
const Ball = ({ onShown }) => {
const opacity = useFadeIn();
// تشغيل التابع بعد الحركة
useMount(() => {
const interactionPromise = InteractionManager.runAfterInteractions(() => onShown());
return () => interactionPromise.cancel();
});
return <Animated.View style={[styles.ball, { opacity }]} />;
};
const App = () => {
return (
<View style={styles.container}>
<Text>{instructions}</Text>
<Ball onShown={() => Alert.alert("Animation is done")} />
</View>
);
};
const styles = StyleSheet.create({
container: { flex: 1, justifyContent: "center", alignItems: "center" },
ball: {
width: 100,
height: 100,
backgroundColor: "salmon",
borderRadius: 100,
},
});
export default App;
متقدّم
import React, { useEffect } from "react";
import {
Alert,
Animated,
InteractionManager,
Platform,
StyleSheet,
Text,
View,
} from "react-native";
const instructions = Platform.select({
ios: "Press Cmd+R to reload,\n" + "Cmd+D or shake for dev menu",
android:
"Double tap R on your keyboard to reload,\n" +
"Shake or press menu button for dev menu",
});
const useMount = func => useEffect(() => func(), []);
// يمكنك إنشاء تفاعل أو حركة شخصية وتضيف دعم
// InteractionManager
const useCustomInteraction = (timeLocked = 2000) => {
useMount(() => {
const handle = InteractionManager.createInteractionHandle();
setTimeout(
() => InteractionManager.clearInteractionHandle(handle),
timeLocked
);
return () => InteractionManager.clearInteractionHandle(handle);
});
};
const Ball = ({ onInteractionIsDone }) => {
useCustomInteraction();
// تشغيل التابع بعد التفاعل
useMount(() => {
InteractionManager.runAfterInteractions(() => onInteractionIsDone());
});
return <Animated.View style={[styles.ball]} />;
};
const App = () => {
return (
<View style={styles.container}>
<Text>{instructions}</Text>
<Ball onInteractionIsDone={() => Alert.alert("Interaction is done")} />
</View>
);
};
const styles = StyleSheet.create({
container: { flex: 1, justifyContent: "center", alignItems: "center" },
ball: {
width: 100,
height: 100,
backgroundColor: "salmon",
borderRadius: 100,
},
});
export default App;
ملاحظة. لا يعمل التابع
()InteractionManager.runAfterInteractions
كما ينبغي في الويب، إذ يُطلق آنيًّا دون انتظار انتهاء التفاعل.
التوابع
()runAfterInteractions
static runAfterInteractions(task)
يقوم هذا التابع بجدولة الدالة لتعمل بعد إتمام جميع التفاعلات، ويعيد وعداً (promise) قابلاً للإنهاء.
()createInteractionHandle
static createInteractionHandle()
ينبّه التابع ()createInteractionHandle
المدير إلى بدء التفاعل.
()clearInteractionHandle
static clearInteractionHandle(handle)
ينبّه هذا التابع المدير إلى اكتمال التفاعل.
()setDeadline
static setDeadline(deadline)
يستخدم setTimeout
مع عددٍ موجبٍ لجدولة أيّ مهمّةٍ حيث يصل زمن تنفيذ حلقة الحدث إلى قيمة deadline
، وإلا سينفذ وبشكلٍ افتراضيٍّ جميع المهام، ضمن دُفعة setImmediate
واحدةٍ.