Vue 3.x 快速上手(vite / ant-design / vue-router / vuex / axios / mock / echarts)

1、安装准备

1.1 nodejs

官网地址: 点击进入
cmd 检查安装结果:

node -v
npm -v

1.2 Python

没有会报错Error: Can’t find Python executable “python”, you can set the PYTHON env variable
官网地址: 点击进入
安装完成记得配置环境变量

1.3 vue cli 脚手架安装

cmd 命令安装

npm install -g @vue/cli --registry https://registry.npm.taobao.org

–registry https://registry.npm.taobao.org表示临时使用淘宝镜像地址安装
cmd 命令检查安装结果

vue -V 

如果使用vscode建议安装 Vetur/ ESLint 插件安装

1.4 新项目搭建

1)方法一 脚手架搭建

vue create hello-vue3

2)方法二 vite搭建

npm init vite hello-vue3 -- --template vue

Vite 是由 Vue 作者尤雨溪开发的一套一种新的、更快地 web 开发工具,它具快速的冷启动、即时的模块热更新、真正的按需编译几个特点。Vite仅支持Vue3。推荐大家尝试一下~

2、常用插件下载引入

2.1 ant-design UI框架

cmd 下载命令

npm i --save ant-design-vue@next

main.js 文件引入

// 引入ant-design
import Antd from 'ant-design-vue';
import 'ant-design-vue/dist/antd.css';
createApp(App)
    // 使用ant-design
    .use(Antd)
    .mount('#app')

2.2 vue-router 路由

1)下载命令,vue 3.x 必须使用vue-router4及以上

npm install vue-router@4

2)在src下新建route文件夹,新增index.ts文件

// 导入component
import login from "../components/login/login.vue";
import HelloWorld from "../components/HelloWorld.vue";
import { createRouter,createWebHistory} from "vue-router";
const routes = [
    { path: '/', redirect:'/login',},
    { path: '/login', component: login },
    { path: '/home', component: HelloWorld },
]
const router = createRouter({
    history: createWebHistory(),
    routes, // `routes: routes` 的缩写
});
export default router;

3)然后在main.js引入

import { createApp } from 'vue'
import App from './App.vue'
import router from './route'
createApp(App)
.use(router) // 路由配置
.mount('#app')

4)编写路由守卫

// 路由守卫
router.beforeEach((to, from, next) => {
    // 如果访问的是登录页面(无需权限),直接放行
    if (to.path === '/login') return next()
    // 如果访问的是有登录权限的页面,先要获取token
    const tokenStr = store.state.token;
    // 如果token为空,强制跳转到登录页面;否则,直接放行
    if (!tokenStr) return next('/login')
    next()
})

2.3 vuex 状态管理工具

1)cmd下载

npm install vuex@next --save

2)定义store

import { createStore} from "vuex";
// 创建一个新的store实例
export default createStore({
    // 定义需要存储的状态
    state(){
        return{
            count: 0
        }
    },
    // 定义非异步操作
    mutations: {
        addCount(state) {
            state.count++
        }
    }
})

3)在main.js中注入全局

// 导入vuex配置页面
import store from "./store/index";
createApp(App)
    // 使用ant-design
    .use(Antd)
    .use(store)
    .mount('#app')

4)在组件中使用

  created() {
    // 调用mutations中的方法
    this.$store.commit("addCount");
    // 使用存储的状态
    console.log(this.$store.state.count); // 2
  }

5)在setup中使用,setup中没有this指向全局的概念,需要先引入

import { useStore } from 'vuex';
// setup 中使用vuex
const store = useStore();
store.commit("addCount");
console.log(store.state.count); // 1

6)配置刷新不丢失数据 app.vue中

mounted(){
    // 解决vuex刷新数据丢失问题: 每次刷新将数据存到localstorage
    const store = useStore();
    const storeData = localStorage.getItem("store");
    if (storeData ) {
      store.replaceState(Object.assign({}, JSON.parse(storeData)))
    }
    window.addEventListener("beforeunload",()=>{
      localStorage.setItem("store",JSON.stringify(store.state))
    })
  }

2.4 axios 数据请求

1)cmd下载

npm install axios --save

2)Vite.config.ts中配置跨域

export default defineConfig({
  server: {
    port: 3003,
    proxy: {
        '/api': {
            target: 'http://*.*.*.*:*', // 请求地址
            changeOrigin: true, // 开启跨域
            ws: true,
            rewrite: (path) => path.replace(/^\/api/, '')
        }
    },
  }
})

3)axios 参考配置

import axios from 'axios';
import { useRouter } from 'vue-router'
import { message } from 'ant-design-vue';

axios.defaults.baseURL= "/api/"; // 接口地址
//设置超时
axios.defaults.timeout = 10000;

const router = useRouter();
//http request 拦截器
axios.interceptors.request.use(
    config => {
        // const token = Cookies.get('名称');
        config.headers = {
            'Content-Type': 'application/json'
        }
        return config;
    },
    error => {
        return Promise.reject(error);
    }
);

//http response 拦截器
axios.interceptors.response.use(
    response  => {
        if (response.data.code == 200) {
            return response;
        } else {
            //状态码处理
            message.warning(response.data.data);
        }
    },
    error => {
        if (error.response.status) {
            switch (error.response.status) {
                // 401: 未登录             
                case 401:
                    router.replace({
                        path: '/login',
                    });
                    break;
                // 403 token过期操作--暂时不需要
                // 登录过期对用户进行提示
                // 清除本地token和清空vuex中token对象
                // 跳转登录页面                
                case 403:
                    // 清除token
                    // localStorage.removeItem('token');
                    // store.commit('loginSuccess', null);
                    // 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面 
                    router.replace({
                        path: '/login',
                    });
                    break;

                // 404请求不存在,待完善
                case 404:
                    // 重定位找不到路由
                    break;
                // 其他错误,直接抛出错误提示
                default:
                    message.warning('This is a warning message');
            }
            return Promise.reject(error.response);
        }
    }
)

/**
 * 封装get方法
 * @param url
 * @param data
 * @returns {Promise}
 */
 function get(url, params = {}) {
    return new Promise((resolve, reject) => {
        axios.get(url, {
            params
        }).then(response => {
            resolve(response.data)
        }).catch(err => {
            reject(err)
        })
    })
}

/**
 * 封装post请求
 * @param url
 * @param data
 * @returns {Promise}
 */
function post(url, data = {}) {
    return new Promise((resolve, reject) => {
        axios.post(url, data).then(response => {
            resolve(response.data)
        }, err => {
            reject(err)
        })
    })
}

/**
* 封装put请求
* @param url
* @param data
* @returns {Promise}
*/
function put(url, data = {}) {
    return new Promise((resolve, reject) => {
        axios.put(url, data).then(response => {
            resolve(response.data)
        }, err => {
            reject(err)
        })
    })
}
const https = {
    get: function (url, params) {
        return get(url, params)
    },
    post: function (url, params) {
        return post(url, params)
    },
    put: function (url, params) {
        return put(url, params)
    }
}
export default https; 

4)可以在api文件中调用请求
在这里插入图片描述

2.5 mock使用

1)mock插件下载

npm install mockjs vite-plugin-mock --save

2)vite.congfig.ts 引入

plugins: [
    vue(),
    viteMockServe({
      mockPath: "./src/mock", // mock数据文件夹
      supportTs: true
    })
  ]

3)在src/mock文件夹下创建测试的api 的ts文件

export default [
    {
        url: "/getMeun",
        method: "get",
        response: (options) => {
            const role = options.query.role;
            const menuList =  [
                {
                   name: "设备管理", path: "/equipmentManagement", icon: "PieChartOutlined", 
                   children: [{
                        name: "测试管理", 
                        path: "/testmanagement",
                        children: [
                            { name: "测试页面", path: "/test" }
                        ]
                   }]
                },
                {
                    name: "系统管理", path: "/systemManagement", icon: "SettingOutlined", 
                    children: [{
                         name: "用户管理", 
                         path: "/usermanegement",
                    }]
                 }
            ];
            if(role == 'admin'){
                return {
                    code: 200,
                    message: "ok",
                    data: menuList,
                };
            } else {
                return {
                    code: 200,
                    message: "ok",
                    data: [menuList[0]],
                };
            }
        },
    },
];

4)在api中进行调用,可以使用axios或者fetch

import http from '../utils/axios';
// 菜单获取
export const getMenu = (role) => {
    return http.get(`/getMeun?role=${role}`, {});
    return fetch(`/getMeun?role=${role}`);
}

5)在页面中调用api

import { getMenu } from '../../api/login';
getMenu('admin').then(
  res => {
     console.log(res);
   }
 ) // axios 写法
 getMenu('admin').then(
   response => response.json()
 ).then(
   res => {
     console.log(res);
   }
 ) // fetch 写法

6) 请求成功
在这里插入图片描述

2.6 echarts(5)使用

  1. 下载echats
    官网:http://echarts.apache.org/examples/zh/index.html
    例子参考:https://www.makeapie.com/explore.html
npm install echarts --save

2)在component中按需引入

import * as echarts from 'echarts'

3)使用流程

  <div id="echarts" :style="{ width: '100%', height: '300px' }"></div> // div容器创建,容器需要有宽高设置
  
  var myChart = echarts.init(document.getElementById("echarts")); 初始化echart
  const option = {
      ... // 去官网或例子参考网站里面找
  }
  myChart.setOption(option, true); // 设置配置
  window.onresize = function () {
   //自适应大小, 不用的话不会自适应大小。
    myChart.resize();
  };

4)在使用5.x 版本使用中国地图,由于echarts版本过高,需要引入china.json文件
china.json文件获取:
链接:https://pan.baidu.com/s/1GWwsAL4wI9KITJ20shRd_Q
提取码:xpg1

import chinaMap from "@/assets/json/china.json"; // 引入上面的json文档
echarts.registerMap("china", { geoJSON: chinaMap }); // 再init上面执行

在这里插入图片描述

结尾的话:如果对你有用的话,麻烦点赞一下哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值