คู่มือ · 01

ค่าและสไตล์

ถือครองค่าในคอมโพเนนต์ สร้างผลลัพธ์ด้วย calc() และเลือกว่าจะเขียนตัวแปร CSS ที่ไหน

การถือครองค่า

useAnimatedValue(initial) สร้าง Value ที่เป็นของคอมโพเนนต์ ใช้ตัวเลข หรือเรคคอร์ดอย่าง { x: 0, opacity: 1 } ที่แต่ละฟิลด์เป็นค่าแยกกัน

ใน style ธรรมดา ค่าของ hook คือโทเคน var(--kkwa-…, initial) การอัปเดตจะเขียนตัวแปรนั้นลงในองค์ประกอบที่ใช้มัน React ไม่เรนเดอร์

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

สร้างด้วย calc()

การอินเทอร์โพเลตที่ไม่มี easing และ add, subtract, multiply หรือ divide กับค่าคงที่จะกลายเป็นนิพจน์ calc() ที่แม่นยำของตัวแปรเดียวกัน เบราว์เซอร์คำนวณเอง ไม่มี JavaScript รันเพื่อสิ่งเหล่านี้ในเฟรมใดเลย

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})` }} />;

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

สีและการคำนวณเอง

สี การอินเทอร์โพเลตที่มี easing, modulo, diffClamp และ AnimatedComputed เขียนเป็น calc() ไม่ได้ useAnimatedCSS(node) ให้ตัวแปร CSS ของตัวเองที่ JavaScript อัปเดต โดยมีอายุเท่ากับคอมโพเนนต์

การใช้โหนดแบบนั้นใน style โดยตรงจะโยนข้อผิดพลาด ต้นทุนจึงไม่เคยถูกซ่อน

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 }} />;

ให้ hook ถือครองสูตร

useAnimated(initial, factory, deps) ถือครองค่าและตัวควบคุมทุกตัวที่ประกาศแบบซิงโครนัสใน factory มันเริ่มเมื่อ mount เริ่มใหม่เมื่อ dependency เปลี่ยน และหยุดเมื่อ unmount

ส่ง { autoStart: false } สำหรับการเล่นที่ขับด้วยเหตุการณ์ แล้วเรียก start(), stop() หรือ reset() บนค่าที่คืนมา

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))` }} />;

เขียนครั้งเดียวสำหรับหลายองค์ประกอบ

โดยค่าเริ่มต้น ทุกองค์ประกอบที่สไตล์ inline ใช้ค่านั้นจะได้รับตัวแปร ด้วย scope ตัวแปรจะถูกเขียนครั้งเดียวที่คอนเทนเนอร์และลูก ๆ สืบทอดไป เหมาะกับองค์ประกอบนับร้อย

AnimatedProvider scope={ref} กำหนด scope เริ่มต้นให้ค่า hook ทั้งหมดที่อยู่ข้างใต้

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>;

การอ่านค่าใน JavaScript

getValue() คืนสแนปช็อตโดยไม่สมัครรับของ React useAnimatedListener(node, fn) เรียกคุณทุกครั้งที่เปลี่ยนและนำ listener ออกเมื่อ unmount ใช้สำหรับวาดลง canvas หรือการวิเคราะห์ ไม่ใช่สำหรับการเรนเดอร์

ค้นหา

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