# imooc-blog **Repository Path**: linkgeek/imooc-blog ## Basic Information - **Project Name**: imooc-blog - **Description**: uni-app从入门到进阶 系统完成项目实战 - **Primary Language**: JavaScript - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-03-10 - **Last Updated**: 2025-04-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # uni-app从入门到进阶 系统完成项目实战 网址:https://coding.imooc.com/class/521.html ## 演示 H5:imooc.blog.lgdsunday.club ## 运行须知 1. 该项目应运行在 `HBuilder X` 之中 2. 运行该项目前,请先执行 `npm install` 下来依赖包 ## 项目基本目录结构 ``` |-- api //模块请求接口目录 |-- components //全局公用组件 |-- filters //过滤器,例如字符过滤转换函数定义 |-- node_modules //node包管理 |-- pages //应用的页面文件存放目录 |-- static //存放静态资源,如图片、字体等,不会被Webpack打包编译处理 |-- store //全局状态管理,数据缓存 |-- modules //store子模块目录 |-- index.js |-- styles //样式文件 |-- subpkg //分包页面目录 |-- unpackage //打包存放目录 |-- utils //工具库目录 |-- index.js |-- request.js //请求封装 |-- App.vue //应用主组件,应用配置、配置App全局样式以及监听 |-- main.js //Vue初始化入口文件,配置Vue实例、加载组件、初始化Vue实例等 |-- manifest.json //应用配置文件,用于指定应用的名称、描述、图标、权限;平台特有配置等 |-- pages.json //配置页面的路由、窗口样式、tabBar导航条、选项卡等页面类信息 |-- pages //页面路由 |-- globalStyle //全局样式 |-- tabBar //多tab应用一级导航栏,最少2个、最多5个 |-- subPackages //分包配置,用于解决主包文件过大问题 |-- uni.scss //一个全局的样式文件,用于定义项目中的全局样式变量和样式规则。Uni-app 推荐使用 scss 作为样式预处理器,这样可以方便地定义和使用变量、混合(mixin)、嵌套等高级 CSS 特性。 ``` #### pages.json: ##### pages -> style - navigationBarTitleText: "首页", //导航标题 - navigationBarTextStyle: "black", //导航字体颜色 - navigationBarBackgroundColor: "#F8F8F8", //导航背景颜色 - enablePullDownRefresh: true, //下拉刷新 ##### globalStyle - navigationBarTitleText: "uni-app", //导航标题 - navigationBarTextStyle: "black", //导航字体颜色 - navigationBarBackgroundColor: "#F8F8F8", //导航背景颜色 - backgroundColor: "#F8F8F8" //页面背景颜色 - app-plus: {} //App节点配置项 ##### subPackages - root: " " //子包的根目录 - pages: [] //参数同主包pages ## uni-app 应用生命周期 应用生命周期在 App.vue 中定义,主要包括以下几个钩子函数: onLauch 当uni-app初始化完成时触发(全局只触发一次) onShow 当uni-app启动,或从后台进入前台显示 onHide 当uni-app从前台进入后台 onError 当uni-app报错时触发 ``` ``` ## uni-app 页面生命周期函数 页面生命周期在每个页面的 .vue 文件中定义,主要包括以下钩子函数: ``` ``` 注意: (1)不要在选项属性或回调上使用箭头函数,比如 created: () => console.log(this.a) 或 vm.$watch('a', newValue => this.myMethod())。因为箭头函数是和父级上下文绑定在一起的,this 不会是如你做预期的 Vue 实例,且 this.a 或 this.myMethod 也会是未定义的。 (2)建议使用 uni-app 的 onReady 代替 vue 的 mounted。 (3)建议使用 uni-app 的 onLoad 代替 vue 的 created。 ## Uni-app 跨平台差异处理 Uni-app 支持条件编译,可以在代码中根据不同的平台编译不同的代码。支持的平台标识包括: H5: 浏览器环境 MP-WEIXIN: 微信小程序 MP-ALIPAY: 支付宝小程序 MP-BAIDU: 百度小程序 MP-QQ: QQ 小程序 APP-PLUS: App 原生平台(包括 Android 和 iOS) ## 跳转 声明式导航 编程式导航 1、打开新页面 uni.navigateTo、 2、页面重定向 uni.redirectTo、 3、页面返回 uni.navigateBack、、用户按左上角返回按钮、安卓用户点击物理back按键 4、Tab 切换 uni.switchTab、、用户切换 Tab 5、重加载 uni.reLaunch、 注意: (1)navigateTo, redirectTo 只能打开非 tabBar 页面。 (2)switchTab 只能打开 tabBar 页面。 (3)reLaunch 可以打开任意页面。 (4)页面底部的 tabBar 由页面配置决定,即只要是定义为 tabBar 的页面,底部都有 tabBar。 (5)不能在 App.vue 里面进行页面跳转。 ## 弄懂Vuex:mapState、mapGetter、mapMutation、mapAction ## 解释 mpType:mpType 是一个uni-app的内置变量,只能在uni-app开发中使用,用于标识应用程序的类型,包括app、h5、weixin、alipay等。 app表示原生应用程序,开发者可以使用原生API进行一些操作,如打开相机、调用系统通讯录等。而其他值则表示在不同平台上运行的Web应用程序,无法使用这些原生API。 async await:使用async关键字来声明一个异步函数,使用await关键字表示等待一个异步操作执行完成。一般搭配try与catch使用,更好地处理异步操作中可能出现的异常情况。 在小程序中,要使用async await,需先使用promise封装wx.request请求,不能勾选ES6转ES5 ``` funcA() { return new Promise((resolve, reject) => { wx.request({ url: '', success: (res) => { resolve(res) }, fail: (err) => { reject(err) } }) }) } async onAsyncClick() { const resA = await this.funcA(); } ``` mescroll-body: mescroll是一个下拉刷新和上拉加载js框架, 是1.2.1版本新增的组件, 用来填补的不足 生命周期:一件事物由`创建`到`销毁`的全过程 生命周期函数:生命周期中的`关键时刻` ## 多平台适配 1. 自定义模板,在根目录新建 index.html 文件,标签 meta=>no-referrer,用于解决 h5端 访问外部资源 403问题 ## Bug & Tip 1. 首页中 `swiper` 快速滚动导致 `setData` 被不停地调用的问题 此问题为 [微信小程序 swiper 组件的 bug](https://developers.weixin.qq.com/miniprogram/dev/component/swiper.html),可通过以下代码进行修复: ``` onSwiperChange(e) { ... // 解决官方 swiper 在 change 里改变 current 值无限左右抖动的 bug if (e.detail.source === 'touch') { this.currentIndex = e.detail.current; } } ``` ## 知识点 1. 小程序的数据请求会存在跨域吗? 不会。跨域问题只存在基于浏览器`web`中,小程序宿主环境是微信客户端 2. 小程序的数据请求可以叫做`ajax`请求吗? 不可以。`ajax`的核心是依赖于浏览器端的`XMLHttpRequest`对象 3. vscode 工具开发,安装插件:uni-helper,uni-app-snippets,uni-app-schemas,uni-ui-snippets ## Vuex Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。 Vuex包含以下几个核心概念: State:状态对象,包含应用的所有状态数据。 Getters:相当于Vue的计算属性,用于派生出一些状态。 Mutations:同步更改状态的方法,每个mutation都有一个字符串的事件类型和一个回调函数。 Actions:类似于mutations,不同之处在于action提交的是mutation,而不是直接变更状态。Action可以包含任意异步操作。 Modules:将状态分割成模块化的结构,每个模块有自己的state、mutations、actions、getters。 ### Store (容器/仓库) 不能直接改变 Store 中的状态,改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。