uniapp nvue页面踩坑记录

文章列举了uniapp的nvue页面开发中的一些限制和注意事项,包括nvue对css的支持限制,如只支持flex布局,不支持媒体查询和百分比布局;加载iconfont需要特殊处理,状态栏高度设置的方法;nvue不支持vue.config.js中的alias配置;不支持定义在Vue.prototype上的全局变量;以及在真机运行时的优化技巧,如避免白屏问题和快速同步代码到设备上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0.uniapp注意事项

  • nvue的css仅支持flex布局,是webview的css语法的子集。这是因为操作系统原生排版不支持非flex之外的web布局。当然flex足以排布出各种页面,只是写法需要适应。
  • class 进行绑定时只支持数组语法。
  • 不支持媒体查询
  • 不能在 style 中引入字体文件
  • 不能使用百分比布局,如width:100%
  • 不支持在css里写背景图background-image,但可以使用image组件和层级来实现类似web中的背景效果。因为原生开发本身也没有web这种背景图概念
  • 使用image标签,支持使用base64,不支持svg格式图片
  • nvue 的各组件在安卓端默认是透明的,如果不设置background-color,可能会导致出现重影的问题
  • 文字内容,必须只能在text组件下,text组件不能换行写内容,否则会出现无法去除的周边空白
  • 只有text标签可以设置字体大小,字体颜色

此外,css不支持层级嵌套的写法

1. 无法加载iconfont问题

nvue页面需要通过weex提供的DOM.addRule来加载字体,官方文档描述已经挺详细了,见dom | uni-app官网

但有一点千万要注意,font-family不能加引号,感觉是uniapp的bug

    <style>
		.my-iconfont {
			font-family: myIconfont; // 不能加引号
			font-size: 60rpx;
			color: #00AAFF;
		}
	</style>

项目中使用的阿里的iconfont,不建议使用cdn的服务,其平台也不承诺期服务的稳定性,使用ttf转成base64,https://www.giftofspeed.com/base64-encoder/

import base64Font from '@/static/iconfont/base64.js'
  beforeCreate() {
    /* #ifdef APP-NVUE */
    domModule.addRule('fontFace', {
      fontFamily: 'ft',
      src: `url('${base64Font}')`,
    })
    /* #endif  */
  },

这里加了条件编译,因为nvue页面也是可以编译成h5的。

2.状态栏高度设置

uniapp提供了状态栏高度的css变量--status-bar-height,vue页面可以正常使用,在nvue中高度获取不准确,建议使用plus.navigator.getStatusbarHeight方法设置style

<view class="status-bar" :style="{ height: barHeight + 'px' }" />
export default {
   data() {
    return {
      barHeight: 0, // 动态高度初始值
    }
   },
   onLoad() {
    this.barHeight = plus.navigator.getStatusbarHeight()
  },
}

3、不支持vue.config.js 中alias配置

在使用nvue之前项目中设了一些alias,如

chainWebpack: (config) => {
    config.resolve.alias
      .set('IMG', resolove('static/image'))
      .set('COMPONENTS', resolove('components'))
}

这样在页面或组件中就可以 import xxx from 'IMG/xyz'的形式,但是这在nvue的编译下不支持,需要全部去除这些别名 

4、不支持定义在Vue.prototype上的全局变量

5、跳转nvue页面会再次触发onLaunch

发现这个问题开始是因为进入nvue页面之后,路由跳转就开始闪屏,测试下来最终发现是从vue页面进入nvue页面时候入口main.js重复执行了,因为路由跳转的方法在main.js中添加了拦截器,这部分也重复注册了。hbuilderx版本为3.6.4,怀疑是uni的bug,main.js不该重复执行才对,临时处理方案为main.js中所有执行都加一层判断,代码层面保证不会重复执行。后续再跟进hx新版本该问题是否存在

6、运行到真机小技巧

在运行到真机时候,经常遇到修改代码后打开真机就白屏了,或是退出到了初始状态,这时候点重新运行后,大概率会加载成自定义基座中的资源,而不是本地资源。开始遇到这种情况只能重新编译,比较消耗时间。可以代码中直接ctrl+s,保存操作也会触发hx的重新差量编译,等看到提示”同步手机端程序文件完成“后在去真机打开,就没有再遇到以上问题了。(也可能是电脑性能落后太多年了导致,其他m1的本子重新编译还是挺快的)

### 如何在 UniApp NVUE 页面中正确加载自定义字体或设置字体样式 要在 UniAppNVUE 页面中正确加载和使用自定义字体,可以遵循以下方式: #### 1. 字体文件的准备与引入 首先需要准备好 `.ttf` 或 `.otf` 格式的字体文件,并将其放置于 `static/fonts` 文件夹下。接着,在全局 CSS 文件(如 `app.vue` 中的 `<style>` 部分)或者组件内的局部样式中声明该字体。 ```css @font-face { font-family: 'CustomFont'; /* 自定义字体名称 */ src: url('/static/fonts/custom-font.ttf') format('truetype'); /* 引入字体路径 */ } ``` 此部分操作完成后,可以通过指定 `font-family` 属性应用该字体[^1]。 --- #### 2. 在 NVUE 页面中引用字体 NVUE 使用的是原生渲染引擎,因此其样式的书写方式不同于 Vue 页面。对于字体图标的使用,需注意以下几点: - **HTML 中的应用** 如果是在 HTML 中直接使用 Unicode 编码表示的字符,则可以直接写入模板中: ```html <text class="custom-icon"></text> ``` - **CSS 中的配置** 定义好对应的类名并通过 `content` 属性绑定具体的图标编码。例如: ```css .custom-icon { font-family: 'iconfont', 'CustomFont'; /* 确保优先级正确 */ font-size: 30px; color: #ff5722; } ``` 上述代码片段展示了如何通过 CSS 来控制字体大小以及颜色等属性[^2]。 --- #### 3. 解决可能遇到的问题 如果发现某些设备上无法正常显示自定义字体,可能是由于以下几个原因造成的: - **HBuilderX 内置浏览器兼容性问题** 当前项目可能存在特定选项影响了字体的表现效果。比如之前提到过的“彩色”功能开启可能导致异常行为。建议检查是否有类似的高级特性被启用并关闭它们。 - **跨平台差异处理** 对于 Android 和 iOS 平台间存在的细微差别也需要给予关注。有时即使服务器端返回的数据完全一致,但由于操作系统底层机制不同仍会造成视觉上的偏差。此时可考虑分别针对两套环境调整参数直至达到预期目标为止[^4]。 --- #### 4. 圆角图片展示技巧补充说明 虽然本题主要讨论关于文字方面的定制化需求,但顺便提一下有关图像圆角裁切的小贴士可能会有所帮助。因为在实际开发过程中经常也会涉及到类似的需求场景——即希望让一张方形照片变成圆形头像形式呈现出来。然而需要注意的是,在 NVUE 架构里并不能简单依靠单一标签完成这项工作,而应该借助额外容器层配合 overflow:hidden 实现目的[^3]。 ```xml <div style="width: 80px; height: 80px; border-radius: 40px; overflow: hidden;"> <image style="width: 80px; height: 80px;" src="example.jpg"></image> </div> ``` 以上便是整个流程概述及相关注意事项总结。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值