【发布时间】:2020-05-25 15:49:23
【问题描述】:
我在我的项目中使用 Vue.js 和 Laravel,最近使用名为 Lottie 的插件添加了两个动画。每个动画都是一个组件,它们都使用单独的 JSON 文件来为一组 PNG 图像制作动画(类似于 PNG 序列)。这两个 JSON 文件本地存储在 /public/data/ 路径下的项目文件夹中。
首先,除非我输入绝对路径 (/users/username/documents/projectname/public/data/filename.json),否则不会读取 JSON 文件,我有没有办法只需使用 /data/filename.json 就可以让它工作?
其次,当我在我的组件中添加以下代码时,我的 JS 文件会按预期编译为单独的块:
const animationData = () =>
import("/users/username/documents/projectname/public/data/filename.json");
动画尝试运行时出现以下错误:
Invalid prop: type check failed for prop "data". Expected Object, got Function
found in
---> <VueLottie>
但是,当我在我的组件中使用正常导入导入我的 json 文件时,它可以正常工作并显示动画:
import animationData from "/users/username/documents/projectname/public/data/filename.json";
我的动画组件都是这样设置的:
<template>
<vue-lottie ref="lottie" loop autoplay :data="animationData" :height="400" :width="400"></vue-lottie>
</template>
<script>
import vueLottie from "vue-lottie-ssr";
import animationData from '/users/username/documents/projectname/public/data/filename.json'
export default {
name: 'animation',
components: {
vueLottie
},
data () {
return {
speed: 1,
animationData
}
},
computed: {
lottie () {
return this.$refs.lottie
}
}
}
</script>
我也尝试过在组件挂载时通过 axios 调用获取 JSON 文件,但出现同样的错误。
更新
我更新了我的代码,以便每个组件都是延迟加载的,而不是 JSON 文件。像这样:
components: {
WinAnimation: () => import("./WinAnimation.vue");
LoseAnimation: () => import("./LoseAnimation.vue");
}
但是现在我收到以下错误:
Unknown custom element: <win-animation> - did you register the component correctly? For recursive components, make sure to provide the "name" option.
更新 2
我意识到我收到错误消息的原因。正确的方法是在父 vue 文件中的脚本顶部添加以下内容。
const winAnimation = () => import("./WinAnimation.vue");
const loseAnimation = () => import("./LoseAnimation.vue");
然后在 export default {...} 里面我忘了添加名字,所以:
components: { winAnimation, loseAnimation }
现在我的代码已经被拆分,我的 app.js 文件大小减少了近一半! :)
【问题讨论】:
-
对不起,我忘了提到我尝试 axios 在组件挂载时获取 json,但我收到了上面提到的相同错误消息。 @EmielZuurbier
-
关于您的更新:您在模板中究竟是如何使用组件的?
-
没关系,我知道哪里出错了,再次更新我的问题 - 非常感谢您的帮助!
-
如何解决动态导入问题?我似乎无法动态导入 lottie .json 文件。它不会显示没有任何错误的动画...
标签: javascript json vue.js lazy-loading lottie