备注:
对应项目vue3-vite-yiqing 【移动端——展示疫情实时数】
优点:使用vite创建的项目,运行比webpack创建的要快
创建项目
1 | npm create vite@latest |
1 | √ Project name: ... vue3-vite-yiqing |
1 | cd vue3-vite-yiqing |
VSCode中安装Vetur插件
安装less
1 | cnpm i less less-loader -D |
在main.ts中引入reset.less
1 | import './assets/css/reset.less' |
reset.less
1 | /* http://meyerweb.com/eric/tools/css/reset/ |
设置根节点font-size值,使用rem适配
1 | :root{ |
这样设置之后1px = 1rem
垂直居中
1 | body { |
配置手机可访问本地电脑项目
使用vite新建的项目默认访问链接:http://127.0.0.1:5173/
修改
vite.config.js
文件,添加server
配置1
2
3
4
5server: {
host: '0.0.0.0',
port: 8888,
open: true
},1
2
3
4
5
6
7
8
9export default defineConfig({
plugins: [vue()],
base:'./', // 处理打包后放正式环境的相对路径的问题
server: { // 处理使用本地ip访问页面
host: '0.0.0.0',
port: 8888,
open: true
},
})若使用手机访问本地ip页面,访问不成功(显示“服务器已停用”)。即要将本地电脑的防火墙“关闭”即可。手机和电脑连接同一wifi,手机访问不了电脑起的项目
电脑的“设置”——“网络和共享中心”——“Windows Defender 防火墙”(左下角)——“启用或关闭Windows Defender 防火墙”(左侧)——选择“关闭”(专用网络和公用网络都关闭)
注意:使用完,最好重新“启用”防火墙。
vite.config.js之resolve.alias配置
axios请求数据
vue3中在onMounted生命周期中发出请求
1 | cnpm i axios |
1 | import axios from 'axios'; |
跨域请求处理
修改vite.config.ts
文件,添加以下代码
1 | server: { |
vite.config.ts
修改后
1 | import { defineConfig } from 'vite' |
注意:修改配置文件后,要重启项目。(在vite搭建的项目,不需要重启)
修改请求链接
1 | axios('/api/ug/api/wuhan/app/data/list-total?t=330415245809') |
对接口获取到的数据对象使用TS进行数据类型约束
使用泛型
1
2
3
4
5
6
7
8
9interface IData{
name: string;
type: number;
}
const data = reactive<IData>{
name: 'winney',
type: 1
}企业级开发模式常用
接口返回字段:
- input:境外输入
- noSymptom:无症状感染者
- incrNoSymptom:新增
- confirm:确诊
- dead:死亡
- heal:治愈
- 现有确诊数=累计确诊数-累计死亡数-累计治愈数
- confirm-dead-heal
总数:total
较昨日:today
JS的实现
1 | const data = reactive({ |
1 | onMounted(() => { |
为了避免使用数据时,每次都写data.
, 对数据进行解构
1 | const { chinaTotal } = toRefs(data); |
使用:
1 | <p> <strong class="red">{{chinaTotal.total.input}}</strong></p> |
直接使用会报错:
原因,异步请求是在组件onMounted之后的。 在第一次渲染的时候,当时还没有chinaTotal的数据
1 | <ul class="tab-content" v-if="chinaTotal.total"> |
Tab切换模块的功能
1 | // 获取中国的数据 |
1 | const { chinaTotal, hbData } = toRefs(data); |
1 | <div class="tab-box" v-if="chinaTotal.total"> // 判断放在父盒子,做一次判断 |
tab切换事件
动态绑定class的方法 :class="{active: type === 1}"
1 | <div class="tab-btn" @click="tabChange(1)" :class="{active: type === 1}">全国疫情数据(含港澳台)</div> |
1 | const tabChange = (type: number) => { |
TS的实现
不把跟业务无关的代码写在vue文件中
在src目录中新建一个type目录,存放所有的type
1. src/type/index.ts
1 | interface IData{ |
页面中使用:
1 | import type { IData } from "../../type/index" |
在src中新建pageJs目录,用于存放所有页面的逻辑js
1. pageJs/index.ts
1 | import type { IData } from "../type/index" |
2. src/type/index.ts
1 | interface IData{ |
VSCode中TS实现接口的快捷方式:
2. pageJs/index.ts
优点:可重复使用
1 | import type { IData } from "../type/index" |
3.页面中使用
1 | import { InteData } from '../../pageJs/index' |
4.请求数据方法封装
注:setup函数中是不支持异步的
4.1 pageJs/index.ts
1 | import axios from 'axios'; |
4.2 页面中使用
1 | import { InteData, initDataFun } from '../../pageJs/index' |
Echarts的使用
1 | cnpm i echarts --save |
1 | <!-- 地图 --> |
2.pageJs/index.ts
1 | import * as echarts from 'echarts'; |
加上自带的loading
1 | var myMap = echarts.init(mapDom); |
获取数据
1 | // 地图数据 |
2.1.完整代码
1 | const initDataFun = (data:InteData) => { |
3.引入china.json文件
【echarts 中国地图】vue实现中国地图,省份居中china.json文件下载
在pageJs/index.ts
1 | import chinaJson from '../assets/china.json'; |
List组件封装
子组件List组件:
1 | <template> |
重点1:处理初始化会报错问题-判断是否渲染子组件
子组件的setup会在父组件的onMounted之前执行,所以传参的时候,要进行判断,是否渲染子组件
1 | import List from '../../components/situation/List.vue'; |
动态数据传值
动态数据,这样写会报错::msg="中国疫情"
要加上引号::msg="'中国疫情'"
props里面的数据无需解构,可以直接使用
1 | const props = defineProps({ |
组件自调用——递归
重点2:组件自调用,要写上name值
List.vue
1 | <script setup name="List" lang='ts'> |
1 | <template> |
重点3:定义子组件接收的属性
1 | <script setup name="List" lang='ts'> |
文字溢出不换行显示
1 | white-space: nowrap; |
懒加载——下拉刷新上拉加载
国际病例数据较多——使用懒加载方式。
上拉加载下拉刷新的组件-ScrollCom
1 | <template> |
使用ScrollCom
1 | <ScrollCom |
对分页加载的数据进行拆解
1 | const getPageList = (list:any[]) => { |
第一页数据::list="showList"
1 | <ScrollCom |
处理上拉加载报错:
1 | TypeError: data.areaTree[page] is not iterable (cannot read property undefined) |
原因:页数等于数据长度仍去获取数据; 解决:页数等于数据长度,就显示“没有更多”
1 | if(page === data.areaTree.length - 1) { |
下拉刷新
- touchstart
- touchmove
- touchend
1 | <div |
1 | // 手指触碰到屏幕 |
1 | const $emit = defineEmits(['getList','refreshFun']) |
下拉刷新方法及回调处理
1 | // 下拉刷新方法及 回调处理 |
注:要将initDataFun函数改为返回promise
1 | const initDataFun = async (data:InteData) => { |
下拉的空白区域的宽度
1 | :style="{top: `${translateY}px`}" |
折线图,y轴上的刻度数据被挡住,使用以下方法调整样式
1 | yAxis: { |
打包上线
打包报错:
将package.json的
1 | "build": "vue-tsc --noEmit && vite build", |
改为
1 | "build": "vite build", |
vue3.0+vite+ts项目搭建-分环境打包(四)
备注:完整代码在Gitee
中 Vue3_demo/vue3-vite-yiqing
备注:获取疫情数据的接口:https://c.m.163.com/api/ug/api/wuhan/app/data/list-total?t=330415245809
解决vue本地环境跨域请求正常,版本打包后跨域代理不起作用,请求不到数据的方法
VITE+VUE3 跨域环境变量配置
神坑——后端允许了跨域但是前端(vue3+vite+axios)仍然提示跨域
axios封装请求
使用vite如何配置跨域,以及环境配置
1 |
|
1 | server: { |