小兔鲜项目 uniapp (1)

目录

项目架构

uni-app小兔鲜儿电商项目架构

 小兔鲜儿电商课程安排

创建uni-app项目

1.通过HBuilderX创建

2.通过命令行创建

pages.json和tabBar案例

uni-app和原生小程序开发区别 

用VS Code开发uni-app项目

 拉取小兔鲜儿项目模板代码

 基础架构–引入uni-ui组件库

操作步骤

安装类型声明文件 

配置类型声明文件

 基础架构–小程序端Pinia持久化、

持久化存储插件

网页端持久化 API

多端持久化 API

参考代码

 基础架构–uni.request请求封装

基础架构–请求和上传文件拦截器

 基础架构–封装Promise请求函数


项目架构

uni-app小兔鲜儿电商项目架构

 小兔鲜儿电商课程安排

创建uni-app项目

创建uni-app项目

uni-app支持两种方式创建项目:

1.通过HBuilderX创建

 1.1下载安装HbuilderX编辑器

 1.2通过HbuilderX创建uni-app vue3项目

 1.3安装uni-app vue3编译器插件

 1.4编译成微信小程序端代码

 1.5开启服务端口

 小技巧分享:模拟器窗口分离和置顶

两者关系 

2.通过命令行创建

通过命令行创建(不必依赖HBuilderX)

命令行创建uni-app项目:

vue3+ts版:

npx degit dcloudio/uni-preset-vue#vite-ts 项目名称

创建其他版本可查看:uni-app 官网https://uniapp.dcloud.net.cn/quickstart-cli.html 

编译和运行uni-app项目:

         

  1. 安装依赖 pnpm install
  2. 编译成微信小程序 pnpm dev:mp-weixin
  3. 导入微信开发者工具

温馨提示: 在 manifest.json 文件添加小程序 appid 方便真机预览

pages.json和tabBar案例

我们先来认识 uni-app 项目的目录结构。

├─pages            业务页面文件存放的目录
│  └─index
│     └─index.vue  index页面
├─static           存放应用引用的本地静态资源的目录(注意:静态资源只能存放于此)
├─unpackage        非工程代码,一般存放运行或发行的编译结果
├─index.html       H5端页面
├─main.js          Vue初始化入口文件
├─App.vue          配置App全局样式、监听应用生命周期
├─pages.json       **配置页面路由、导航栏、tabBar等页面类信息**
├─manifest.json    **配置appid**、应用名称、logo、版本等打包信息
└─uni.scss         uni-app内置的常用样式变量

用于配置页面路由、导航栏、tabBar 等页面类信息 

 

{"pages": [ //页面路径及窗口表现{"path": "pages/index/index", //页面路径"style": { //页面样式"navigationBarTitleText": "首页" //导航栏的标题文字}},{"path": "pages/my/my","style": {"navigationBarTitleText": "我的"}}],"globalStyle": { //全局页面样式"navigationBarTextStyle": "white", //导航栏标题颜色只支持black/white"navigationBarTitleText": "uni-app","navigationBarBackgroundColor": "#27ba9b", //导航栏背景颜色"backgroundColor": "#F8F8F8"},"tabBar": { //底部tab"list": [{ //tab列表"pagePath": "pages/index/index", //页面路径"text": "首页", //tab的文字"iconPath": "static/tabs/home_default.png", //图片路径"selectedIconPath": "static/tabs/home_selected.png" //选中图片的路径},{"pagePath": "pages/my/my","text": "我的","iconPath": "static/tabs/user_default.png","selectedIconPath": "static/tabs/user_selected.png"},]},"uniIdRouter": {}
}

uni-app和原生小程序开发区别 

每个页面是一个.vue文件,数据绑定及事件处理同Vue.js规范:

1.属性绑定src="{{ url }}"升级成:src="url"

2.事件绑定bindtap="eventName"升级成@tap="eventName",支持()传参

3.支持Vue常用指令v-for、v-if、v-show、v-model等

温馨提示:调用接口能力,建议前缀wx替换为uni,养成好习惯,这样支持多端开发。

<style></style> 样式不需要写 scoped

生命周期分为三部分:应用生命周期(小程序),页面生命周期(小程序),组件生命周期(Vue)

<template><!--indicator-dots	是否显示面板指示点  :autoplay	是否自动切换  circular	是否采用衔接滑动,即播放到末尾后重新回到开头--><swiper indicator-dots :autoplay="false" circular><swiper-item class='banner' v-for="item in picurls" :key='item.id'><image :src="item.url" @tap='onImageChange(item.url)' mode=""></image></swiper-item></swiper>
</template><script>export default {data() {return {title: 'Hello',picurls: [{id: 1,url: 'https://img0.baidu.com/it/u=3021883569,1259262591&fm=253&app=120&size=w931&n=0&f=JPEG&fmt=auto?sec=1691600400&t=923ddedd0e2c4310685b4603e1d3b3c3'}, {id: 2,url: 'https://img0.baidu.com/it/u=3021883569,1259262591&fm=253&app=120&size=w931&n=0&f=JPEG&fmt=auto?sec=1691600400&t=923ddedd0e2c4310685b4603e1d3b3c3'}, {id: 3,url: 'https://img0.baidu.com/it/u=3021883569,1259262591&fm=253&app=120&size=w931&n=0&f=JPEG&fmt=auto?sec=1691600400&t=923ddedd0e2c4310685b4603e1d3b3c3'}, {id: 4,url: 'https://img0.baidu.com/it/u=3021883569,1259262591&fm=253&app=120&size=w931&n=0&f=JPEG&fmt=auto?sec=1691600400&t=923ddedd0e2c4310685b4603e1d3b3c3'}, {id: 5,url: 'https://img0.baidu.com/it/u=3021883569,1259262591&fm=253&app=120&size=w931&n=0&f=JPEG&fmt=auto?sec=1691600400&t=923ddedd0e2c4310685b4603e1d3b3c3'}]}},onLoad() {},methods: {onImageChange(url) {console.log(url);uni.previewImage({ //在新页面中全屏预览图片。预览的过程中用户可以进行保存图片、发送给朋友等操作。urls: this.picurls.map(v => v.url), //需要预览的图片链接列表。2.2.3 起支持云文件ID。	current: url //	当前显示图片的链接})}}}
</script><style>.banner,.banner image {width: 750rpx;height: 750rpx;}
</style>

用VS Code开发uni-app项目

用VS Code开发uni-app项目

为什么选择VS Code?

  • HbuilderX对TS类型支持暂不完善
  • VS Code对TS类型支持友好,熟悉的编辑器

 

 用 VS Code 开发配置

  • 安装 uni-app 插件
    • uni-create-view :快速创建 uni-app 页面
    • uni-helper uni-app :代码提示
    • uniapp 小程序扩展 :鼠标悬停查文档
  • TS 类型校验
    • 安装类型声明文件 pnpm i -D @types/wechat-miniprogram @uni-helper/uni-app-types
    • 配置 tsconfig.json
  • JSON 注释问题
    • 设置文件关联,把 manifest.json 和 pages.json 设置为 jsonc
// tsconfig.json
{"extends": "@vue/tsconfig/tsconfig.json","compilerOptions": {"sourceMap": true,"baseUrl": ".","paths": {"@/*": ["./src/*"]},"lib": ["esnext", "dom"],"types": ["@dcloudio/types",
+      "@types/wechat-miniprogram",
+      "@uni-helper/uni-app-types"]},"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"]
}

 注意:原配置 experimentalRuntimeMode 现无需添加

                                                   

温馨提示:VS Code 可通过快捷键 Ctrl + i 唤起代码提示。 

 拉取小兔鲜儿项目模板代码

拉取小兔鲜儿项目模板代码

项目模板包含:目录结构,项目素材,代码风格。

git clone http://git.itcast.cn/heimaqianduan/erabbit-uni-app-vue3-ts.git
heima-shop

注意事项

  • 在 manifest.json 中添加微信小程序的 appid

 基础架构–引入uni-ui组件库

操作步骤

安装 uni-ui 组件库https://uniapp.dcloud.net.cn/component/uniui/quickstart.html#npm%E5%AE%89%E8%A3%85

pnpm i @dcloudio/uni-ui

配置自动导入组件

// pages.json
{// 组件自动导入"easycom": {是否开启自动导入"autoscan": true,"custom": {// 提取uni的后缀名替换到$1找到正确文件// uni-ui 规则如下配置  // [!code ++]"^uni-(.*)": "@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue" // [!code ++]}},"pages": [// …省略]
}

安装类型声明文件 

pnpm i -D @uni-helper/uni-ui-types

配置类型声明文件

// tsconfig.json
{"compilerOptions": {"types": ["@dcloudio/types","@uni-helper/uni-app-types", // [!code ++]"@uni-helper/uni-ui-types" // [!code ++]]}
}

 基础架构–小程序端Pinia持久化、

说明:项目中 Pinia 用法平时完全一致,主要解决持久化插件兼容性问题。

持久化存储插件

持久化存储插件: pinia-plugin-persistedstatehttps://prazdevs.github.io/pinia-plugin-persistedstate/guide/config.html#storage

插件默认使用 localStorage 实现持久化,小程序端不兼容,需要替换持久化 API。

网页端持久化 API

// 网页端API
localStorage.setItem()
localStorage.getItem()

多端持久化 API

// 兼容多端API
uni.setStorageSync()
uni.getStorageSync()

参考代码

// stores/modules/member.ts
export const useMemberStore = defineStore('member',() => {//…省略},{// 配置持久化persist: {// 调整为兼容多端的APIstorage: {setItem(key, value) {uni.setStorageSync(key, value) // [!code warning]},getItem(key) {return uni.getStorageSync(key) // [!code warning]},},},},
)

 基础架构–uni.request请求封装

基础架构–请求和上传文件拦截器

uniapp 拦截器: uni.addInterceptorhttps://uniapp.dcloud.net.cn/api/interceptor.html

接口说明接口文档https://www.apifox.cn/apidoc/shared-0e6ee326-d646-41bd-9214-29dbf47648fa/doc-1521513

实现步骤

  1. 基础地址
  2. 超时时间
  3. 请求头标识
  4. 添加 token
// src/utils/http.ts
const httpInterceptor = {// 拦截前触发invoke(options: UniApp.RequestOptions) {// 1. 非 http 开头需拼接地址if (!options.url.startsWith('http')) {options.url = baseURL + options.url}// 2. 请求超时options.timeout = 10000// 3. 添加小程序端请求头标识options.header = {...options.header,'source-client': 'miniapp',}// 4. 添加 token 请求头标识const memberStore = useMemberStore()const token = memberStore.profile?.tokenif (token) {options.header.Authorization = token}},
}// 拦截 request 请求
uni.addInterceptor('request', httpInterceptor)
// 拦截 uploadFile 文件上传
uni.addInterceptor('uploadFile', httpInterceptor)

 

 

 基础架构–封装Promise请求函数

实现步骤

  1. 返回 Promise 对象
  2. 成功 resolve
    1. 提取数据
    2. 添加泛型
  3. 失败 reject
    1. 401 错误
    2. 其他错误
    3. 网络错误

参考代码

/*** 请求函数* @param  UniApp.RequestOptions* @returns Promise*  1. 返回 Promise 对象*  2. 获取数据成功*    2.1 提取核心数据 res.data*    2.2 添加类型,支持泛型*  3. 获取数据失败*    3.1 401错误  -> 清理用户信息,跳转到登录页*    3.2 其他错误 -> 根据后端错误信息轻提示*    3.3 网络错误 -> 提示用户换网络*/
type Data<T> = {code: stringmsg: stringresult: T
}
// 2.2 添加类型,支持泛型
export const http = <T>(options: UniApp.RequestOptions) => {// 1. 返回 Promise 对象return new Promise<Data<T>>((resolve, reject) => {uni.request({...options,// 响应成功success(res) {// 状态码 2xx, axios 就是这样设计的if (res.statusCode >= 200 && res.statusCode < 300) {// 2.1 提取核心数据 res.dataresolve(res.data as Data<T>)} else if (res.statusCode === 401) {// 401错误  -> 清理用户信息,跳转到登录页const memberStore = useMemberStore()memberStore.clearProfile()uni.navigateTo({ url: '/pages/login/login' })reject(res)} else {// 其他错误 -> 根据后端错误信息轻提示uni.showToast({icon: 'none',title: (res.data as Data<T>).msg || '请求错误',})reject(res)}},// 响应失败fail(err) {uni.showToast({icon: 'none',title: '网络错误,换个网络试试',})reject(err)},})})
}

 请求函数–请求成功提取数据和设置类型

 基础架构–封装Promise请求函数

请求函数–获取数据失败 

  • uni.request的success回调函数只是表示服务器响应成功,没处理响应状态码,业务中使用不方便
  • axios函数是只有响应状态码是2xx才调用resolve函数,表示获取数据成功,业务中使用更准确 

[扩展] pinia需要使用pinia-plugin-persistedstate插件来进行数据的存储

 

插件官网地址:
https://prazdevs.github.io/pinia-plugin-persistedstate/guide/config.html

1、安装


这里对插件的安装就不多赘述了,放两张官网的截图

使用命令:npm i pinia-plugin-persistedstate

 

 2、使用

3、关于全部缓存及部分缓存的说明 

(1)将store的state中的全部数据进行缓存,直接在state同级下面添加persist对象

 此时,默认将数据存放在浏览器的SessionStorage中,key为store的名称,value为该store中所有的数据。

 (2)将store的state中的数据进行部分缓存
此时需要在persist中添加strategies数组,、

 

每个元素的key是想要储存的数据变量名(在state中定义的),storage可以写sessionStorage或者localStorage,此时,sessionStorage中的key就是变量名,value就是该变量的值

自定义存储 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/29047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SSM个人博客项目

文章目录 SSM个人博客系统实现项目介绍 一、准备工作0. 创建项目添加对应依赖1. 数据库设计2. 定时实体类 二、功能实现1.统一功能处理统一返回格式统一异常处理定义登录拦截器 2. 注册登录实现生成获取验证码密码加盐实现注册功能登录功能注销功能 3.登录用户博客列表获取登录…

机器学习笔记之优化算法(十)梯度下降法铺垫:总体介绍

机器学习笔记之优化算法——梯度下降法铺垫&#xff1a;总体介绍 引言回顾&#xff1a;线搜索方法线搜索方法的方向 P k \mathcal P_k Pk​线搜索方法的步长 α k \alpha_k αk​ 梯度下降方法整体介绍 引言 从本节开始&#xff0c;将介绍梯度下降法 ( Gradient Descent,GD ) …

Git stash命令

Git stash Git stash用来暂存当前正在进行的工作&#xff0c; 将工作区还没加入索引库的内容压入本地的Git栈中&#xff0c;在需要应用的时候再弹出来。比如想pull 最新代码&#xff0c;又不想加新commit&#xff1b;或者为了修复一个紧急的bug&#xff0c;先stash&#xff0c…

Vue_02:详细语法以及代码示例 + 知识点练习 + 综合案例(第二期)

2023年8月4日15:25:01 Vue_02_note 在Vue中&#xff0c;非相应式数据&#xff0c;直接往实例上面挂载就可以了。 01_Vue 指令修饰符 什么是指令修饰符呢&#xff1f; 答&#xff1a; 通过 " . " 指明一些指令后缀&#xff0c;不同 后缀 封装了不同的处理操作 —…

基于差分进化优化随机森林的多分类预测,基于DA-RF的分类预测

目录 背影 摘要 随机森林的基本定义 随机森林实现的步骤 差分进化算法原理 差分算法主要参数 差分算法流程图 差分算法优化测试函数代码 完整代码包含数据下载链接: https://download.csdn.net/download/abc991835105/88179071 基于差分进化算法改进的bp神经网络的心理状况评估…

SpringCloud Gateway获取请求响应body大小

前提 本文获取请求、响应body大小方法的前提 : 网关只做转发逻辑&#xff0c;不修改请求、相应的body内容。 SpringCloud Gateway内部的机制类似下图&#xff0c;HttpServer&#xff08;也就是NettyServer&#xff09;接收外部的请求&#xff0c;在Gateway内部请求将会通过Htt…

RISC-V基础之函数调用(四)非叶函数调用(包含实例)

叶函数是指不调用其他函数&#xff0c;也不改变任何非易失性寄存器的函数2。叶函数通常是一些简单的操作&#xff0c;如数学运算或逻辑判断。叶函数的特点是可以通过模拟返回来展开&#xff0c;即不需要保存或恢复寄存器的状态。 非叶函数是指调用其他函数或改变非易失性寄存器…

电力巡检无人机助力迎峰度夏,保障夏季电力供应

夏季是电力需求量较高的时期&#xff0c;随着高温天气的来临&#xff0c;风扇、空调和冰箱等电器的使用量也大大增加&#xff0c;从而迎来夏季用电高峰期&#xff0c;电网用电负荷不断攀升。为了保障夏季电网供电稳定&#xff0c;供电公司会加强对电力设施设备的巡检&#xff0…

ATF(TF-A)安全通告汇总

目录计划如下&#xff0c;相关内容补充中&#xff0c;待完成后进行超链接&#xff0c;敬请期待&#xff0c;欢迎您的关注 1、Advisory TFV-1 (CVE-2016-10319) 2、Advisory TFV-2 (CVE-2017-7564) 3、Advisory TFV-3 (CVE-2017-7563) 4、Advisory TFV-4 (CVE-2017-9607) 5、Ad…

❤ vue3中的RouteRecordRaw

❤ vue3中的RouteRecordRaw RouteRecordRaw 是 Vue Router 4.x 中新增的类型&#xff0c;用于定义路由配置。它是一个 TypeScript 类型 import { RouteRecordRaw } from vue-routerconst routes: Array<RouteRecordRaw> [{path: /,name: Home,component: () > impo…

opencv基础-34 图像平滑处理-2D 卷积 cv2.filter2D()

2D卷积是一种图像处理和计算机视觉中常用的操作&#xff0c;用于在图像上应用滤波器或卷积核&#xff0c;从而对图像进行特征提取、平滑处理或边缘检测等操作。 在2D卷积中&#xff0c;图像和卷积核都是二维的矩阵或数组。卷积操作将卷积核在图像上滑动&#xff0c;对每个局部区…

瑞数系列及顶像二次验证LOGS

瑞数商标局药监局专利局及顶像二次验证 日期&#xff1a;20230808 瑞数信息安全是一个专注于信息安全领域的公司&#xff0c;致力于为企业和个人提供全面的信息安全解决方案。他们的主要业务包括网络安全、数据安全、应用安全、云安全等方面的服务和产品。瑞数信息安全拥有一支…

Python爬虫之JsonPath详解

简介 JsonPath是一种信息抽取类库&#xff0c;是从JSON文档中抽取指定信息的工具 文档 官方文档 JSONPath - XPath for JSON 语法规则 $ 根节点 现行节点 .or[] 取子节点 n/a 取父节点&#xff0c;Jsonpath未支持 .. 就是不管位置&#xff0c;选择所有符…

【资料分享】全志科技T507工业核心板硬件说明书(一)

目 录 前言 1硬件资源 1.1CPU 1.2ROM 1.3RAM 1.4时钟系统 1.5电源 1.6LED

现在转行搞嵌入式找工作难不难啊?

对于应届生来说&#xff0c;嵌入式开发的经验不会有太多&#xff0c;所以要求也不会太高。 嵌入式开发常用的是C语言&#xff0c;所以需要你有扎实的功底&#xff0c;这一点很重要&#xff0c;数据结构算法&#xff0c;指针&#xff0c;函数&#xff0c;网络编程 有了上面的基…

web题型

0X01 命令执行 漏洞原理 没有对用户输入的内容进行一定过滤直接传给shell_exec、system一类函数执行 看一个具体例子 cmd1|cmd2:无论cmd1是否执行成功&#xff0c;cmd2将被执行 cmd1;cmd2:无论cmd1是否执行成功&#xff0c;cmd2将被执行 cmd1&cmd2:无论cmd1是否执行成…

源码分析——ConcurrentHashMap源码+底层数据结构分析

文章目录 1. ConcurrentHashMap 1.71. 存储结构2. 初始化3. put4. 扩容 rehash5. get 2. ConcurrentHashMap 1.81. 存储结构2. 初始化 initTable3. put4. get 3. 总结 1. ConcurrentHashMap 1.7 1. 存储结构 Java 7 中 ConcurrentHashMap 的存储结构如上图&#xff0c;Concurr…

winform控件 datagridview分页功能

主要实现页面跳转、动态改变每页显示行数、返回首末页、上下页功能&#xff0c;效果图如下&#xff1a; 主代码如下&#xff1a; namespace Paging {public partial class Form1 : Form{public Form1(){InitializeComponent();}private int currentPageCount;//记录当前页行数…

一个竖杠在python中代表什么,python中一竖代表什么

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;一个竖杠在python中代表什么&#xff0c;python中一竖代表什么&#xff0c;今天让我们一起来看看吧&#xff01; 维基百科页面是错误的&#xff0c;我已经更正了。|和&不是布尔运算符&#xff0c;即使它们是急切运算…

GODOT游戏引擎简介,包含与unity性能对比测试,以及选型建议

GODOT&#xff0c;是一个免费开源的3D引擎。本文以unity作对比&#xff0c;简述两者区别和选型建议。由于是很久以前写的ppt&#xff0c;技术原因视频和部分章节丢失了。建议当做业务参考。 GODOT目前为止遇到3个比较重大的基于&#xff0c;第一个是oprea的合作奖&#xff0c;…