跳到主要内容

uniapp 陷阱

· 阅读需 3 分钟
Klein
freelancer

Trap 1:v-bind 无法编译到小程序平台

小程序不支持 v-bind='$attrs' 将所有的未声明在组件内部的 props 传递给其他子组件。只能一个个手动声明需要传递的 props 给其他子组件。

Trap 2: <component :is='component' /> 无法编译到小程序平台

小程序不支持动态加载组件,如果在业务组件内部能事先知道可能会有哪些组件被加载,可以预先导入所有的组件。

使用 v-if 指令动态切换(虽然这个方案性能极低,如果导入的组件很多,那么模板代码里充斥着大量的 v-if)。

信息

尝试过使用 render 函数,编写多个 switch case 来实现 <component :is='' /> 但是发现编写的 render 函数在小程序端编译不通过。 因为 render 函数生成的 VNode 并不会编译成 wxml 文件,导致组件会导入失败。 orz...

Trap 3: iconfont 字体文件在 app 真机未能加载

可以用条件编译,在 app 端填写 https:// 前缀,否则会将 //xxxxx.woff 视作为一个 file 协议。

Trap 4: 组件只能在 vue 文件内导入。

这个 bug 通常是开发者希望将多个 vue 组件内用到的大量的相同的组件抽到一个单独的 js 文件,然后再单独导入 JS 文件即可,提高维护性。

例如很多页面用到的相同的组件抽到 foo.js

foo.js
export { default as Wformapplyfortender } from "./wformapplyfortender/index.vue";
export { default as Wformhrsclasschange } from "./wformhrsclasschange/index.vue";
export { default as Wformhrscurstate } from "./wformhrscurstate/index.vue";
export { default as Wformhrsmove } from "./wformhrsmove/index.vue";
export { default as Wformhrsposition } from "./wformhrsposition/index.vue";
export { default as Wformhrsquit } from "./wformhrsquit/index.vue";
export { default as Wformhrsrecruitment } from "./wformhrsrecruitment/index.vue";
export { default as Wformhrsrehiring } from "./wformhrsrehiring/index.vue";
export { default as Wformhrsrenewalcheck } from "./wformhrsrenewalcheck/index.vue";
export { default as Wformhrsrepost } from "./wformhrsrepost/index.vue";
export { default as Wformhrswagesvary } from "./wformhrswagesvary/index.vue";
export { default as Wformproinspection } from "./wformproinspection/index.vue";

然后希望在那些用到 foo.js 文件的组件直接 import 命名导入即可。

bar.vue
<script setup>
import * as FlowComponents from "@/components/foo";
</script>

但是这没有用,会编译失败找到不到对应的组件声明(也就是编译后不会生成这些组件的 JSON 文件)。个人猜测是因为普通 js 脚本不会视作为一个页面模块,所以也就不会将这个脚本内导入的组件编译声明。