[完整]流程解決Vue3項目搭建步驟

来源:https://www.cnblogs.com/ProsperousEnding/archive/2023/07/21/17570132.html
-Advertisement-
Play Games

# Vue3項目完整搭建步驟 ## 一、 使用vite創建vue3項目 `npm init vue@latest` 或者`npm create vite@latest`進行初始化項目並創建項目名稱code,進入code目錄進行基本部署。 `cd code`、`npm install` 、`npm r ...


Vue3項目完整搭建步驟

一、 使用vite創建vue3項目

npm init vue@latest 或者npm create vite@latest進行初始化項目並創建項目名稱code,進入code目錄進行基本部署。

cd codenpm installnpm run dev

完成vue3項目搭建。

二、 配置vue-router

npm install vue-router@next --save

  • 分離式:**在src目錄下創建router文件夾,併在文件夾下創建index.js和routes.js

index.js :(只用來存放router的配置信息)

import { createRouter, createWebHashHistory } from "vue-router"
import routes from './routes'

 const router=createRouter({
    history:createWebHashHistory(),
    routes,
})
 
export default router 

routes.js: (用來存放路由信息)

  const routes=[
 {
    path: "/",
    redirect: "/home",
  },
  {
    path: "/home",
    name: "home",
    component: () => import('@/pages/Home'),
  },
  {
        name:'page',
        path:'/page',
        component:()=>import('@/pages/page'),
        meta:{
            title:"頁面"
        },
    },
];

export default routes 
  • 修改main.js

    import { createApp } from 'vue';
    import App from './App.vue';
    import router from './router';
     
    const app = createApp(App);
    app.use(router);
    app.mount('#app');
    
  • 修改App.vue

    <template>
      <router-view />
    </template>
    

調用方式

  <template>
  <div>
    <router-link to="/">Home</router-link>
    <button @click="gotoAbout"> 關於 </button>
  </div>
<script setup>
 import{useRouter} from 'vue-router'
    const router = useRouter();
    const gotoAbout = () => {
        router.push({
             path: '/about',
  			 query: { id: 123 }
        })
    }
</script>

三、封裝axios

npm install axios

在src目錄下創建request文件夾,在request文件夾下創建api文件夾以及index.js

api文件夾中存放交互代碼,index.js中存放axios配置代碼

index.js

import axios from "axios";
//為攔截器報錯所用的彈框,如不需要可以不導入
import { ElMessage } from "element-plus";

const service=axios.create({
    baseURL: 'http://localhost:8980/code', //基本路徑,後面可直接寫/方法即可
    withCredentials: false, // 非同步請求攜帶cookie
    // 設置請求頭
    headers: {
        // 設置後端需要的傳參類型
        // 'Content-Type': 'application/json;charset=UTF-8',
        // 'token': 'your token',
        // 'X-Requested-With': 'XMLHttpRequest',  
         "Access-Control-Allow-Origin": "*",
    },
      //設置請求超時時間
    timeout: 1000*60*5,
});

//*可選
//請求攔截器
service.interceptors.request.use((request)=>{
    console.log("request:",request);
    //配置請求頭
    // request.headers.common['Authorization']=window.sessionStorage.getItem('token')===null? null : window.sessionStorage.getItem('token')
   //一定要把處理過的request返回
    return request;
 },
 err=>Promise.reject(err)
 );
 //響應攔截器
 service.interceptors.response.use((response)=>{
    //獲取介面返回結果
    const res=response.data
    console.log("response:",response);
    if(res.code==200){
        return res;
    }else{
        ElMessage.error(res.data||'網路異常')
        return res;
    }
        // console.log("response:",response);
        // return response;
    },
    (err)=>Promise.reject(err)
 );
 export default service;

api.js:

import request from "@/request/index.js"
/**
 * @description 用戶登錄
 */
 export function login(data){
    return request({
        method:"post",
        url:"/user/login",
        data:data,
    });
}
/**
 * @description 獲取用戶信息
 */
export function getUserInfo(data){
    return request({
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' 
          },
        method:"post",
        url:"/user/getUserInfo",
        data:{
            'userId':data
        },
    });
}

調用方式(例舉):

      //處理登錄邏輯
     async function handleLogin(){
        try {
            const res=await login(form.value).then(res=>{
               console.log(res.data)
            })   
        } catch (error) {
            console.log(error);
        }
      }

四、Pinia集成

npm install pinia

  • 修改main.js,在main.js中添加代碼:

main.js

import { createPinia } from 'pinia'
app.use(createPinia())
  • store目錄下新建使用的store,此處使用store.js

註:defineStore 是需要傳參的,第一個參數是標識id,第二個參數是一個對象,有三個模塊, state,getters,actions。

import { ref, computed } from "vue";
import { defineStore } from "pinia";
// 選項式api寫法
// export const store1 = defineStore("storeNum",{
//      state: () => {
//       return { 
//              num: 0,
//              name: "coder"}
//      },
//     actions: {
//       add() {
//         this.num++;
//       },
//     },
//   }
// );
// 組合式api寫法
//ref() 就是 state 屬性
//computed() 就是 getters
//function() 就是 actions
export const store2 = defineStore("storeNum",() => {
    const num = ref(0);
    const name=ref{"coder"}
    const add =()=> {
      num.value++;
    }
    return {
      num,
      add
    };
  },
);

  • 組件中使用Pinia
<script setup>
import { store2 } from '@/stores/store.js'
import { storeToRefs } from 'pinia'
const storeNum = store()
let {name,num}=storeToRefs(storeNum); //解構,修改必須引用storeToRefs進行解構處理
const clickHanlde=()=>{
	storeNum.add();}
const batchHanlde = ()=>{
	//store批量處理
	storeNum.$patch(state=>{
		state.num++;
		state.name = 'newCoder';
	})
}
	//狀態重置
const resetBtn=()=>{
	storeNum.$reset()
}
</script>
<template>
	<div>Add{{ storeNum.add }}</div>
	<button @click="clickHanlde">Num++</button>
	<button @click='batchHanlde'>批量處理</button>
	<button @click='resetBtn'>重置</button>
</template>

數據持久化存儲,即刷新頁面後也能存儲數據

npm i pinia-plugin-persist

  • 在store目錄下新建一個配置文件index.js,或者直接在main.js中添加

    註:個人覺得分離後代碼更清晰(主觀)

import { createPinia } from "pinia";
import {createPersistedState } from 'pinia-plugin-persistedstate'
const pinia = createPinia()
pinia.use(createPersistedState({
    serializer:{   // 指定參數序列化器
        serialize: JSON.stringify,
        deserialize: JSON.parse
    }
}))
export default pinia
  • 加入持久化存儲後store.js的寫法
import { ref, computed } from "vue";
import { defineStore } from "pinia";
// 選項式寫法
// export const store = defineStore("storeId",{
//     state: () => ({ num: 0 }),
//     actions: {
//       add() {
//         this.num++;
//       }
//     },
//     啟用持久化存儲(全局持久化)
//     persist: { enabled: true,  // 配置key和持久化存儲的方式
//                strategies: [{
//                   key: 'numStore',
//                   storage: window.localStorage,  //預設localStorage,/sessionStorage
//                   }]
//                } 
// );

// 組合式寫法 
export const store = defineStore("storeId",() => {
    const num = ref(0);
    const name=ref("coder");
    const age=ref(18);
    const add =()=> {
      num.value++;
    }
    return {
      num,
      add
    };
  },
  {
//  選項式寫法演示的是全局持久化,組合式寫法演示的是指定欄位持久化,不配置預設全部持久化
//  persist: true, 
    persist: {  enabled: true,
              strategies: [{
                  			storage: window.localStorage,
                            paths: ['name', 'num'] // paths配置需要持久化的欄位
                            beforeRestore: context => {
            						console.log('Before', context)
                             },
                            afterRestore: context => {
            						console.log('After', context)
        					}
                           }]
              }
  },                                
);

五、vite設置代理解決跨域問題

vite.config.js中配置,代理前端埠到後端8080埠

import{defineConfig} from 'vite'
import vue from '@vitejs/plugin-vue'

//自動導包,與代理無關(可忽略)
import AutoImport from 'unplugin-auto-import/vite'

export default defineConfig({
    plugins: [
        vue(),
        AutoImport({
            imports['vue','vue-router']
        })
    ],
    server:[
         proxy:{
              //可直接寫:'/api ': 'http://localhost:8080/'
         	  '/api':{
                   target: 'http://127.0.0.1:8080', //目標url
       			   changeOrigin: true, //支持跨域
                   ws: true, //允許websocket代理
        		   rewrite: (path) => path.replace(/^\/api/, ""), //重寫路徑,替換/api
			  }
       	 }
    ]
})

六、vite配置@

配置時.vue文件需要加.vue尾碼,不能省略,js可省略,適用vue3.1以上版本

vite.config.js中配置

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import {resolve} from 'path'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  resolve: {
    //配置路徑別名
    alias: {
      '@' : resolve(__dirname,'./src'),
    }
  }
})

七、Vite配置setup語法糖插件:解決import{ref,reactive...}引入問題

  1. npm i unplugin-auto-import -D

  2. 在vite.config.js中配置

    //1. 引入插件
    import AutoImport from 'unplugin-auto-import/vite'
    
    export default defineConfig({
      plugins: [vue(),
               //2. 在plugins中添加AutoImport
                AutoImport({
                    imports:['vue']
                })
               ],
    })
    

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ![](https://img2023.cnblogs.com/blog/3076680/202307/3076680-20230719150159605-2139117895.png) # 1. 變換結果集成一行 ## 1.1. 結果集 ```sql DEPTNO CNT 10 3 20 5 30 ...
  • 該如何選擇ClickHouse的表引擎 本文將介紹ClickHouse中一個非常重要的概念—表引擎(table engine)。如果對MySQL熟悉的話,或許你應該聽說過InnoDB和MyISAM存儲引擎。不同的存儲引擎提供不同的存儲機制、索引方式、鎖定水平等功能,也可以稱之為表類型。ClickHo ...
  • 在之前的這篇文章Oracle/MySQL/PG/SQL Server關係資料庫中NULL與空字元串的區別[1]中,簡單對比、介紹了一下MySQL的NULL/空格/尾部空格處理方式,主要對比了NULL與長度為空的字元串,其實很多地方沒有分析到位就一筆帶過了。這篇文章重新來細說一下MySQL的尾部空格處 ...
  • [數據資產](https://www.dtstack.com/dtinsight/dataassets?src=szsm=07)現在需要接入數棧內部相關應用的時候,支持查看血緣的類型從表、離線任務增加到需要表、離線任務、實時任務、API任務、指標、標簽等,需要支持數棧現有的所有應用任務,最終實現在[ ...
  • 在華為開發者大會2023(Cloud)的“GaussDB資料庫,打造輕量化遷移部署方案”專題論壇上,掌數科技解決方案總經理高星作為華為雲GaussDB的優秀合作伙伴,分享了掌數科技和華為雲GaussDB長期合作的實踐和成果。 ...
  • 瀏覽記錄系統主要用來記錄京東用戶的實時瀏覽記錄,並提供實時查詢瀏覽數據的功能。線上用戶訪問一次商品詳情頁,瀏覽記錄系統就會記錄用戶的一條瀏覽數據,並針對該瀏覽數據進行商品維度去重等一系列處理並存儲。然後用戶可以通過我的京東或其他入口查詢用戶的實時瀏覽商品記錄,實時性可以達到毫秒級。目前本系統可以為京... ...
  • 大家好,我是獨孤風,大數據流動的作者。 最近幾個概念頻繁出現在大家的視野內。 什麼是數據管理,數據治理,數據中心,數據中台,數據湖? 他們之間又有怎麼樣的區別和聯繫呢? 這幾個概念常常讓人混淆,今天我們就來詳細解析一下。 # 一、數據管理 數據管理是指組織對其整個數據生命周期進行的規劃、執行和控制, ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202307/3076680-20230719144557396-616589792.png) # 1. 結果集分頁 ## 1.1. 只有做過了排序,才有可能準確地從結果集中返回指定區間的記錄 ## 1.2.  ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...