Chuyển động cho React DOM · API Animated của React Native

Viết chuyển động một lần. Chạy mượt, không bao giờ gãy.

Animated đưa Animated của React Native lên web. Một giá trị điều khiển bao nhiêu phần tử cũng được mà không render React ở mỗi khung hình, chuyển động được hỗ trợ do chính trình duyệt phát, và mọi lần ngắt đều tiếp tục từ những gì đang trên màn hình.

Cài đặt
npm install @kkwaenggwari/animated

Một giá trị đồng hồ điều khiển sóng của cả 64 hình. Di chuyển con trỏ trên sân khấu.

Đo trên bản build này

Đo bằng bản build 1.0.0 trên Chrome headless ở một PC để bàn. Số liệu phụ thuộc vào thiết bị. Cách chúng tôi đo

  • 0.00msJavaScript mỗi khung hình khi 400 phần tử di chuyển

    Chuyển động transform và opacity có giới hạn trên phần tử Animated do trình duyệt phát. Các callback khung hình của trang không phải làm gì.

  • 0.13msJavaScript mỗi khung hình khi một giá trị điều khiển 10.000 phần tử

    Giá trị ghi một biến CSS; mỗi phần tử tự suy ra kiểu dáng của mình từ biến đó trong CSS.

  • 0Lần render React trong lúc chuyển động

    Giá trị không bao giờ đi qua state React. Component render khi props của bạn thay đổi, không phải khi khung hình đổi.

01 · Đơn giản

API bạn đã biết, trên style React thông thường

timing, spring, interpolate, loop và Animated.event giữ nguyên tên và cấu hình của React Native. Giá trị đi thẳng vào prop style thông thường, nên không cần học component đặc biệt nào trước chuyển động đầu tiên.

  • Mang mã React Native sang bằng cách đổi Animated.View thành Animated.div.
  • Một giá trị có thể cùng lúc di chuyển một dải, một mặt số và một hàng thẻ, mỗi thứ với khoảng riêng.
  • useAnimated sở hữu công thức: bắt đầu khi mount, chạy lại khi phụ thuộc thay đổi và dọn dẹp khi unmount.

Đang chuẩn bị ví dụ…

Lời gọi giống hệt 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 · Nhanh

Không render React ở mỗi khung hình

Giá trị của hook là một biến CSS. Nội suy tuyến tính và phép tính trở thành biểu thức calc() chính xác của biến đó, nên mỗi khung hình chỉ là một lần ghi và phần còn lại do trình duyệt tính. Chuyển động transform và opacity có giới hạn trên phần tử Animated.<tag> do trình duyệt phát mà không cần callback khung hình.

  • Đổi số chấm: bộ đếm cho thấy React render một lần cho mỗi thay đổi, không bao giờ theo từng khung hình.
  • scope ghi giá trị một lần trên phần tử chứa thay vì trên từng phần tử.
  • inspect(element) cho biết mỗi thuộc tính dùng đường nào và vì sao.

Đang chuẩn bị ví dụ…

03 · Ổn định

Ngắt ở đâu cũng được. Nó vẫn tiếp tục.

Mục tiêu mới bắt đầu từ chỗ phần tử đang ở trên màn hình, và lò xo còn giữ cả vận tốc, nên quay đầu giữa chừng sẽ uốn mượt thay vì dừng lại trước. Bộ điều khiển khai báo trong hook dừng và được giải phóng khi bị thay thế và khi unmount, còn markup render phía máy chủ vẫn tiếp tục hoạt ảnh sau khi hydrate.

  • Nhấp nhanh hai lần: với spring đường đi uốn cong, với timing vị trí được giữ nhưng một đường cong mới bắt đầu.
  • Dừng lại thì giá trị ở yên đó; không có gì nhảy đến trạng thái cuối.
  • Không còn vòng lặp khung hình bị bỏ quên sau khi unmount, đổi route hay tab bị ẩn.

Đang chuẩn bị ví dụ…

Xây trên Animated

Cần component có sẵn? Animated Chorus.

Số cuộn, điểm nhấn thẻ di chuyển, tiến độ, sheet và danh sách hoạt ảnh gắn thẳng vào React và React Native. Ba thứ này đang chạy ngay trên trang này.

Ghé Animated Chorus

Bắt đầu trong ba phút

Cài gói, cho giá trị đầu tiên chuyển động, rồi chọn hướng dẫn cho việc bạn đang làm.

npm install @kkwaenggwari/animated

Tìm kiếm

Gõ để tìm trong tài liệu.