第一次接触短视频运用,刚拿到需求的时候,看到页面也很简单,觉得就一个video加底部footer组件的事,其他文案啥的一个盒子定位上去就完事了,哪知真的上手写了之后才知道其中受限制的太多。上个ui稿先
看似简单的一个页面,对于移动端没啥经验的我来说,真的就是一路过关斩将,现在趁着发版后有点时间整理记录一下,说到难点,知道的都知道,首屈一指当属video层级问题,但我这种菜鸟一开始肯定是不知道的哇,就写完后才发现顶部的导航栏,里面的分享组件和返回按钮死活点不了,能看到没法点击,想到层级问题,各种设置z-index,然而啥用也没有,后面查了官网说法,不想打字,截图吧……
好歹人家也算负责,还提供了三种方案,但首先原生plus.nativeObj.view我肯定不会啦,首先被排除,而且确实这个也复杂化了不是最优方案,那就剩cover-view或者cover-image了,好吧试了下确实是可以解决层级问题了,但是我高兴的太早,cover-view内部并不支持嵌套子级,那这就意味这我嵌套不了任何组件啊,那有啥用呢,,现在剩最后一种了,抱着试试看的心态,百度了下subNvue的用法,其实也不复杂就两步
首先创建目录页面,nvue文件。最好放入同级(只是便于管理 其实哪都一样,能找到就行)。
第二步注册:在pages.json文件,当前页面下配置subNVues信息,如图
新建的子窗体,默认页面一打开就是显示的,如果想要先隐藏通过事件去触发,可以在主页面onload周期里面获取实例然后调用。hide()方法,
如果想要在初始化的时候改变子窗体的样式,也可以通过subNVue.setStyle (style)实现
onLoad() {
const subNvue = uni.getSubNVueById('subNvue'); // 这个id是pages.json下绑定的唯一id
// subNvue.hide();//标识初始隐藏
//show方法显示,
// 下面是初始创建位置
// 第一个参数子窗体动画效果
// 第二个参数持续时间
// 第三个参数修改样式函数
subNvue.show('none', 0, () => {
subNvue.setStyle({
top: '90px',
right: '20px',
width: '90px',
height: '114px'
});
});
},
其实到这里层级问题已经算解决了,但subNvue也有限制,subNVue 比cover-view和plus.nativeObj.view更强大,也占用更多内存,为了保证更好的性能体验,一个vue页面不要加载太多 subNVue 子窗体,建议控制在三个以内。
考虑到我视频上面覆盖的组件比较多还凌乱,感觉subNvue用起来还是差点意思,而在这之前一直马不停蹄的找方案,疏于思考,突然沉静下来考虑到subNvue之所以不受层级限制因为他是原生的nvue啊,那如果我整个页面直接用nvue写是不是就可以了呢,这样一气呵成不用那么多个subNvue来打补丁应该会优雅些的吧,有想法那肯定要验证啊,于是把之前的代码都抹掉,直接创建了个video.nvue文件,写简单demo测试了下,真的丝毫没有之前的层级限制啊,瞬间感觉之前这么久白忙活了。。。但转念想想通往成功的道理通常来讲都是迂回曲折的嘛
nvue页面我就不传了,都是业务相关代码没啥借鉴性,写法和vue是一样的,但css语法上有些注意的点,这位前辈总结的就很细致nvue语法与vue的部分区别,
官网也有说明