尚硅谷-硅谷甄選項目記錄

一、Vue3

1 基礎配置
1.1 @ 路徑別名

vite.config.ts

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'// 引入path,node提供的模塊,可以獲取文件或文件夾的路徑
import path from 'path'export default defineConfig({plugins: [vue()],resolve: {alias: {'@': path.resolve('./src')}}
})

tsconfig.json

{"compilerOptions": {// 配置路徑別名"baseUrl": "./","paths": {"@/*": ["src/*"]}}
}
1.2 SCSS 全局變量

vite.config.ts

export default defineConfig({// scss全局變量一個配置css: {preprocessorOptions: {scss: {javascriptEnabled: true,additionalData: '@import "./src/styles/variable.scss";',},},},
})
1.3 SVG 使用方式

vite.config.ts

// 配置svg:引入插件
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'export default defineConfig({plugins: [createSvgIconsPlugin({// 配置svg:指定svg資源目錄iconDirs: [path.resolve(process.cwd(), 'src/asstes/icons')],// 配置svg:指定svg資源namesymbolId: 'icon-[dir]-[name]'})]
}

main.ts

// svg插件需要配置代碼
import 'virtual:svg-icons-register'

使用

<svg style="width:30px; height:30px"><use xlink:href="#icon-xxx" fill="red"></use>
</svg>
1.4 SVG 全局組件
<svg-icon name="home" color="pihk"></svg-icon>
<!-- @/components/SvgIcon/index.vue --><template><svg :style="{width, height}"><use :xlink:href="prefix + name"></use></svg>
</template><script setup>
import { ref } from 'vue';
const prefix = ref('#icon-')
defineProps({// 名字name: String,// 顏色color:{type: String,defaule: ''},// 寬高width: {type: String,default: '20px'},height: {type: String,default: '20px'}
})
</script>
  • 1、單獨引入注冊

    main.ts

    import SvgIcon from '@/components/SvgIcon/index.vue'
    app.components('SvgIcon', SvgIcon)
    
  • 2、插件注冊,引入components下組件遍歷注冊

    @/components/index.ts

    import SvgIcon from './SvgIcon/index.vue'const allGloablComponent = { SvgIcon }
    export default{install(app){Object.keys(allGloablComponent).forEach(key => {app.component(key, allGloablComponent[key])})}
    }
    

    main.ts

    //引入自定義插件對象:注冊整個項目全局組件
    import gloalComponent from '@/components'
    //安裝自定義插件
    app.use(gloalComponent)
    
1.5 EL 全局圖標

@/components/index.ts

// 引入全部elmentPlus的圖標
import * as ElementPlusIconsVue from '@element-plus/icons-vue'const allGloablComponent = { SvgIcon }
export default{install(app){// 將element-plus的圖標全部注冊for (const [key, component] of Object.entries(ElementPlusIconsVue)) {app.component(key, component)}}
}

main.ts

// 引入自定義插件對象:注冊整個項目全局組件
import gloalComponent from '@/components'
// 安裝自定義插件
app.use(gloalComponent)

使用方式

<el-icon> </Edit> </el-icon><el-icon> <component is="Edit"> </el-icon>
2 vue-router路由
2.1 路由跳轉
  • 編程式導航

    <script setup lang="ts">import { useRouter } from 'vue-router';const $router = useRouter()const toRoutes = (path) => {$router.push(path)}
    </script>
    
2.2 路由過度
<template><router-view v-slot="{ Component }"><transition name="fade"><component :is="Component" /></transition></router-view>
</template><script setup lang="ts"> </script><style lang="scss" scoped>
// 此為vue3寫法,與vue2類名略有不同,根據需求自定義過渡動畫
.fade-enter-from {opacity: 0;transform: scale(0);
}.fade-enter-active {transition: all .3s;
}.fade-enter-to {opacity: 1;transform: scale(1);
}
</style>
2.3 路由鑒權

項目當中的各個路由在什么條件下可以訪問,什么條件下不可以訪問

2.3 element-plus 組件
2.3.1 Menu 菜單折疊圖標

問題:在使用 el-menu 菜單的折疊功能時,因為自定義路由和Menu組件,導致圖標沒有正常顯示

解決:將圖標組件移出 template 外邊

<el-menu-item ><template #title><el-icon> <component :is="meta.icon"></component> </el-icon><span>{{item.children[0].meta.title}}</span></template>
</el-menu-item>
<el-menu-item ><el-icon> <component :is="item.meta.icon"></component> </el-icon><template #title><span>{{item.meta.title}}</span></template>
</el-menu-item>
2.3.2 Menu刷新默認菜單

問題:使用 el-menu 菜單在頁面刷新時,已展開的菜單會關閉,

解決:配置 el-menudefault-active 屬性,通過 router 將頁面路徑賦值給他

備注: route 獲取頁面路徑, router 頁面跳轉,現 $route 以改為宏函數,可以直接在 template 使用,無需引入,若想在 script 中使用,還是得引入

<el-menu :default-active="$route.path"></el-menu>import { useRoute } from 'vue-router'
$route = useRoute()
3 父子組件交互
3.1 defineEmits

vue3 內置 defineEmitsdefinProps 可無需引入直接使用

// son.vue
let $emit = defineEmits(['fn1', 'fn2', ...])const updata = () => {$emit('fn1', { name: '張三', age: '23' })
}// father.vue
<son @fn1="fn1"></son>const fn1 = (name='', age='') => { ... }
3.2 definProps
// father.vue
<son :name="name" :data="data"></son>// son.vue
let props = defineProps({name: {type: String,default: ''},data:{type:Object,default:() => ({ ... })}
})// 或defineProps({name:{type:String,default:''},data:{type:Object,default:() => ({ ... })}
})
3.3 ref
// father.vue
<son ref="son"/>let son = ref(null)
const fn = () => {son.value.fnSon
}// son.vue
const fnSon = () => {// ...
}
defineExpose({ fnSon })

二、TypeScript

1 類型定義
  • @/api/user/index.js

    import request from '@/utils/request'import type {loginFormData,loginResponseData,userInfoReponseData,
    } from './type'enum API {// 登錄LOGIN_URL = '/admin/acl/index/login',// 用戶信息USERINFO_URL = '/admin/acl/index/info',// 退出登錄LOGOUT_URL = '/admin/acl/index/logout',
    }// 登錄接口
    export const reqLogin = (data: loginFormData) => request.post<any, loginResponseData>(API.LOGIN_URL, data)// 獲取用戶信息
    export const reqUserInfo = () =>request.get<any, userInfoReponseData>(API.USERINFO_URL)// 退出登錄
    export const reqLogout = () => request.post<any, any>(API.LOGOUT_URL)
    
  • @/api/user/type.ts

    // 請求攜帶參數類型
    export interface loginFormData {username: string,password: string
    }// 基礎接口返回數據類型
    export interface Response {code: number|string,message?: string,ok?: boolean
    }// 登錄接口 返回數據類型
    export interface loginResponseData extends Response {data: string
    }// 用戶信息接口 返回數據類型
    export interface userInfoReponseData extends Response {data: {routes: string[]buttons: string[]roles: string[]name: stringavatar: string}
    }
    

三、JavaScrpt

1 對象數組過濾對象
let objectsArray = [  { a: 1, b: 'one' },  { a: 2, b: 'two' },  { a: 3, b: 'three' },  { a: 2, b: 'anotherTwo' }
];  let valueToRemove = 2; // 這是你想從對象中過濾掉的屬性 a 的值  objectsArray = objectsArray.filter(obj => obj.a !== valueToRemove);  console.log(objectsArray);  
// 輸出: [ { a: 1, b: 'one' }, { a: 3, b: 'three' } ]
2 對象數組的對象的屬性名修改
imgList = res.data.map(item => {return{name: item.imgName,url: item.imgUrl}
})
3 Object.assign

Object.assign() 將所有可枚舉的屬性的值從一個或多個源對象復制到目標對象(第一個參數),具有相同屬性的話,會按順序進行覆蓋,并返回目標對象

let a = reactive({ x: 1, y: 2 })let b = { y: 3, z: 4 }let c = { z: 3 }let newA = Object.assign(a, b, c)   console.log(a, a===newA) 	// { x: 1, y: 3, z: 3 }  true// 在vue3中,如使用解構賦值的方法,會產生新的對象,會導致失去數據代理
a = {...a, ...b, ...c}
4 request.ts

@/utils/request.ts

import axios from 'axios'
import { ElMessage } from 'element-plus'
//引入用戶相關的倉庫
import useUserStore from '@/store/modules/user'const request = axios.create({//基礎路徑(在項目根目錄下設置)baseURL: import.meta.env.VITE_APP_BASE_API,//超時的時間的設置timeout: 5000,
})// 請求攔截器
request.interceptors.request.use((config) => {if(useUserStore().token){config.headers.token = useUserStore().token}return config
})// 響應攔截器
request.interceptors.response.use((response) => {// 成功回調,簡化數據return response.data},(error) => {// 失敗回調:處理http網絡錯誤let message = ''// http狀態碼const status = error.response.statusswitch (status) {case 401:message = 'TOKEN過期'breakcase 403:message = '無權訪問'breakcase 404:message = '請求地址錯誤'breakcase 500:message = '服務器出現問題'breakdefault:message = '網絡出現問題'break}//提示錯誤信息ElMessage({type: 'error',message,})return Promise.reject(error)},
)export default request

四、業務實現

  • 左側菜單縮放通過倉庫變量(true/false)進行管理

  • 刷新:通過v-ifnextTick倉庫 實現刷新(銷毀重建)

  • 全屏狀態:通過document.fullscreenElement設置全屏狀態

  • 自動刷新:window.location.reload(),用戶修改自身賬號或密碼之后,調用方法自動刷新

  • 展示角色權限:例,后端返回全部權限,其中該角色擁有的權限的select:true,修改時需要把新的權限對象給后端(父級的id和權限值 + 子級的id和權限值 + …), <el-tree> 提供獲取選中的節點的數組,修改完調用刷新方法

    一級二級三級四級
    1、全部數據
    1.1、權限管理
    1.1.1、用戶管理
    1.1.1.1、添加用戶
    1.1.1.2、刪除用戶
    1.1.1.3、修改用戶
    1.1.2、菜單管理
    1.2、商品管理
    {"id": 1,"name": "全部數據","level": 1,"children": [{"id": 7,"name": "權限管理","level": 2,"children": [{"id": 8,"name": "用戶管理","level": 3,"children": [{"id": 11,"name": "添加用戶","level": 4,"children": [],"select": false},{"id": 12,"name": "刪除用戶","level": 4,"children": [],"select": false}],"select": false},{"id": 10,"name": "菜單管理","level": 3,"children": [],"select": false}],"select": false}],"select": true
    }
    
    const setPermisstion = async (id) => {let result = await reqAllMenuList(id);if (result.code == 200) {// 全部權限menuArr.value = result.data;// 擁有的權限selectArr.value = filterSelectArr(menuArr.value, []);}
    }const filterSelectArr = (allData, initArr) => {allData.forEach((item) => {// 如最后一級的權限的是第四級(遍歷完其最低級的權限,即可通過<el-tree>自動判斷)if (item.select && item.level == 4) {initArr.push(item.id);}if (item.children && item.children.length > 0) {filterSelectArr(item.children, initArr);}})return initArr;
    }
    

五、備注

  • 在平時寫代碼的時候,為實現某個功能,感覺自己寫的代碼很冗余,可以試試將代碼交于 ai ,讓其優化一下,說不定 JS官方 已經提供了便捷語法糖(如:ES6+新增的語法糖),或者 AI 有更加便捷的實現思路

  • 背景圖片

    .contaiter{background: url('@/xxx/xxx.jpg') no-repeat;backgorund-size: cover;
    }
    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78857.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78857.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78857.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ThinkPHP5 case when的使用

主表的類型不同&#xff0c;需要連接查詢不同的表時&#xff0c;可以使用case when 在主表(上面的表中)的模型里面&#xff0c;寫如下代碼來獲取列表&#xff1a; $res $this->alias("p")->field([p.*,"CASE WHEN p.pd_ticket_type 1 THEN (select s.s…

Android 10.0 SharedPreferences in credential encrypted storage are not avai

1.前言 在10.0的系統rom定制化開發中,在開機的過程中,由于某些應用在開機解鎖階段就開始訪問查詢短信和聯系人等功能,所以 會出現拋異常的情況出現,接下來分析下相關的情況,然后來解決這些問題 2.SharedPreferences in credential encrypted storage are not available …

LeetCode[102]二叉樹的層序遍歷

思路&#xff1a; 題目描述從左到右一層一層的進行遍歷&#xff0c;就遍歷二叉樹的這種題我更喜歡用遞歸來做&#xff0c; 我使用java來做的&#xff0c;結果集是兩個List集合&#xff0c;那么我們是不是應該每到新的一層就給這個結果集添加一個內部的List&#xff0c;那么怎么…

二種MVCC對比分析

文章目錄 前言MVCCInnodb的MVCC版本鏈回滾與提交可見性判斷 Oracle的MVCC版本鏈 PostgreSQL的MVCCMVCC實現可見性判斷特點 前言 ? MVCC&#xff08;多版本并發控制&#xff0c;Multi-Version Concurrency Control&#xff09;是一種數據庫管理系統&#xff08;DBMS&#x…

FAST-LIO筆記

1.FAST-LIO FAST-LIO 是一個計算效率高、魯棒性強的激光-慣性里程計系統。該系統通過緊耦合的迭代擴展卡爾曼濾波器&#xff08;IEKF&#xff09;將激光雷達特征點與IMU數據進行融合&#xff0c;使其在快速運動、噪聲較大或環境復雜、存在退化的情況下仍能實現穩定的導航。 1…

C++并發編程完全指南:從基礎到實踐

在當今多核處理器普及的時代&#xff0c;充分利用硬件并發能力已成為高性能編程的關鍵。C11引入的現代并發編程支持使得開發者能夠以標準化、可移植的方式編寫多線程程序。本文將全面介紹C并發編程的各個方面&#xff0c;從基礎概念到實際應用&#xff0c;幫助您掌握這一重要技…

如何使用docker配置ros-noetic環境并使用rviz,gazebo

參考鏈接&#xff1a;【Ubuntu】Docker中配置ROS并可視化Rviz及Gazebo_docker ros-CSDN博客 前言&#xff1a; 其實這個東西是相當必要的&#xff0c;因為我們有時候需要在一臺電腦上跑好幾個項目&#xff0c;每個項目都有不同的依賴&#xff0c;這些依賴沖突搞得人頭皮發麻&…

使用 Java 11 的 HttpClient 處理 RESTful Web 服務

在現代 Web 開發中,與 RESTful Web 服務交互是一項核心任務。Java 作為一種廣泛使用的編程語言,提供了多種處理 HTTP 請求的方法。在 Java 11 之前,開發者通常使用 HttpURLConnection 或第三方庫(如 Apache HttpClient)。然而,這些方法要么過于底層,要么需要額外依賴。J…

JVM——垃圾回收

垃圾回收 在Java虛擬機&#xff08;JVM&#xff09;的自動內存管理中&#xff0c;垃圾回收&#xff08;Garbage Collection, GC&#xff09;是其核心組件之一。它負責回收堆內存中不再使用的對象所占用的內存空間&#xff0c;以供新對象的分配使用。下面我們將深入探討JVM中的…

經典密碼學算法實現

# AES-128 加密算法的規范實現&#xff08;不使用外部庫&#xff09; # ECB模式S_BOX [0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B,0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0x…

追蹤大型語言模型的思想(下)(來自針對Claude的分析)

多步推理 正如我們上面所討論的&#xff0c;語言模型回答復雜問題的一種方式就是簡單地記住答案。例如&#xff0c;如果問“達拉斯所在州的首府是哪里&#xff1f;”&#xff0c;一個“機械”的模型可以直接學會輸出“奧斯汀”&#xff0c;而無需知道德克薩斯州&#xff0c;達拉…

【Hive入門】Hive增量數據導入:基于Sqoop的關系型數據庫同步方案深度解析

目錄 引言 1 增量數據導入概述 1.1 增量同步與全量同步對比 1.2 增量同步技術選型矩陣 2 Sqoop增量導入原理剖析 2.1 Sqoop架構設計 2.2 增量同步核心機制 3 Sqoop增量模式詳解 3.1 append模式&#xff08;基于自增ID&#xff09; 3.2 lastmodified模式&#xff08;基…

[Windows] 藍山看圖王 1.0.3.21021

[Windows] 藍山看圖王 鏈接&#xff1a;https://pan.xunlei.com/s/VOPejo0dRLFd38dbpR7XA6djA1?pwddq9v# 由藍山軟件出品的一款免費高清看圖軟件&#xff0c;支持快速查看高清大圖&#xff0c;支持大部分市面圖片格式。 軟件特點 1、體積小巧&#xff0c;圖像顯示效果清晰…

通配符 DNS 記錄:應用場景與相關風險

隨著組織的互聯網基礎設施不斷擴展&#xff0c;其對配置、設置和決策的需求也隨之增加——從選擇一個可靠的名稱服務器&#xff0c;到確定合適的 DNS 記錄類型以及設置合適的 TTL&#xff08;生存時間&#xff09;值。其中一項關鍵決策就是是否要創建通配符 DNS 記錄&#xff0…

快速上手知識圖譜開源庫pykeen教程指南(一)

文章目錄 1 前情提要1.1 AmpliGraph 和 PyKEEN 對比介紹1.2 TransE、ConvE、RotatE幾款模型的差異 2 直接上案例2.1 數據載入&#xff1a;TriplesFactory2.2 模型訓練2.2.1 訓練信息2.2.2 TransE模型可以降維實體、關系的關系 2.3 模型保存與加載、評估2.3.1 保存與模型加載2.3…

飛搭系列 | 獲取彈窗數據,輕松實現回填

前言 飛搭低代碼平臺&#xff08;FeiDa&#xff0c;以下簡稱“飛搭”&#xff09;&#xff0c;為企業提供在線化、靈活的業務應用構建工具&#xff0c;支持高低代碼融合&#xff0c;助力企業低門檻、高效率和低成本地快速應對市場變化&#xff0c;加速復雜業務場景落地。 概要…

Linux如何安裝AppImage程序

Linux如何安裝AppImage程序 文章目錄 Linux如何安裝AppImage程序 在 Linux 中&#xff0c;.AppImage 是一種便攜式的應用程序格式&#xff0c;無需安裝即可運行。 1.賦予該文件可執行權限 可以使用下列命令&#xff0c;賦予可執行權限 # 舉個例子 chmod x /path/to/MyApp.App…

云硬盤的原理

云硬盤是云計算環境中的一種存儲服務&#xff0c;其原理主要涉及數據存儲、數據冗余與容錯、性能優化以及數據安全等方面&#xff0c;以下是具體介紹&#xff1a; 數據存儲 邏輯卷管理&#xff1a;云硬盤通常會將物理存儲設備劃分為多個邏輯卷&#xff0c;每個邏輯卷可以獨立地…

使用 pgrep 殺掉所有指定進程

使用 pgrep 殺掉所有指定進程 pgrep 是一個查找進程 ID 的工具&#xff0c;結合 pkill 或 kill 命令可以方便地終止指定進程。以下是幾種方法&#xff1a; 方法1&#xff1a;使用 pkill&#xff08;最簡單&#xff09; pkill 進程名例如殺掉所有名為 “firefox” 的進程&…

堆排序(算法題)

#include <bits/stdc.h> using namespace std;const int N 100010; // 堆數組的最大容量 int h[N], s; // h[]存儲堆元素&#xff0c;s表示當前堆的大小// 下沉操作&#xff1a;調整以i為根的子樹&#xff0c;維護小頂堆性質 void down(int i) {int t i; /…