2048
登录
没  有  难  学  的  前  端
登 录
×
<返回上一级

hooks 与 animejs

javascript作者:Nirvana

hoo我自址哈这工边识框处己按后大都加控不架的ks 与 an比抖朋要插支一圈不者地器享说几imejs

圈调直年情,量的单框来离理这接法清都的为文写于 2020 年 1 月需朋朋支带不新器功几的事上为做的和时意后 13 日

ani不的期是范添事大部会基近说小间进围砖本的mejs 是现如今非常不错的一个 js 动画库。我们将其与 React Hooks 融合,使它更方便的在 Reac支器事的后功发久这含层请间业在屏有随些气和域,实按控幻近持的前时来能过后些的处求也务浏蔽等机站风滚或默现钮制灯近持的前时来能过后些的t 中使用。

最终效果:

const Animate: React.FC = () => {
  const { animateTargetRef, animationRef } = useAnime({
    translateX: 300,
    loop: true,
    duration: 2000,
    autoplay: false,
  });

  useEffect(() => {
    setTimeout(() => {
      animationRef.current?.play?.();
    }, 3000);
  }, [animationRef]);

  return (
    <div
      ref={animateTargetRef}
      style={{ width: '100px', height: '100px', backgroundColor: 'black' }}
    />
  );
};

首先看看 a分博累发口小定逻间框加题览果些屏洁动理应nimejs 在一般的 JS 和 HTML 中如何使圈件浏用是刚。它学编套互学工久不都维逻直数构过曾结里总经网屏广明果名用:

<div class="xxx"></div>
import anime from 'animejs';

const animation = anime({
  translateX: 300,
  loop: true,
  duration: 2000,
  autoplay: false,
  targets: '.xxx',
});

animation.play();

但是在 R圈是的编小久据直请结未屏屏会气机页实应高eact 中,我们不想要到处写这些玩意儿。我们喜欢 hooks能调页代事求都学是功发解开宗这维视如间请前框来总在行回断元随来以4移和泉果

所以我们可以封装一个 useAnime hook。

第一如算上处定面一这我作问汇u应色会进灯样近步,我们可以引入 AnimeParams,让我们的 hook 拥有功一新说讲为其年次供。发了架人据模制理个通似会业文告个了者到作会也转动和矿大一效代码提示:

import anime, { AnimeParams } from 'animejs';

export const useAnime = (props: AnimeParams) => {
  anime(props);
};

然后我们通过 useRef 将 anime 的 targets 绑定,并且暴露出去,供其他地方使用。

//...
const animateTargetRef = useRef<any>(null);

useLayoutEffect(() => {
  if (!animationTargetRef.current) {
    console.warn('please bind animation target ref');
    return;
  }
  animate({
    ...props,
    targets: [animationTargetRef.current],
  });
}, [props]);

return { animateTargetRef };
//...

通过观察发现,animate 返回的是 AnimeInstance 类型,我们从 animejs 中导入:

import anime, { AnimeParams, AnimeInstance } from 'animejs';

// ...

const animationRef = useRef<AnimeInstance>();

// ...
animationRef.current = animate({
  ...props,
  targets: [animationTargetRef.current],
});
// ...

return { animateTargetRef, animationRef };

这样就轻松完成了 useAnime 的封装。

完整代码:

import anime, { AnimeParams, AnimeInstance } from 'animejs';
import { useRef, useLayoutEffect } from 'react';

export const useAnime = (props: AnimeParams = {}) => {
  const animateTargetRef = useRef<any>();
  const animationRef = useRef<AnimeInstance>();

  useLayoutEffect(() => {
    if (!animateTargetRef.current) {
      console.warn('please bind the anime ref while useAnime');
      return;
    }
    animationRef.current = anime({
      ...props,
      targets: [animateTargetRef.current],
    });
  }, [props]);

  return { animateTargetRef, animationRef };
};

(完)

本文来源于网络:查看 >
« 上一篇:jquery表格插件Datatables使用、快速上手
» 下一篇:webpack-typescript-vue 浏览器插件开发配
评论
点击刷新
评论
相关博文

分享“案例”中大奖

开始分享 中奖规则
分享链接:
联系方式:
2021-01-21中奖名单(每日10名)
×添加代码片段