การเคลื่อนไหวสำหรับ React DOM · Animated API ของ React Native
เขียนการเคลื่อนไหวครั้งเดียว ลื่นไหล ไม่มีวันพัง
Animated นำ Animated ของ React Native มาสู่เว็บ ค่าเดียวขับองค์ประกอบได้ไม่จำกัดโดยไม่มีการเรนเดอร์ React ในทุกเฟรม การเคลื่อนไหวที่รองรับจะเล่นโดยเบราว์เซอร์เอง และทุกการขัดจังหวะจะทำต่อจากสิ่งที่อยู่บนหน้าจอ
npm install @kkwaenggwari/animatedค่านาฬิกาเดียวขับคลื่นของรูปทรงทั้ง 64 ชิ้น ลองเลื่อนตัวชี้ไปบนเวที
วัดบนบิลด์นี้
วัดด้วยบิลด์ 1.0.0 ใน Chrome แบบ headless บน PC เดสก์ท็อป ตัวเลขขึ้นอยู่กับอุปกรณ์ เราวัดอย่างไร
- 0.00msJavaScript ต่อเฟรมขณะที่ 400 องค์ประกอบเคลื่อนที่
การเคลื่อนไหว transform และ opacity ที่มีจุดสิ้นสุดบนองค์ประกอบ Animated เล่นโดยเบราว์เซอร์ callback ของเฟรมในหน้าเองไม่ต้องทำงานใด ๆ
- 0.13msJavaScript ต่อเฟรมเมื่อค่าเดียวขับ 10,000 องค์ประกอบ
ค่าจะเขียนตัวแปร CSS ตัวเดียว แล้วแต่ละองค์ประกอบคำนวณสไตล์ของตัวเองจากตัวแปรนั้นใน CSS
- 0การเรนเดอร์ React ระหว่างการเคลื่อนไหว
ค่าไม่เคยผ่าน state ของ React คอมโพเนนต์เรนเดอร์เมื่อ props ของคุณเปลี่ยน ไม่ใช่เมื่อเฟรมเปลี่ยน
01 · ง่าย
API ที่คุณรู้จักอยู่แล้ว บน style ธรรมดาของ React
timing, spring, interpolate, loop และ Animated.event ใช้ชื่อและการตั้งค่าเดียวกับ React Native ค่าเข้าไปใน prop style ธรรมดาได้เลย จึงไม่ต้องเรียนรู้คอมโพเนนต์พิเศษก่อนการเคลื่อนไหวแรก
- ย้ายโค้ด React Native มาได้ด้วยการเปลี่ยนชื่อ
Animated.Viewเป็นAnimated.div - ค่าเดียวขับแถบ หน้าปัด และแถวการ์ดได้พร้อมกัน แต่ละตัวมีช่วงของตัวเอง
useAnimatedถือครองสูตร: เริ่มเมื่อ mount เริ่มใหม่เมื่อ dependency เปลี่ยน และเก็บกวาดเมื่อ unmount
กำลังเตรียมตัวอย่าง…
การเรียกแบบเดียวกับ 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> เล่นโดยเบราว์เซอร์โดยไม่ต้องมี callback ของเฟรม
- เปลี่ยนจำนวนจุด: ตัวนับแสดงว่า React เรนเดอร์ครั้งเดียวต่อการเปลี่ยนแปลง ไม่เคยเรนเดอร์ต่อเฟรม
scopeเขียนค่าครั้งเดียวที่คอนเทนเนอร์แทนที่จะเขียนทุกองค์ประกอบinspect(element)บอกว่าแต่ละพร็อพเพอร์ตีใช้เส้นทางใดและเพราะอะไร
กำลังเตรียมตัวอย่าง…
03 · เสถียร
ขัดจังหวะตรงไหนก็ได้ มันจะทำต่อ
เป้าหมายใหม่เริ่มจากตำแหน่งที่องค์ประกอบอยู่บนหน้าจอ และสปริงยังรักษาความเร็วไว้ด้วย การกลับทิศกลางทางจึงโค้งอย่างลื่นไหลแทนที่จะหยุดก่อน ตัวควบคุมที่ประกาศใน hook จะหยุดและถูกปล่อยเมื่อถูกแทนที่และเมื่อ unmount ส่วน markup ที่เรนเดอร์บนเซิร์ฟเวอร์จะเคลื่อนไหวต่อหลัง hydration
- คลิกสองครั้งเร็ว ๆ: กับ
springเส้นทางจะโค้ง กับtimingตำแหน่งจะคงอยู่แต่เริ่มเส้นโค้งใหม่ - การหยุดทิ้งค่าไว้ที่เดิม ไม่มีอะไรกระโดดไปสถานะสุดท้าย
- ไม่มีลูปเฟรมที่ถูกลืมหลัง unmount เปลี่ยน route หรือแท็บถูกซ่อน
กำลังเตรียมตัวอย่าง…
- แท่นแม่เหล็กไอคอนขยายใหญ่เมื่อตัวชี้ผ่าน ดันไอคอนข้าง ๆ ออก และสงบลงเมื่อตัวชี้ออกไป
moveInputfollowuseAnimatedCSSmultiply - สำรับการ์ดปัดลากการ์ดใบบนสุด เลยเกณฑ์แล้วมันจะปลิวไป ไม่เช่นนั้นจะเด้งกลับ
dragInputuseAnimatedListenerAnimated.div - แกลเลอรีที่ใช้ร่วมกันไทล์ขยายเป็นมุมมองรายละเอียดแล้วหดกลับเข้าตาราง
Animated.SceneAnimated.Keepmove
สร้างบน Animated
ต้องการคอมโพเนนต์สำเร็จรูป? Animated Chorus
ตัวเลขที่หมุน ไฮไลต์การ์ดที่เคลื่อนที่ ความคืบหน้า ชีต และรายการแบบเคลื่อนไหว ที่ใส่ลงใน React และ React Native ได้ทันที ทั้งสามตัวนี้กำลังทำงานอยู่บนหน้านี้
ไปที่ Animated Chorusเริ่มได้ในสามนาที
ติดตั้งแพ็กเกจ ทำให้ค่าแรกเคลื่อนไหว แล้วเลือกคู่มือสำหรับงานตรงหน้า
npm install @kkwaenggwari/animated