การเคลื่อนไหวสำหรับ 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

Spinner.jsx
// 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 หรือแท็บถูกซ่อน

กำลังเตรียมตัวอย่าง…

สร้างบน Animated

ต้องการคอมโพเนนต์สำเร็จรูป? Animated Chorus

ตัวเลขที่หมุน ไฮไลต์การ์ดที่เคลื่อนที่ ความคืบหน้า ชีต และรายการแบบเคลื่อนไหว ที่ใส่ลงใน React และ React Native ได้ทันที ทั้งสามตัวนี้กำลังทำงานอยู่บนหน้านี้

ไปที่ Animated Chorus

ค้นหา

พิมพ์เพื่อค้นหาเอกสาร