תנועה ל־React DOM · ה־Animated API של React Native
כותבים תנועה פעם אחת. היא חלקה, ולעולם לא נשברת.
Animated מביא את Animated של React Native לאינטרנט. ערך אחד מניע כל מספר של אלמנטים בלי רינדור React בכל פריים, תנועה נתמכת מתנגנת בדפדפן עצמו, וכל הפרעה ממשיכה ממה שעל המסך.
npm install @kkwaenggwari/animatedערך שעון אחד מניע את האדווה של כל 64 הצורות. הזיזו את הסמן מעל הבמה.
נמדד בגרסה הזו
נמדד עם בניית 1.0.0 ב־Chrome ללא ממשק על PC שולחני. המספרים משתנים בין מכשירים. איך מדדנו
- 0.00msJavaScript לפריים בזמן ש־400 אלמנטים זזים
תנועה סופית של transform ו־opacity על אלמנטים של Animated מתנגנת בדפדפן. ה־callbacks של הפריים בעמוד לא עושים שום עבודה.
- 0.13msJavaScript לפריים כשערך אחד מניע 10,000 אלמנטים
הערך כותב משתנה CSS אחד; כל אלמנט גוזר ממנו את הסגנון שלו ב־CSS.
- 0רינדורים של React בזמן תנועה
ערכים לעולם לא עוברים דרך מצב של React. רכיבים מתרנדרים כשה־props שלכם משתנים, לא כשפריים משתנה.
01 · פשוט
ה־API שאתם כבר מכירים, על style רגיל של React
timing, spring, interpolate, loop ו־Animated.event שומרים על השמות וההגדרות של React Native. ערך נכנס ישר ל־prop רגיל של style, כך שאין רכיב מיוחד ללמוד לפני התנועה הראשונה.
- העבירו קוד מ־React Native על ידי שינוי השם
Animated.Viewל־Animated.div. - ערך אחד יכול להזיז פס, חוגה ושורת כרטיסים בבת אחת, כל אחד עם הטווח שלו.
useAnimatedמחזיק את המתכון: מתחיל בהרכבה, מתחיל מחדש כשתלות משתנה ומנקה בהסרה.
מכין את הדוגמה…
אותן קריאות כמו ב־React Native
// React Native
<Animated.View style={{ transform: [{ rotate }] }} />
// React DOM with @kkwaenggwari/animated — the rest is identical
<Animated.div style={{ transform: [{ rotate }] }} />
const spin = useAnimatedValue(0);
const rotate = spin.interpolate({ inputRange: [0, 1], outputRange: ['0deg', '360deg'] });
Animated.loop(
Animated.timing(spin, { toValue: 1, duration: 900, easing: Easing.linear, useNativeDriver: true }),
).start();02 · מהיר
בלי רינדור React בכל פריים
ערך של hook הוא משתנה CSS. אינטרפולציות לינאריות וחשבון הופכים לביטויי calc() מדויקים של המשתנה הזה, כך שכל פריים הוא כתיבה אחת והדפדפן גוזר את השאר. תנועה סופית של transform ו־opacity על אלמנטים של Animated.<tag> מתנגנת בדפדפן בלי callbacks של פריים.
- שנו את מספר הנקודות: המונה מראה ש־React רינדר פעם אחת לכל שינוי, אף פעם לא לכל פריים.
scopeכותב את הערך פעם אחת על מכל במקום על כל אלמנט.inspect(element)אומר באיזה מסלול כל מאפיין משתמש ולמה.
מכין את הדוגמה…
03 · יציב
הפריעו לו בכל מקום. הוא ממשיך.
יעד חדש מתחיל מהמקום שבו האלמנט נמצא על המסך, וקפיץ גם שומר על המהירות שלו, כך שהיפוך באמצע הדרך מסתובב בחלקות במקום לעצור קודם. בקרים שהוצהרו ב־hook נעצרים ומשתחררים בהחלפה ובהסרה, ו־markup שרונדר בשרת ממשיך לנוע אחרי ה־hydration.
- לחצו פעמיים מהר: עם
springהמסלול מתעקל, עםtimingהמיקום נשמר אבל מתחילה עקומה חדשה. - עצירה משאירה את הערך במקומו; שום דבר לא קופץ למצב סופי.
- אין לולאות פריים יתומות אחרי הסרה, מעבר נתיב או לשונית מוסתרת.
מכין את הדוגמה…
- מעגן מגנטיאייקונים גדלים כשהסמן עובר, דוחקים את השכנים הצידה ומתייצבים כשהוא עוזב.
moveInputfollowuseAnimatedCSSmultiply - חפיסה להחלקהגררו את הכרטיס העליון. מעבר לסף הוא עף; אחרת הוא קופץ בחזרה.
dragInputuseAnimatedListenerAnimated.div - גלריה משותפתאריח גדל לתצוגת פרטים ומתכווץ בחזרה לרשת.
Animated.SceneAnimated.Keepmove
בנוי על Animated
צריכים רכיב מוכן? Animated Chorus.
מספרים מתגלגלים, הדגשות לשוניות שנודדות, התקדמות, גיליונות ורשימות מונפשות שנכנסים ישר ל־React ול־React Native. שלושת אלה רצים בעמוד הזה ממש עכשיו.
לבקר ב־Animated Chorusמתחילים בשלוש דקות
התקינו את החבילה, הזיזו את הערך הראשון, ואז בחרו מדריך למשימה שלפניכם.
npm install @kkwaenggwari/animated