uni-app 开发应用程序 
1. uni-app 介绍 
使用 Vue.js 开发所有前端应用的框架,编写一套代码,可发布到 Android、iOS、Web 和各种小程序端。
为什么使用?
- 开发者、案例众多
- 平台能力不受限
- 性能好
- 周边丰富
- 学习和开发成本低。
Vue 语法 + 微信小程序 API:
- 使用 Vue 语法
- App 和小程序只支持部分 Vue 语法
- 标签组件靠近小程序规范
- 接口能力靠近小程序规范
- 完整的小程序生命周期
uniCloud 是为开发者提供的基于 serverless 模式和 JS 编程的云开发平台。
2. 项目展示 
商城项目 H5 版展示
底部栏:| 首页 | 商品 | 购物车 | 我的 |
3. 微信小程序概述 
微信公众平台 —— 小程序账号注册 —— 快速开发、审核发布。
下载 微信开发者工具,可以开发微信项目。
微信小程序开发结构
- pages/存放页面- index/主页面- index.js生命周期控制
- index.json配置文件
- index.wxml组件和代码
- index.wxss页面样式文件
 
- log/日志
 
- utils/自定义的工具
- App.js入口文件
- app.json配置文件
- app.wxss微信样式文件
- project.config.json项目配置文件
- sitemap.json页面收录规则
编辑 index.wxml 文件,保存既可以看到结果
<viem>Hello</viem>
<text>Demo</text>
<button type="primary" size="mini">按钮</button><viem> 类似于 <div>,<text> 类似于 <span>。
3. 微信小程序的生命周期 
app.js 文件包含了生命周期的回调函数:
App({
    // 完成初始化,全局只触发一次
    onLaunch: function() { },
    // 启动,或从后台进入前台
    onShow: function() { },
    // 进入后台
    onHide: function() { },
    // 脚本错误,API 失败
    onError: function() { }
})index.js 是页面的生命周期脚本。
Page({
    data: {
        name: 'Tom'
    },
    onLoad: function(options) { },
    onReady: function() { },
    onShow: function() { },
    onHide: function() { },
    onUnload: function() { },
    onPullDownRefresh: function() { },
    onReadyBottom: function() { },
    onShareAppMessage: function() { }
})渲染顺序:
- App: onLaunch
- App: onShow
- Page: onLoad
- Page: onShow
- Page: onReady
如何创建页面:在 app.json 中加入
{
    "pages": [
        "pages/index/index",
        // 在此加入新的内容
        "pages/center/index"
    ],
    "style": "v2",
    "sitemapLocation": "sitemap.json"
}添加跳转标签
<navigator url="/pages/center/index">个人中心</navigator>5. 微信小程序模板语法 
内容
- 数据绑定
- 条件判断
- 列表渲染
在 index.json 中的数据可以直接在模板中使用双大括号绑定。
<view>
    {{ person.name }}
</view>使用服务器发送的数据来更新
Page({
    onLoad: function() {
        this.setData({
            name: 'New Name',
            person: 'Lili'
        })
    }
})条件语句
<view wx:if="{{flag}}">flag 为真时渲染</view>
<view wx:else>否则渲染</view>循环语句
<view wx:for="{{list}}">
    {{index}}. {{ item.name }} : {{ item.age }}
</view>列表渲染的 index 会从 0 开始。
6. 微信小程序 API 
setTimeout(() => {
    wx.redirctTo({
        url: '/pages/center/index'
    })
}, 2000)
setTimeout(() => {
    wx.showToast({
        title: '数据更新成功!'
    })
}, 2000)请参考 https://developers.weixin.qq.com/miniprogram/dev/api
7. uni-app 核心知识 
规范
- 页面规范遵循 Vue 单文件组件规范
- 组件标签靠近小程序规范
- 接口能力靠近微信小程序规范
- 数据绑定及事件处理使用 Vue.js 规范
支持条件编译
#ifdef APP-PLUS
    // APP 下代码
#endif
#ifdef H5
    // H5 下代码
#endif
#ifdef H5 || MP-WEIXIN
    // H5 下或微信小程序下代码
#endifAPP 端的 NVue 开发:APP 端内置了一个基于 weex 改进的原生渲染引擎,提供了原生渲染能力。如果使用 Vue 页面,则使用 webview 渲染,如果使用 nvue 页面,则使用原生渲染。
HTML5+:uni-app APP 端内置 HTML5+ 引擎。
8. uni-app 开发环境 
使用 HBuilderX 构建,只需要新建项目即可。
使用 vue-cli
npm i vue-cli -g
vue create -p dcloudio/uni-preset-vue projname
npm run dev # 或者 yarn serve9. 目录结构 
需要学习的内容
- 组件
- API
- 路由
- 生命周期
- 语法
- 布局
目录如下
- .hbuilderx自动生成的 IDE 配置文件
- common公用文件,自定义
- components公用组件,自定义
- storevuex 目录
- pages页面存放目录
- static静态资源
- App.vue应用入口文件
- main.js应用入口文件,注册 Vue
- manifest.json配置项目
- pages.json页面配置
- uni.scss公用样式表
10. uni-app 模板语法 
与 Vue 的模板语法类似。
- v-bind/- :
- v-on/- @
- v-model
- v-if/- v-else-if/- v-else
- v-show
11. uni-app 数据绑定 
使用 : 绑定变量
<view :class="msg" :data="true ? 'Yes' : 'No'">
    {{ msg }}
</view>使用 v-model 双向绑定数据。
12. uni-app 条件判断 
v-if / v-show 的使用,语法与 Vue 一致。
13. uni-app 列表渲染 
v-for 的使用,同 Vue:
<view v-for="(item,index) in arr">
    {{ index + 1 }}. {{ item }}
</view>14. uni-app 事件绑定 
使用 @ 绑定事件
<template>
    <view @click="show">
        {{ item }}
    </view>
</template>
<script>
export default {
    methods: {
        show() {
            console.log('显示内容')
        }
    }
}
</script>使用 @click.stop 可以阻止事件冒泡。事件发生时优先触发子级的事件。
15. uni-app 基础组件 
参考官方文档 https://uniapp.dcloud.net.cn/component/
- 视图容器
- 基础内容
- 表单组件
- 路由与页面跳转
- 媒体组件
- 地图
- 画布
- webview
- 广告
- 页面属性配置节点
- 小程序开放能力组件
- App nvue专用组件
- uniCloud专用组件
- 扩展组件(uni ui)
学习 <text>、<stroll-view> 等常用组件以便在以后的开发中使用。
<scroll-view class="scroll" :scroll-y="true" @scroll="scroll">
    <view v-for="i in 100"> {{ i }} </view>
</scroll-view>
<script>
    export default {
        data() {
        },
        methods: {
            scroll(event) {
                console.log(event)
            }
        }
    }
</script>
<style>
    .scroll {
        height: 400rpx;
    }
</style><style> 可以指定 lang 属性为一种模板语言,如 less / scss / stylus 。
注意,rpx 是 uni-app 内置的单位,可以根据平台自动调整其真实大小。
16. uni-app 自定义组件 
自定义组件遵循组件规范,放置在 /components/* 下,*.vue 的名称和组件的名称同名,并且和文件夹同名。
下面可以快速创建自定义组件:
- 右键
- 新建组件 
- 输入名称
我们新建一个名为 <card> 的组件。模板也可以选择 less / scss / stylus / ts 中的一类。
<template>
    <view :style="{background: color}" @click="handleClick">
        Hello
    </view>
</template>
<script>
    export default {
        name: 'card',
        props: {
            color: {
                type: String,
                default: 'white'
            }
        },
        data() {
            return {
            }
        },
        methods: {
            handleClick() {
                console.log('Card 点击事件')
            }
        }
    }
</script>在 /pages/news/news.vue 下面引用
<card></card>自定义事件 
/pages/news/news.vue 代码
<template>
    <card @myClick="myClick"></card>
</template>
<script>
    export default {
        methods: {
            myClick() {
                console.log('myClick')
            }
        }
    }
</script>子组件可以通过 this.$emit('myClick') 触发父组件的事件,同时可以传递数据,例如
this.$emit('myClick', data1, data2)总结
- 父组件向子组件传递数据使用 props
- 子组件向父组件传递数据使用自定义事件
父组件在子组件插入内容,使用占位符 <slot></slot>。
遵循 easycom 规范,可以无需注册,自动导入组件,同样地还有 uni_module、datacom 组件规范和实现。
17. uni-app 常用 API 
uni-app 的 API 以 uni 开头。
onLoad(){
    uni.showToast({
        icon: "loading",
        title: "加载中……"
    })
}交互使用的常用 API 有
- showToast
- hideToast
- showLoading
- hideLoading
- showModal
- showActionSheet
18. uni-app 条件编译 
条件编译放在注释中,如 JS 中条件编译如下
// #ifdef H5
console.log('H5 下打印这句话')
// #endif在 Vue 文件中条件编译如下
<!-- #if -->
<template>
    <slot></slot>
</template>
<!-- #endif -->以下语言支持条件编译
- .vue
- .js
- .css
- pages.json
- .scss
- .less
- .stylus
- .ts
- .pug
19. uni-app 页面布局 
首先,熟悉内置组件,再准备编写页面。
<template>
    <view>
        <view>新闻列表</view>
        <card color="red" size="18px">红色</card>
    </view>
</template>
<script>
    export default {
        data(){
            return {
            }
        }
    }
</script>
<style lang="scss" scoped>
    @import '../news.css';
    .bg-color {
        background: #007aff;
        .text {
            font-color: red;
        }
    }
</style>推荐使用 flex 布局,少使用绝对定位。
20. uni-app 生命周期 
生命周期分为几个方面
- 应用的生命周期
- 页面的生命周期
- 组件的生命周期
应用的生命周期保存在 App.vue 中
export default {
    // 应用初始化完成时执行,全局只执行一次
    onLaunch() { },
    // 应用显示的时候,或者从后台进入前台
    onShow() { },
    // 应用隐藏的时候执行,或从前台进入后台
    onHide() { }
}请使用微信开发者工具,如果已经安装,HBuilderX 会自动打开测试。
第一次时候微信开发者工具需要进行设置,必须先有测试号才可以测试。
页面的生命周期 
export default {
    data() {
        return {
        }
    },
    onLoad() { },
    onReady() { },
    onShow() { },
    onHide() { },
    onUnload() { },
    methods: {
    }
}可以设置当前页面为启动页面,可以用于开发。
跳转页面,测试页面卸载事件
setTimeout(() => {
    uni.redirectTo({
        url: './pages/about/about'
    })
}, 2000)组件的生命周期 
export default {
    name: "life",
    data() {
        return {
        }
    },
    // 在实例初始化之后,数据观测和事件配置之前
    beforeCreate() { },
    // 数据观测,属性和方法的运算,事件和观测器回调,尚未挂载
    created() { },
    // 挂载完成,vm.$el 也在文档内
    mounted() { },
    // Vue 实例销毁,监听器移除,变量解绑,子实例销毁
    destoryed() { },
}21. 底部 tabbar 配置 
pages.json 中可以配置 tabBar
{
    "tabBar": {
        "color": "#7A7E83",
        "selectedColor": "#3cc51f",
        "borderStyle": "black",
        "backgroundColor": "#ffffff",
        "height": "50px",
        "fontSize": "10px",
        "iconWidth": "24px",
        "spacing": "3px",
        "list": [{
            "pagePath": "pages/component/index",
            "iconPath": "static/image/icon_component.png",
            "selectedIconPath": "static/image/icon_component_HL.png",
            "text": "组件"
        }, {
            "pagePath": "pages/API/index",
            "iconPath": "static/image/icon_API.png",
            "selectedIconPath": "static/image/icon_API_HL.png",
            "text": "接口"
        }],
        "midButton": {
            "width": "80px",
            "height": "50px",
            "text": "文字",
            "iconPath": "static/image/midButton_iconPath.png",
            "iconWidth": "24px",
            "backgroundImage": "static/image/midButton_backgroundImage.png"
        }
    },
}