uniapp使用uview框架问题记录
uniapp使用uview框架问题记录(持续更新)
环境:uview 版本2.x
1.在微信小程序运行时插槽不生效
问题描述:在使用input输入框的prefix插槽添加图标时,在小程序端不生效。
问题代码:
1 | <template> |
H5中效果:账号输入框与密码输入框前的图标是正常显示的。
微信小程序效果:账号输入框中的图标不见了,排查发现插槽没有起作用。
解决方式:
将u--input
修改成为u-input
。
1 | <u-input placeholder="请输入账号" border="bottom" v-model="username"> |
排查过程:
过程1:怀疑自定义的图标未正确在小程序生效。(由于密码输入框使用的uview内置图标,而账号输入框使用的阿里图标库的自定义图标。)
查看微信开发者工具中的文件确定图标字体库是正确导入的。后面我怀疑是在线图标的问题,后面从阿里图标库下载到本地使用本地路径,问题还是一样。
过程2:怀疑是插槽未生效,
通过调试器查询wxml发现似乎好像真的没有插槽出现。
接着我格式化代码后,查看插槽定义跟使用。
插槽的使用相关代码(语法没有问题):
组件中插槽定义的相关代码(语法也没有问题):
接着我怀疑启动多插槽
的配置出了问题。准备在js文件中添加下面配置:
1 | Component({ |
于是我信心满满的打开js文件准备添加配置,如下图,发现这文件哪是人能看的,我尝试了在几个位置插入开启多插槽的配置
,代码编译直接报错。
也懒得看了这js到底啥逻辑了,我的目的不就是验证是不是开启多插槽
的配置有问题吗?于是我把wxml修改成如下:就使用一个插槽。
1 | <!-- <slot name="prefix"></slot> |
接着把登录页面中的代码改成不指定插槽:
编译运行!
问题似乎还是如此。
过程3:我自己写了一个u-test组件定义了两个插槽。
1 | <!--uni_modules/uview-ui/components/u-test.wxml--> |
1 | // uni_modules/uview-ui/components/u-test.js |
定义在页面中,
结果显示插槽是正常的,
现在没有什么思路了,准备投身百度,百度了一圈都没有找到类似的情况。
于是我再去看uview的文档,一开始似乎没发现有什么,后面看到了这两个小提示(ps:看到过很多遍了,无语…)
原来我一直被前面的提示给误导了,前面说使用u--input
、u-input
在vue页面均可。后面的插槽slot
中又说非nvue
环境要使用u-input
插槽才生效。于是我带着疑惑把u--input
改为了u-inpu
后,重新编译运行,竟然好了,真无语,搞了这么久…
2、UniApp中style标签中使用scoped后,导致在微信小程序端样式不生效
问题描述:
问题代码:
1 | <style lang="scss" scoped> |
在H5端显示正常:
H5端页面结构:
在小程序端样式不生效:
小程序端页面结构:
原因分析:
观察小程序的页面结构可以发现,如果一个组件渲染后后包括子标签,会造成页面自己写的样式无效。生成在小程序中的css代码与实际上的不对应,如果手动把上图431行-436行代码改动一下可以发现页面正常了。
解决方式:
- 使用scoped穿透
1 | css使用 >>> .test{ xxx } |
例如:css中使用>>>来标识scoped的data-v-xxxxxx所在位置,>>>可以写在任何位置,写在哪,data-v-xxxxxx就生成在哪里。
uniapp代码修正如下:
1 | <style lang="scss" scoped> |
3、解决uniapp导入微信开发者工具,主包大于4M,无法预览到手机
如图查看依赖分析发现光uview-ui
就接近4M大小了。
经过排查发现,其中每个wxss中都包含了字体的样式文件,甚至uview-ui
中的每个组件的样式文件都包含了这些内容,导致文件过大。如下图:
去掉在uni.scss
中对字体样式的导入,按需在页面中导入即可。