Vue、React 封装Lottie

Vue

<template>
  <div
    v-if="visible"
    ref="animationRef"
    :style="{...styles}"
    :class="['lottie-animate', ...className]"
  />
</template>

<script>
  import lottie from 'lottie-web';

  export default {
    props: {
      className: {
        type: Array,
        default: () => []
      },
      visible: {
        type: Boolean,
        default: () => true,
      },
      styles: {
        type: Object,
        default: () => {}
      },
      animationData: {},
    },
    data() {
      return {
        animationInstances: null
      }
    },
    methods: {
      init() {
        if (!this.animationData) return;

        this.animationInstances = {};
        if (typeof this.animationData === 'function') {
          this.animationData().then(this.initAnimate);
        } else {
          this.initAnimate(this.animationData);
        }
      },
      initAnimate(animationData) {
        this.animationInstances = lottie.loadAnimation({
          container: this.$refs.animationRef,
          renderer: 'svg',
          loop: true,
          autoplay: true,
          animationData,
        });

        // eslint-disable-next-line no-unused-expressions
        this.$emit('on-init', this.animationInstances);
      }
    },
    watch: {
      visible() {
        if (this.animationInstances || !this.visible) return;

        this.init();
      }
    },
    mounted() {
      if (!this.visible) return;

      this.init();
    },
    beforeDestroy() {
      this.animationInstances?.destroy?.();
    }
  }
</script>

<style scoped>

</style>

<template>
   <Animation :animationData="animationData" />
</template>

<script>
 	import Animation from "@/components/animation";

	export default {
	  data() {
	    return {
	      animationData: () => import('@/assets/lottie/header/data.json')
	    }
	  },
	  components: {
	    Animation: Animation
	  }
	}
</script>

React

import React, { useRef, useEffect } from 'react';
import lottie from 'lottie-web';
import classNames from 'classnames';

const Animation = ({ className, visible = true, style, animationData, onInit }) => {
  const el = useRef();
  const animationInstances = useRef();

  function init() {
    if (!animationData) return;

    animationInstances.current = {};
    if (typeof animationData === 'function') {
      animationData().then(initAnimate);
    } else {
      initAnimate(animationData);
    }

    function initAnimate(animationData) {
      animationInstances.current = lottie.loadAnimation({
        container: el.current,
        renderer: 'svg',
        loop: true,
        autoplay: true,
        animationData,
      });

      // eslint-disable-next-line no-unused-expressions
      onInit?.(animationInstances.current);
    }
  }

  useEffect(() => {
    if (!visible) return;

    init();

    return () => {
      // eslint-disable-next-line no-unused-expressions
      animationInstances.current?.destroy?.();
    };
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);

  useEffect(() => {
    if (animationInstances.current || !visible) return;

    init();
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [visible]);

  return (
    <div
      ref={el}
      style={{ visibility: !visible && 'hidden', ...style }}
      className={classNames('lottie-animate', className)}
    ></div>
  );
};

export default Animation;

const animationData = () => import('@/assets/lottie/header/data.json');

const Header = () => {
	
	return (
		<Animation animationData={animationData} />
	)
}
   
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vue3-lottie是一个用于在Vue3中使用Lottie动画的插件。安装它的步骤如下: 1. 首先,确保你已经安装了npm、cnpm、pnpm或yarn,这些都是常用的包管理工具,你可以根据自己的喜好选择其中一个来安装依赖。 2. 在你的项目中,打开终端并执行以下命令来安装vue3-lottie插件:npm install vue3-lottie@latest 或者 cnpm install vue3-lottie@latest 或者 pnpm install vue3-lottie@latest 或者 yarn add vue3-lottie@latest。 3. 安装完成后,你可以在你的项目中使用vue3-lottie插件了。 关于Lottie动画文件的获取,你可以访问https://lottiefiles.com/featured 网站来获取一些精选的Lottie动画文件。在这个网站上,你可以找到各种各样的动画效果,并下载对应的json文件。 在使用vue3-lottie插件时,你只需要将下载的Lottie动画的json文件导入到你的Vue组件中,并将其渲染到界面上即可。你可以参考Lottie官方地址来了解更多关于该插件的详细信息。 所以,总结起来,安装vue3-lottie的步骤是:1、安装npm/cnpm/pnpm/yarn;2、下载Lottie动画的json文件;3、将json文件导入到Vue组件中并渲染。 希望能对你有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [vue3+lottie的使用神器:vue3-lottie (electron也适用)](https://blog.csdn.net/qq_41619796/article/details/131866960)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值