Panduan · 01

Nilai dan gaya

Miliki nilai di komponen, turunkan keluaran dengan calc(), dan pilih di mana variabel CSS ditulis.

Memiliki nilai

useAnimatedValue(initial) membuat Value milik komponen. Gunakan angka atau record seperti { x: 0, opacity: 1 } yang field-nya adalah nilai terpisah.

Di style biasa, nilai hook adalah token var(--kkwa-…, initial). Pembaruan menulis variabel itu ke elemen yang memakainya; React tidak merender.

Menyiapkan contoh…

Menurunkan dengan calc()

Interpolasi tanpa easing serta add, subtract, multiply, atau divide dengan konstanta menjadi ekspresi calc() yang tepat dari variabel yang sama. Browser menghitungnya; tidak ada JavaScript yang berjalan untuknya di frame mana pun.

Slide.jsx
const progress = useAnimatedValue(0);

// A linear interpolation of a hook value is a calc() of the same CSS variable.
const x = progress.interpolate({ inputRange: [0, 1], outputRange: ['0px', '180px'] });
const half = multiply(progress, 0.5);

<div style={{ opacity: half, transform: `translateX(${x})` }} />;

Menyiapkan contoh…

Warna dan perhitungan sendiri

Warna, interpolasi dengan easing, modulo, diffClamp, dan AnimatedComputed tidak dapat ditulis sebagai calc(). useAnimatedCSS(node) memberinya variabel CSS sendiri yang diperbarui JavaScript, dengan masa hidup yang sama dengan komponen.

Memakai node seperti itu langsung di style melempar kesalahan, jadi biayanya tidak pernah tersembunyi.

Glow.jsx
const progress = useAnimatedValue(0);

// Colors and eased curves are not calc() expressions: give them their own CSS value.
const color = useAnimatedCSS(
  progress.interpolate({ inputRange: [0, 1], outputRange: ['#3d3bf3', '#22b8f0'] }),
);

<div style={{ background: color }} />;

Biarkan hook memiliki resepnya

useAnimated(initial, factory, deps) memiliki nilai dan setiap pengendali yang dideklarasikan secara sinkron di factory. Ia dimulai saat mount, dimulai ulang saat dependensi berubah, dan berhenti saat unmount.

Berikan { autoStart: false } untuk pemutaran yang digerakkan event, lalu panggil start(), stop(), atau reset() pada nilai yang dikembalikan.

Intro.jsx
const intro = useAnimated(
  { opacity: 0, y: 24 },
  (value) => {
    parallel([
      timing(value.opacity, { toValue: 1, duration: 400 }),
      spring(value.y, { toValue: 0, stiffness: 220, damping: 20 }),
    ]);
  },
  [],
);

<section style={{ opacity: intro.opacity, transform: `translateY(calc(${intro.y} * 1px))` }} />;

Satu penulisan untuk banyak elemen

Secara bawaan, variabel diberikan ke setiap elemen yang gaya inline-nya memakai nilai itu. Dengan scope, variabel ditulis sekali pada wadah dan diwarisi anak-anaknya: pilihan tepat untuk ratusan elemen.

AnimatedProvider scope={ref} menetapkan scope bawaan untuk semua nilai hook di bawahnya.

Field.jsx
const field = useRef(null);

// Written once on the field; every child that uses the value inherits it.
const wave = useAnimatedValue(0, { scope: field });

<div ref={field}>
  {items.map((item) => (
    <i key={item} style={{ transform: `rotate(calc(${wave} * 1turn))` }} />
  ))}
</div>;

Membaca nilai di JavaScript

getValue() mengembalikan snapshot tanpa langganan React. useAnimatedListener(node, fn) memanggil Anda pada setiap perubahan dan melepas listener saat unmount. Gunakan untuk menggambar di canvas atau analitik, bukan untuk render.

Cari

Ketik untuk mencari dokumentasi.