গাইড · 01
মান আর স্টাইল
কম্পোনেন্টে মান রাখুন, calc() দিয়ে আউটপুট তৈরি করুন আর বাছুন CSS ভেরিয়েবল কোথায় লেখা হবে।
মানের মালিকানা
useAnimatedValue(initial) কম্পোনেন্টের একটি Value তৈরি করে। সংখ্যা বা { x: 0, opacity: 1 }-এর মতো রেকর্ড ব্যবহার করুন, যার ফিল্ডগুলো আলাদা মান।
সাধারণ style-এ হুকের মান var(--kkwa-…, initial) টোকেন। হালনাগাদ সেই ভেরিয়েবলটি যে এলিমেন্ট ব্যবহার করে তাতে লেখে; React রেন্ডার করে না।
উদাহরণ প্রস্তুত হচ্ছে…
calc() দিয়ে তৈরি
easing ছাড়া ইন্টারপোলেশন আর ধ্রুবকের সঙ্গে add, subtract, multiply বা divide একই ভেরিয়েবলের নিখুঁত calc() এক্সপ্রেশন হয়। ব্রাউজার এগুলো হিসাব করে; এগুলোর জন্য কোনো ফ্রেমে JavaScript চলে না।
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) এগুলোকে JavaScript দিয়ে হালনাগাদ হওয়া নিজস্ব CSS ভেরিয়েবল দেয়, কম্পোনেন্টের সমান জীবনকালসহ।
এমন নোড সরাসরি style-এ ব্যবহার করলে ত্রুটি ছোঁড়া হয়, তাই খরচ কখনো লুকানো থাকে না।
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 }} />;হুককে রেসিপির মালিক করুন
useAnimated(initial, factory, deps) মান আর factory-তে সিঙ্ক্রোনাসভাবে ঘোষিত প্রতিটি কন্ট্রোলারের মালিক। এটি মাউন্টে শুরু হয়, নির্ভরতা বদলালে আবার শুরু হয় আর আনমাউন্টে থামে।
ইভেন্ট-চালিত প্লেব্যাকের জন্য { autoStart: false } দিন, তারপর ফেরত মানে start(), stop() বা reset() কল করুন।
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 দিলে ভেরিয়েবল কন্টেইনারে একবার লেখা হয় আর তার children উত্তরাধিকারে পায়: শত শত এলিমেন্টের জন্য সঠিক পছন্দ।
AnimatedProvider scope={ref} নিচের সব হুক মানের জন্য ডিফল্ট scope ঠিক করে।
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 সরায়। canvas-এ আঁকা বা অ্যানালিটিক্সের জন্য ব্যবহার করুন, রেন্ডারের জন্য নয়।