Gerak untuk React DOM · API Animated dari React Native

Tulis geraknya sekali. Berjalan mulus, tak pernah rusak.

Animated membawa Animated dari React Native ke web. Satu nilai menggerakkan elemen sebanyak apa pun tanpa render React di setiap frame, gerak yang didukung diputar oleh browser sendiri, dan setiap interupsi melanjutkan dari yang ada di layar.

Instal
npm install @kkwaenggwari/animated

Satu nilai jam menggerakkan gelombang ke-64 bentuk. Gerakkan pointer di atas panggung.

Diukur pada build ini

Diukur dengan build 1.0.0 di Chrome headless pada PC desktop. Angka bergantung pada perangkat. Cara kami mengukur

  • 0.00msJavaScript per frame saat 400 elemen bergerak

    Gerak transform dan opacity yang terbatas pada elemen Animated diputar oleh browser. Callback frame milik halaman tidak bekerja sama sekali.

  • 0.13msJavaScript per frame saat satu nilai menggerakkan 10.000 elemen

    Nilai menulis satu variabel CSS; setiap elemen menurunkan gayanya sendiri dari variabel itu di CSS.

  • 0Render React selama gerak

    Nilai tidak pernah melewati state React. Komponen dirender saat props Anda berubah, bukan saat frame berganti.

01 · Sederhana

API yang sudah Anda kenal, di style React biasa

timing, spring, interpolate, loop, dan Animated.event mempertahankan nama dan konfigurasi dari React Native. Nilai langsung masuk ke prop style biasa, jadi tidak ada komponen khusus yang perlu dipelajari sebelum gerak pertama.

  • Bawa kode React Native dengan mengganti nama Animated.View menjadi Animated.div.
  • Satu nilai bisa sekaligus menggerakkan pita, dial, dan deretan kartu, masing-masing dengan rentangnya sendiri.
  • useAnimated memiliki resepnya: dimulai saat mount, dimulai ulang saat dependensi berubah, dan dibersihkan saat unmount.

Menyiapkan contoh…

Panggilan yang sama seperti di 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 · Cepat

Tanpa render React di setiap frame

Nilai hook adalah variabel CSS. Interpolasi linear dan aritmetika menjadi ekspresi calc() yang tepat dari variabel itu, jadi setiap frame hanya satu penulisan dan sisanya dihitung browser. Gerak transform dan opacity yang terbatas pada elemen Animated.<tag> diputar browser tanpa callback frame.

  • Ubah jumlah titik: penghitung menunjukkan React merender sekali per perubahan, tidak pernah per frame.
  • scope menulis nilai sekali pada wadah, bukan pada setiap elemen.
  • inspect(element) memberi tahu jalur yang dipakai setiap properti dan alasannya.

Menyiapkan contoh…

03 · Stabil

Interupsi di mana saja. Ia melanjutkan.

Target baru dimulai dari posisi elemen di layar, dan pegas juga mempertahankan kecepatan, sehingga putar balik di tengah jalan melengkung mulus alih-alih berhenti dulu. Pengendali yang dideklarasikan di hook berhenti dan dilepas saat diganti dan saat unmount, dan markup yang dirender di server terus beranimasi setelah hidrasi.

  • Klik dua kali dengan cepat: dengan spring lintasannya melengkung, dengan timing posisinya bertahan tetapi kurva baru dimulai.
  • Menghentikan membiarkan nilai tetap di tempatnya; tidak ada yang melompat ke keadaan akhir.
  • Tidak ada loop frame yang terlupakan setelah unmount, pergantian route, atau tab tersembunyi.

Menyiapkan contoh…

Dibangun dengan Animated

Butuh komponen jadi? Animated Chorus.

Angka yang bergulir, sorotan kartu yang berpindah, progres, sheet, dan daftar beranimasi yang langsung terpasang di React dan React Native. Ketiganya sedang berjalan di halaman ini.

Kunjungi Animated Chorus

Mulai dalam tiga menit

Instal paketnya, gerakkan nilai pertama, lalu pilih panduan untuk tugas di depan Anda.

npm install @kkwaenggwari/animated

Cari

Ketik untuk mencari dokumentasi.