组件/标签的变化
以前是html标签,现在是小程序标签。
div 改成 view
<template> <view> <view class="uni-padding-wrap uni-common-mt"> <view class="uni-title uni-common-mt"> flex-direction: row <text>\n横向布局</text> </view> <view class="uni-flex uni-row"> <view class="flex-item uni-bg-red">A</view> <view class="flex-item uni-bg-green">B</view> <view class="flex-item uni-bg-blue">C</view> </view> <view class="uni-title uni-common-mt"> flex-direction: column <text>\n纵向布局</text> </view> <view class="uni-flex uni-column"> <view class="flex-item flex-item-V uni-bg-red">A</view> <view class="flex-item flex-item-V uni-bg-green">B</view> <view class="flex-item flex-item-V uni-bg-blue">C</view> </view> </view> </view> </template>
span、font 改成 text()
<view class="text-box" scroll-y="true"> <text>{{text}}</text> </view>
a 改成 navigator
<template> <view> <view class="page-body"> <view class="btn-area"> <navigator url="navigate/navigate?title=navigate" hover-class="navigator-hover"> <button type="default">跳转到新页面</button> </navigator> <navigator url="redirect/redirect?title=redirect" open-type="redirect" hover-class="other-navigator-hover"> <button type="default">在当前页打开</button> </navigator> <navigator url="/pages/tabBar/extUI/extUI" open-type="switchTab" hover-class="other-navigator-hover"> <button type="default">跳转tab页面</button> </navigator> </view> </view> </view> </template>
// navigate.vue页面接受参数 export default { onLoad: function (option) { //option为object类型,会序列化上个页面传递的参数 console.log(option.id); //打印出上个页面传递的参数。 console.log(option.name); //打印出上个页面传递的参数。 } }
img 改成 image
input 还在,但type属性改成了confirmtype
<!-- 错误写法 --> <input :type="isText?'text':'number'" placeholder="请输入内容" /> <!-- 正确写法 --> <input v-if="isText" type="text" placeholder="请输入文本" /> <input v-else type="number" placeholder="请输入数字" />
form、button、checkbox、radio、label、textarea、canvas、video
这些还在。
select 改成 picker
<template> <view> <view class="uni-title uni-common-pl">地区选择器</view> <view class="uni-list"> <view class="uni-list-cell"> <view class="uni-list-cell-left"> 当前选择 </view> <view class="uni-list-cell-db"> <picker @change="bindPickerChange" :value="index" :range="array"> <view class="uni-input">{{array[index]}}</view> </picker> </view> </view> </view> <view class="uni-title uni-common-pl">时间选择器</view> <view class="uni-list"> <view class="uni-list-cell"> <view class="uni-list-cell-left"> 当前选择 </view> <view class="uni-list-cell-db"> <picker mode="time" :value="time" start="09:01" end="21:01" @change="bindTimeChange"> <view class="uni-input">{{time}}</view> </picker> </view> </view> </view> <view class="uni-title uni-common-pl">日期选择器</view> <view class="uni-list"> <view class="uni-list-cell"> <view class="uni-list-cell-left"> 当前选择 </view> <view class="uni-list-cell-db"> <picker mode="date" :value="date" :start="startDate" :end="endDate" @change="bindDateChange"> <view class="uni-input">{{date}}</view> </picker> </view> </view> </view> </view> </template> export default { data() { const currentDate = this.getDate({ format: true }) return { title: 'picker', array: ['中国', '美国', '巴西', '日本'], index: 0, date: currentDate, time: '12:01' } }, computed: { startDate() { return this.getDate('start'); }, endDate() { return this.getDate('end'); } }, methods: { bindPickerChange: function(e) { console.log('picker发送选择改变,携带值为', e.target.value) this.index = e.target.value }, bindDateChange: function(e) { this.date = e.target.value }, bindTimeChange: function(e) { this.time = e.target.value }, getDate(type) { const date = new Date(); let year = date.getFullYear(); let month = date.getMonth() + 1; let day = date.getDate(); if (type === 'start') { year = year - 60; } else if (type === 'end') { year = year + 2; } month = month > 9 ? month : '0' + month; day = day > 9 ? day : '0' + day; return `${year}-${month}-${day}`; } } }
iframe 改成 web-view
ul、li没有了,都用view替代
audio 不再推荐使用,改成api方式,背景音频api文档
其实老的HTML标签也可以在uni-app里使用,uni-app编译器会在编译时把老标签转为新标签,比如把div编译成view。但不推荐这种用法,调试H5端时容易混乱。
除了改动外,新增了一批手机端常用的新组件
scroll-view 可区域滚动视图容器
<template> <view> <view class="uni-padding-wrap uni-common-mt"> <view class="uni-title uni-common-mt"> Vertical Scroll <text>\n纵向滚动</text> </view> <view> <scroll-view :scroll-top="scrollTop" scroll-y="true" class="scroll-Y" @scrolltoupper="upper" @scrolltolower="lower" @scroll="scroll"> <view id="demo1" class="scroll-view-item uni-bg-red">A</view> <view id="demo2" class="scroll-view-item uni-bg-green">B</view> <view id="demo3" class="scroll-view-item uni-bg-blue">C</view> </scroll-view> </view> <view @tap="goTop" class="uni-link uni-center uni-common-mt"> 点击这里返回顶部 </view> <view class="uni-title uni-common-mt"> Horizontal Scroll <text>\n横向滚动</text> </view> <view> <scroll-view class="scroll-view_H" scroll-x="true" @scroll="scroll" scroll-left="120"> <view id="demo1" class="scroll-view-item_H uni-bg-red">A</view> <view id="demo2" class="scroll-view-item_H uni-bg-green">B</view> <view id="demo3" class="scroll-view-item_H uni-bg-blue">C</view> </scroll-view> </view> </view> </view> </template>
swiper 可滑动区域视图容器
icon 图标
<view class="item" v-for="(value,index) in iconType" :key="index"> <icon :type="value" size="26"/> <text>{{value}}</text> </view> export default { data() { return { iconType: ['success'] } }, onLoad() { // #ifdef APP-PLUS|| MP-WEIXIN this.iconType = ['success', 'success_no_circle', 'info', 'warn', 'waiting', 'cancel', 'download', 'search','clear'] // #endif // #ifdef MP-ALIPAY this.iconType = ['info', 'warn', 'waiting', 'cancel', 'download', 'search', 'clear', 'success', 'success_no_circle', 'loading'] // #endif // #ifdef MP-BAIDU this.iconType = ['success', 'info', 'warn', 'waiting', 'success_no_circle', 'clear', 'search', 'personal', 'setting', 'top', 'close', 'cancel', 'download', 'checkboxSelected', 'radioSelected', 'radioUnselect'] // #endif } }
rich-text 富文本解析(不可执行js,但可渲染各种文字格式和图片,v-html在支付宝中不能展示)
progress 进度条
<!-- 本示例未包含完整css,获取外链css请参考上文,在hello uni-app项目中查看 --> <template> <view> <view class="uni-padding-wrap uni-common-mt"> <view class="progress-box"> <progress percent="20" show-info stroke-width="3" /> </view> <view class="progress-box"> <progress percent="40" active stroke-width="3" /> </view> <view class="progress-box"> <progress percent="60" active stroke-width="3" backgroundColor="#999"/> </view> <view class="progress-box"> <progress percent="80" activeColor="red" active stroke-width="8" /> </view> </view> </view> </template>
slider 滑块指示器
<!-- 本示例未包含完整css,获取外链css请参考上文,在hello uni-app项目中查看 --> <template> <view> <view class="uni-padding-wrap uni-common-mt"> <view class="progress-box"> <progress percent="20" show-info stroke-width="3" /> </view> <view class="progress-box"> <progress percent="40" active stroke-width="3" /> </view> <view class="progress-box"> <progress percent="60" active stroke-width="3" backgroundColor="#999"/> </view> <view class="progress-box"> <progress percent="80" activeColor="red" active stroke-width="8" /> </view> </view> </view> </template>
switch 开关选择器
<template> <view> <view class="uni-padding-wrap uni-common-mt"> <view class="uni-title">默认样式</view> <view> <switch checked @change="switch1Change" /> <switch @change="switch2Change" /> </view> <view class="uni-title">推荐展示样式</view> </view> <view class="uni-list"> <view class="uni-list-cell uni-list-cell-pd"> <view class="uni-list-cell-db">开启中</view> <switch checked /> </view> <view class="uni-list-cell uni-list-cell-pd"> <view class="uni-list-cell-db">关闭</view> <switch /> </view> </view> </view> </template> export default { data() { return {} }, methods: { switch1Change: function (e) { console.log('switch1 发生 change 事件,携带值为', e.detail.value) }, switch2Change: function (e) { console.log('switch2 发生 change 事件,携带值为', e.detail.value) } } }
camera 相机
live-player 直播
map 地图
cover-view 可覆盖原生组件的视图容器
cover-view需要多强调几句,uni-app的非h5端的video、map、canvas、textarea是原生组件,层级高于其他组件。如需覆盖原生组件,比如在map上加个遮罩,则需要使用cover-view组件
原生组件包括:
map
video
camera(仅微信小程序、百度小程序支持)
canvas(仅在微信小程序、百度小程序表现为原生组件)
input(仅在微信小程序、支付宝小程序、字节跳动小程序、飞书小程序、QQ小程序中且input置焦时表现为原生组件,其中支付宝小程序的input仅为text且置焦时才表现为原生组件)
textarea(仅在微信小程序、百度小程序、字节跳动小程序、飞书小程序表现为原生组件)
live-player(仅微信小程序、百度小程序支持,App端直接使用video组件可同时实现拉流)
live-pusher(仅微信小程序、百度小程序、app-nvue支持,app-vue使用plus.video.LivePusher可实现推流)
cover-view
cover-image
ad (仅app、微信小程序、百度小程序、字节跳动小程序、QQ小程序支持)
除了内置组件,还有很多开源的扩展组件,把常用操作都进行封装,DCloud建立了插件市场收录这些扩展组件,详见插件市场
uniapp自带路由和请求方式
uni.navigateTo 路由与页面跳转 (跳转有页面栈的问题,需自定义导航配合清空内存)
1.为何不使用原生导航
2.路由跳转过程与场景介绍
uni.request 网络请求
开发工具的使用
开发工具推荐使用uniapp自家编辑器HBuilderX(其他编辑器需配置环境变量),开发微信小程序还需要下载微信开发者工具。
1.编辑器编译H5与小程序
2.打包发布简介
3.小程序配置AppId的两种方法及获取方式
4.AppId的作用
5.微信小程序开发时对微信开发者工具域名校验开发与线上配置
6.微信小程序 开发版、体验版、正式版的区别
踩坑记录:
代码要按规范写,否则会造成代码早期编译是生效的,后来编译不生效的后果。
1.vueX赋值
this.$store.state.flex = 0;
正确写法
this.$store.commit("flexFun", index);
以上代码虽然目前生效,但不保证以后编译还能生效。
2.vueX以失效用法
Html中直接使用$store.state.flex ,这种形式去显示或做三元运算,早期是可以的,但现在不可以。
哪怕是在函数中使用变量接收也不行。如 this.flex = this.$store.state.flex ; 然后通过flex变量回显至页面中或操作三元运算在现在的版本是不可取的。
正确写法
在小程序中需要通过计算属性去读取vueX
computed: {
indexPage() {
return this.$store.state.flex;
}
},
3.Css组件样式
组件对应 wxss 文件的样式,只对组件wxml内的节点生效。编写组件样式时,需要注意以下几点:
•组件和引用组件的页面不能使用id选择器(#a)、属性选择器([a])和标签名选择器,请改用class选择器。
•组件和引用组件的页面中使用后代选择器(.a .b)在一些极端情况下会有非预期的表现,如遇,请避免使用。
•子元素选择器(.a>.b)只能用于 view 组件与其子节点之间,用于其他组件可能导致非预期的情况。
•继承样式,如 font 、 color ,会从组件外继承到组件内。
•除继承样式外, app.wxss 中的样式、组件所在页面的的样式对自定义组件无效(除非更改组件样式隔离选项)。
#a { } /* 在组件中不能使用 */
[a] { } /* 在组件中不能使用 */
button { } /* 在组件中不能使用 */
.a > .b { } /* 除非 .a 是 view 组件节点,否则不一定会生效 */
除此以外,组件可以指定它所在节点的默认样式,使用 :host 选择器(需要包含基础库 1.7.2 或更高版本的开发者工具支持)。
Uniapp会根据各小程序与自身适配做调整,在不断完善的过程中会慢慢排除掉对不规范代码的编译。
老项目有问题的编译方法:
可以在微信开发者工具中切换编译版本,但太老的版本新版编辑器是没有的,需要去官网下载历史版本的微信开发者工具。
但编译版本与微信版本息息相关,也就是说由于自身代码不规范影响新版编译的,即使通过老版本编译出来也不支持最新版微信,所以此类问题要及时修改。要用最新版的微信开发者工具以及最新版本编译。
关于路由
微信小程序路由深度(栈),现为10层(曾经为5层),也就是说在真机操作一直点进入下一个页面,到第十一个页面时就没反应了。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!