一、项目结构介绍
pages.json:配置页面路由、导航条、选项卡等页面类信息,详见。
manifest.json:配置应用名称、appid、logo、版本等打包信息,详见。
App.vue:应用配置,用来配置App全局样式以及监听应用的生命周期。
main.js:Vue初始化入口文件
static目录:存放应用引用静态资源(如图片、视频等)的地方,注意:静态资源只能存放于此
pages目录:业务页面文件存放目录
components目录:组件文件存放目录
Vue.prototype.$store知识点:
https://blog.csdn.net/qq_32407233/article/details/83819831
数据缓存uni.getStorageSync知识点:
http://www.hcoder.net/tutorials/info_1353.html
Vue.config.productionTip = false
以开发环境运行
二、css3相关
https://www.jianshu.com/p/fe36aa3e5fc6
vw: 视口宽度的百分比(1vw 等于视口宽度的 1%)
vh: 视口高度的百分比(1vh 等于视口高度的 1%)
% 是相对于父元素的大小设定的比率,vw vh 是视口大小决定的
vmin: 选取 vw 和 vh 中最小的那个
vmax: 选取 vw 和 vh 中最大的那个
vw、vh 是基于视口的,而不是父元素。1vw 等于1/100 的视口宽度,1vh 等于1/100 的视口高度,比如:
浏览器高度 950px,宽度为 1920px, 1vh = 950px/100 = 9.5 px,1vw = 1920px/100 =19.2 px
vw、vh 能直接获取高度,而 % 如果没有设置body的高度情况下,是无法获取可视区域的高度。
vmin、vmax 用处解决横屏竖屏字体不一样的问题
单位方面,px无法动态适应不同宽度的屏幕,rem只能用于h5、rpx只能用于微信小程序。为此uni-app新增了 upx ,通吃所有端、所有屏幕宽度的动态单位 upx文档,微信小程序中认为页面宽度为750rpx,在不同的设备上1rpx对应的像素值是不同的,如果设备宽度为750px那么1rpx=1px,如果设备宽度为1500px那么1rpx=2px,upx类似于rpx使用更宽泛。
html > body table + ul {margin-top:20px;}
这个选择器解释为:选择紧接在 table 元素后出现的所有兄弟 ul 元素,该 table 元素包含在一个 body 元素中,body 元素本身是 html 元素的子元素。
a:link {color: #FF0000} /* 未访问的链接 */
a:visited {color: #00FF00} /* 已访问的链接 */
a:hover {color: #FF00FF} /* 鼠标移动到链接上 */
a:active {color: #0000FF} /* 选定的链接 */
box-sizing布局
css3增添了盒模型box-sizing,有三个属性值
content-box:默认值,让元素维持w3c的标准盒模型。元素的width/height等于border的宽度加上padding值加上元素内容的width/height,(默认内容区大小不会变)
即Element Width/Height = boder + padding + content width/height;
border-box:让元素维持IE6及以下版本盒模型,元素的width/height等于元素内容的width/height,
即:Element Width/Height = width/height-border-padding。
inherit:继承父元素的盒模型模式。
其中最重要的就是border-box,如果遇到不影响其他区域布局,还要给元素加padding、border的情况,使用border-box元素所占空间不会变,加padding、border会往内挤,保持外面容器不被破坏。(注意:margin不包含在元素空间,加了margin会向外撑开)。
兼容性:IE8+及其他主流浏览器均支持box-sizing。其中IE6及以下默认是以类似border-box盒模型来计算尺寸。
(ps:Firefox浏览器,box-sizing还可以设置一个padding-box,指定元素的宽度/高度等于内容的宽度/高度和內距,
即:Element Width/Height = content width/height+padding。)
三、输入框input
v-model仅仅是语法糖
<input type="text" v-model="something">
相当于
<input
type="text"
v-bind:value="something"
v-on:input="something = $event.target.value">
四、状态栏$导航栏
可以隐藏掉uni-app的原生导航栏使用colorui提供的cu-custom自定义导航栏。
1、下载插件
https://ext.dcloud.net.cn/plugin?id=239下载colorui并倒入你的项目根目录
2、App.vue
引入关键Css main
css icon.css
<style>
@import "colorui/main.css";
@import "colorui/icon.css";
....
</style>
3、使用自定义导航栏
main.js
引入 cu-custom
组件
import cuCustom from './colorui/components/cu-custom.vue'
Vue.component('cu-custom',cuCustom)
4、App.vue
获得系统信息
onLaunch: function() {
uni.getSystemInfo({
success: function(e) {
// #ifndef MP
Vue.prototype.StatusBar = e.statusBarHeight;
if (e.platform == 'android') {
Vue.prototype.CustomBar = e.statusBarHeight + 50;
} else {
Vue.prototype.CustomBar = e.statusBarHeight + 45;
};
// #endif
// #ifdef MP
Vue.prototype.StatusBar = e.statusBarHeight;
let custom = wx.getMenuButtonBoundingClientRect();
Vue.prototype.Custom = custom;
Vue.prototype.CustomBar = custom.bottom + custom.top - e.statusBarHeight;
// #endif
}
})
},
5、pages.json
配置取消系统导航栏
"globalStyle": {
"navigationStyle": "custom"
},
6、page.vue
页面可以直接调用了
<cu-custom bgColor="bg-gradual-blue" :isBack="true">
<block slot="backText">返回</block>
<block slot="content">导航栏</block>
</cu-custom>
带分割线的导航栏
<cu-custom bgColor="bg-white solid-bottom" :isBack="false">
<block slot="backText"></block>
<block slot="content">消息</block>
</cu-custom>
7、修改状态栏文字颜色
pages.json
文件中对应页面的style设置navigationBarTextStyle
为white
或者black
{
"path" : "pages/mine/minePages/personInfo/personInfo",
"style" : {
"navigationBarTitleText": "个人信息",
"navigationBarTextStyle": "white"
}
}
参数说明
参数 | 作用 | 类型 | 默认值 |
---|---|---|---|
bgColor | 背景颜色类名 | String | '' |
isBack | 是否开启返回 | Boolean | false |
bgImage | 背景图片路径 | String | '' |
slot块 | 作用 |
---|---|
backText | 返回时的文字 |
content | 中间区域 |
right | 右侧区域(小程序端可使用范围很窄!) |
参考地址
https://www.jianshu.com/p/c32e09109eb6
https://uniapp.dcloud.io/collocation/pages
五、数据持久化
- uni.setStorage
将数据存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个异步接口。
uni.setStorage({
key: 'storage_key',
data: 'hello',
success: function () {
console.log('success');
}
});
- uni.setStorageSync
将 data 存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个同步接口。
try {
uni.setStorageSync('storage_key', 'hello');
} catch (e) {
// error
}
- uni.getStorage
从本地缓存中异步获取指定 key 对应的内容。
uni.getStorage({
key: 'storage_key',
success: function (res) {
console.log(res.data);
}
});
- uni.getStorageSync
从本地缓存中同步获取指定 key 对应的内容。
try {
const value = uni.getStorageSync('storage_key');
if (value) {
console.log(value);
}
} catch (e) {
// error
}
- uni.getStorageInfo
异步获取当前 storage 的相关信息。
uni.getStorageInfo({
success: function (res) {
console.log(res.keys);
console.log(res.currentSize);
console.log(res.limitSize);
}
});
- uni.getStorageInfoSync
try {
const res = uni.getStorageInfoSync();
console.log(res.keys);
console.log(res.currentSize);
console.log(res.limitSize);
} catch (e) {
// error
}
- uni.removeStorage
从本地缓存中异步移除指定 key。
uni.removeStorage({
key: 'storage_key',
success: function (res) {
console.log('success');
}
});
- uni.removeStorageSync
从本地缓存中同步移除指定 key。
try {
uni.removeStorageSync('storage_key');
} catch (e) {
// error
}
- uni.clearStorage
清理本地数据缓存。
uni.clearStorage();
- uni.clearStorageSync
同步清理本地数据缓存。
try {
uni.clearStorageSync();
} catch (e) {
// error
}
uni-app的Storage在不同端的实现不同:
- H5端为localStorage,浏览器限制5M大小,是缓存概念,可能会被清理
- App端为原生的plus.storage,无大小限制,不是缓存,持久化
- 各个小程序端为其自带的storage api,数据存储生命周期跟小程序本身一致,即除用户主动删除或超过一定时间被自动清理,否则数据都一直可用。
- 微信小程序单个 key 允许存储的最大数据长度为 1MB,所有数据存储上限为 10MB。
- 支付宝小程序单条数据转换成字符串后,字符串长度最大200*1024。同一个支付宝用户,同一个小程序缓存总上限为10MB。
- 百度、头条小程序文档未说明大小限制
除此之外,H5端还支持websql、indexedDB、sessionStorage;App端还支持SQLite、IO文件等本地存储方案。
六、获取当前时间
var date = new Date()
console.log('当前年'+date.getFullYear())
console.log('当前月'+(date.getMonth()+1).toString())
console.log('当前日'+date.getDate().toString())
console.log('当前时'+date.getHours().toString())
console.log('当前分'+date.getMinutes().toString())
console.log('当前秒'+date.getSeconds().toString())
/**
* 获取当前时间
* 格式YYYY-MM-DD
*/
Vue.prototype.getNowFormatDate = function() {
var date = new Date();
var seperator1 = "-";
var year = date.getFullYear();
var month = date.getMonth() + 1;
var strDate = date.getDate();
if (month >= 1 && month <= 9) {
month = "0" + month;
}
if (strDate >= 0 && strDate <= 9) {
strDate = "0" + strDate;
}
var currentdate = year + seperator1 + month + seperator1 + strDate;
return currentdate;
};
七、字符串操作
- splite(' ')可以将字符串按某个字符或者其他分割。返回数组。
- reverse()该方法会改变原来的数组,而不会创建新的数组。此函数可以将数组倒序排列。
- join()方法用于把数组中的所有元素放入一个字符串。元素是通过指定的分隔符进行分隔的。指定分隔方法join(' ');
例如
var message = 'abc'
console.log('操作之前的结果为'+message)
var a = message.split('').reverse().join('')
console.log('操作之后的结果为'+a)
此操作不会改变原来的字符串,会生成一个新的字符串
八、计算属性(computed)和方法(methods)的区别
我们可以将同一函数定义为一个方法而不是一个计算属性。两种方式的最终结果确实是完全相同的。然而,不同的是计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。
computed: {
// 计算属性的 getter
reversedMessage: function () {
// `this` 指向 vm 实例
return this.message.split('').reverse().join('')
}
}
但是以下用法不会出发更新,每次获取都是第一次的时间,需要放到methods中
computed: {
now: function () {
return Date.now()
}
}
九、一个页面的框架
<template>
<view class="content">
<cu-custom bgColor="bg-white solid-bottom" style="align-self: flex-start;">
<block slot="backText"></block>
<block slot="content">首页</block>
</cu-custom>
<view class="c"></view>
</view>
</template>
<script>
export default {
data() {
return {
}
},
computed:{
},
methods: {
}
}
</script>
<style lang="less">
.content {
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: center;
height: 100vh;
width: 100vw;
background-color: #FFFFFF;
.c{
width: 750upx;
background-color: #007AFF;
flex-grow: 1;
}
}
</style>
默认导航栏有可能不是居中的,所以需要给cu-custom设置style
<cu-custom bgColor="bg-white solid-bottom" style="align-self: flex-start;">
<block slot="backText"></block>
<block slot="content">首页</block>
</cu-custom>