uniapp介绍
- 最新一代Hybrid开发其中的热门框架, 由Dcloud公司研发, 目前国内混合开发top3的框架
- 节点驱动时代 - DOM操作,直接获取DOM并操作
- 数据驱动时代 - 数据驱动,把要变化的值抽到状态管理,修改数据自动更新视图
- 混合开发时代 - Hybrid,1套代码编译为移动端多端(H5APP,各类小程序,APP)
- vue的语法 + 小程序的标签, 书写移动端全平台应用
uniapp项目创建
- 下载HbuilderX IDE
- 新建 - 项目 - uniapp
- 运行 - 根据当前开发需求,运行浏览器|微信小程序|手机|模拟器
介绍项目目录和文件作用
- pages.json 文件用来对 uni-app 进行全局配置,决定页面文件的路径、窗口样式、原生的导航栏、底部的原生tabbar 等
- manifest.json 文件是应用的配置文件,用于指定应用的名称、图标、权限等。
- App.vue是我们的跟组件,所有页面都是在App.vue下进行切换的,是页面入口文件,可以调用应用的生命周期函数。
- main.js是我们的项目入口文件,主要作用是初始化vue实例并使用需要的插件。
- uni.scss文件的用途是为了方便整体控制应用的风格。比如按钮颜色、边框风格,uni.scss文件里预置了一批scss变量预置。
- unpackage就是打包目录,在这里有各个平台的打包文件
- pages所有的页面存放目录
- static静态资源目录,例如图片等
- components组件存放目录
uniapp的数据驱动
-
uniapp是基于VUE(MVVM)进行二次封装的全新框架, 它俩的数据驱动保持一致
- 把要变化的数据抽取到data中
- 使用{{ }}(模版表达式), this.xxx可以访问到此动态数据
- 直接修改this.xxx, 改变数据并自动通知视图更新(因为有MVVM的原因)
-
MVVM: 是一种架构模式, 把一个应用拆分为Model(数据模型),View(视图层), ViewModel(视图模型层)
uniapp的标签
-
uniapp为了适配各类小程序(因为小程序的标签有一些特殊能力,HTML标签没有),所以采用的标签都是小程序的原始标签
- view、swiper、swiper-item、navigator、button、icon、text ……
uniapp的生命周期
-
pages页面生命周期
- onInit: 初始化加载(比onLoad更早) 百度小程序专享生命周期,其他没有
- onLoad: 初始化加载
- onShow: 页面显示
- onReady: DOM加载完毕
- onHide: 页面隐藏
- onUnload: 页面卸载(删除DOM)
- onPullDownRefresh: 拉头
- onReachBottom: 下拉到底部
- onShareAppMessage: 点击分享
-
components组件生命周期
- beforeCreate: 数据创建前
- created: 数据拦截完毕
- beforeMount: 视图挂载前
- mounted: 初次挂载完毕
- beforeUpdate: 数据变化,即将开始更新视图
- updated: 视图更新完毕(用户可以看到新的视图)
- beforeDestory: 销毁前
- destoryed: 销毁完毕
uniapp工程化
-
路由配置(pages.json 文件里)
"tabBar": { ...其他配置 "list":[ {"text": "按钮文字", "pagePath": "点击切换的页面路径", "iconPath": "默认图标", "selectedIconPath": "选中图标"} ] } //tabbar: 只能有2-5个按钮图标 //uniapp的静态资源只能放在static文件夹下 //图标只支持本地图片,<=40kb,不支持网络图片及字体图标 -
API封装
1. 配置服务器IP export const baseURL = 'xxxx' 2. 请求+拦截器配置 export const req = (...参数) => { //--------请求拦截器的代码----------// return new Promise((resolve, reject) => { uni.request({ ....参数, success(res){ //--------响应拦截器的代码----------// resolve(res) }, //成功 fail(err){ reject(err) } //失败 }) }) } 3. 业务逻辑封装 根据自己不同的业务,新建 业务.js import { req } from './request' export const $_函数名1 = (...参数) => req(...参数) export const $_函数名2 = (...参数) => req(...参数)
uniapp在小程序中获取用户所在城市
-
1.获取经纬度
-
uni.getLocation() //获取经纬度
-
配置manifest.json
1. 配置微信小程序AppID 2. 勾选位置接口,填写描述(准备授权) 3. 2022.7.14日后,小程序还要求配置requiredPrivateInfos才能定位 打开最下面源码视图 "permission" : { ... }, "requiredPrivateInfos": [ //新增此配置 "getLocation" ] //如果配置后仍然定位失败,降低小程序IDE调试内库为稳定版,2.25.0等...
-
-
2.把经纬度转换城市数据(使用第三方API)
1. 找到高德免费API,转换坐标 https://lbs.amap.com/api/webservice/summary/ 2. 注册账号,申请对应的key,注意key的范围不要选错了(这里用的是web服务 key) 3. 找到接口,发送请求,携带对应参数 例:获取天气 https://restapi.amap.com/v3/weather/weatherInfo {key:您的key,city:xxxx}
小程序懒加载
-
先渲染第一页数据(最优先)
-
确认懒加载的时机(用户在什么时候加载下一页数据)
-
在懒加载的触发时机中,加载并渲染下一页数据
- onReachBottom(){ 请求下一页数据判断 }
页面跳转方式
- uni.navigateTo:保留当前页面,跳转到应用内的某个页面。
- uni.redirectTo:关闭当前页面,跳转到应用内的某个页面。
- uni.reLaunch:关闭所有页面,打开到应用内的某个页面。
- uni.switchTab:跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。
- uni.navigateBack:关闭当前页面,返回上一页面或多级页面。
获取地理位置
-
uni.getLocation:使用之前要现在 manifest.json 文件里面配置一下,然后直接使用就行了
// manifest.json文件中: // 找到源码视图 // 找到mp-weixin "mp-weixin":{ // 配置获取经纬度 "requiredPrivateInfos":["getLocation"] } // 需要获取位置的文件中使用 uni.getLocation({ type: 'wgs84', success: function (res) { console.log('当前位置的经度:' + res.longitude); console.log('当前位置的纬度:' + res.latitude); } });
事件传参
/** 默认如果没有传递参数,事件函数第一个形参为事件对象 */
<template>
<button @click="tapHandle">点我啊</button>
</template>
<script>
export default {
methods: {
tapHandle (e) {
console.log(e)
}
}
}
</script>
/** 如果给事件函数传递参数了,则对应的事件函数形参接收的则是传递过来的数据 */
<template>
<button @click="tapHandle(1)">点我啊</button>
</template>
<script>
export default {
methods: {
tapHandle (num) {
console.log(num)
}
}
}
</script>
/** 如果获取事件对象也想传递参数 */
<template>
<button @click="tapHandle(1,$event)">点我啊</button>
</template>
<script>
export default {
methods: {
tapHandle (num,e) {
console.log(num,e)
}
}
}
</script>
网络请求
在uni中可以调用uni.request方法进行请求网络请求
组件的通讯
-
父传子
// 通过props来接受外界传递到组件内部的值
<template>
<view>
这是一个自定义组件 {{msg}}
</view>
</template>
<script>
export default {
props: ['msg']
}
</script>
<style>
</style>
// 其他组件在使用login组件的时候传递值
<template>
<view>
<test :msg="msg"></test>
</view>
</template>
<script>
import test from "@/components/test/test.vue"
export default {
data () {
return {
msg: 'hello'
}
},
components: {test}
}
</script>
-
子传父
// 通过$emit触发事件进行传递参数
<template>
<view>
<button type="primary" @click="sendMsg">给父组件传值</button>
</view>
</template>
<script>
export default {
data () {
return {
status: '打篮球'
}
},
methods: {
sendMsg () {
this.$emit('myEvent',this.status)
}
}
}
</script>
// 父组件定义自定义事件并接收参数
<template>
<view>
<test @myEvent="getMsg"></test>
</view>
</template>
<script>
import test from "@/components/test/test.vue"
export default {
methods: {
getMsg (res) {
console.log(res)
}
},
components: {test}
}
</script>
-
兄弟组件传值(乱传)
<!-- 兄弟组件通讯使用uni.$emit与uni-$on的方式进行操作 -->
<!-- 例如:A组件 与 B组件是兄弟组件 - 演示 A组件向B组件传递信息,B组件接收 -->
<!-- A组件 -->
<template>
<view>
<button @click="handleClickBtn">点击发送信息</button>
</view>
</template>
<script>
export default {
data() {
return {
name: '法外狂徒-张三'
};
},
methods: {
handleClickBtn() {
uni.$emit('name', this.name);
}
}
}
</script>
<!-- B组件 -->
<template>
<view>获取到的内容:{{name}}</view>
</template>
<script>
export default {
data() {
return {
name: ''
};
},
created() {
uni.$on('name', value => {
this.name = value;
});
}
}
</script>