18前端項目----Vue項目收尾優化|重要知識

收尾/知識點匯總

  • 項目收尾
    • 二級路由
    • 未登錄全局路由守衛
    • 路由獨享守衛
    • 圖片懶加載
    • 路由懶加載
    • 打包上線
  • 重要知識點匯總
    • 組件通信方式
      • 1. props
      • 2. 自定義事件
      • 3. 全局事件總線
      • 4. 訂閱與發布pubsub
      • 5. Vuex
      • 6. 插槽
    • sync修飾符
    • attrs和listeners屬性
    • children和parent屬性
    • mixin混入
    • 作用域插槽
      • 在vue3中

項目收尾

二級路由

個人中心采用二級路由

{
path: '/center',
component: Center,
//重定向
redirect:'/center/myorder',
// 添加元信息meta
meta: { show: true },
//二級路由組件children: [{//要么全寫'/center/myorder',要么全不寫'myorder'path: '/center/myorder',component:MyOrder,},{path: 'mygroup',component:MyGroup,},]
},

未登錄全局路由守衛

else{next();
}

未登錄:不能去交易相關(trade)、支付相關(pay/paysuccess)、不能去個人中心(center/……)

 let toPath = to.path;//字符串類型
if (toPath.indexOf('/trade') != -1 || toPath.indexOf('/pay') != -1 || toPath.indexOf('/center')) {next('/login');
}

但是情況:如果用戶未登錄,然后點擊個人中心,然后跳轉到登錄,登錄完應該回到最初點擊的個人中心頁面,而不是每次都是home主頁

  • 那么就需要先存儲點擊的路徑,然后再登錄完回到該路徑
  1. 修改為:next('/login?redirect='+toPath)
    toPath為/center/myorder

  2. 跳到登錄,此時路由為/login?redirect=%2Fcenter%2Fmyorder
    這是進行編碼后的,實際上編譯過來=/center/myorder

  3. 可見進入登錄頁添加了query參數
    那么在點擊登錄時需要判斷一下是否有query參數,有則進行該路由跳轉,沒有才都是回到home首頁

//Login組件內userLogin修改//存儲需要跳轉的路徑(query參數中),沒有則是/home
let toPath = this.$route.query.redirect||'/home';
this.$router.push(toPath);

路由獨享守衛

  1. 交易頁必須是從購物車頁點擊結算才能跳轉到,而不是可以直接在地址欄輸入就可以進入.( 支付頁也同理,必須是從交易頁pay而來)
{path: '/trade',component: Trade,// 添加元信息metameta: { show: true }, //獨享守衛:只管跳到trade路由的守衛beforeEnter: (to, from, next) => {if (from.path == '/shopcart') {next();} else {//從其他路由而來的,停留在當前next(false);}}
},

next(false);中斷當前的導航。如果瀏覽器的URL改變了(可能是用戶手動或者瀏覽器后退按鈕),那么URL地址會重置到from路由對應的地址

  1. 問題:
    當前頁是shopcart,然后再手動輸入trade仍然可以跳轉,但是不對,應該只有點擊<router-link class="sum-btn" to="/trade">結算</router-link>才能進入
  • 解決:
    在shopcart路由信息meta中加一個flag,初始值為false。當點擊去結算按鈕觸發事件,flag置為true。然后在trade的獨享路由守衛中判斷一下flag是否為true,當flag為true時,則是通過點擊去結算按鈕跳轉的,然后放行。
 {path: '/trade',
component: Trade,
// 添加元信息meta
meta: { show: true ,falg:false}, 
//獨享守衛:只管跳到trade路由的守衛
beforeEnter: (to, from, next) => {if (from.path == '/shopcart' && from.mate.falg == true) {//跳轉后需要將原來flag置為falsefrom.meta.flag = false;next();} else {next(false);}}
},

路由跳轉寫成編程式路由跳轉

 methods: {toTrade() {this.$route.meta.flag = true;this.$router.push('/trade');}}

圖片懶加載

當服務器數據沒有返回時,頁面上顯示默認圖。

主要目的是延遲加載圖片,直到用戶滾動到圖片所在的位置時才加載。

查看vue-lazyload官方文檔
main.js

//引入vue-lazyload插件
import VueLazyload from 'vue-lazyload';
import Karry from '@/assets/Karry.gif';
//use()實質上觸發install安裝插件的方法
Vue.use(VueLazyload, {//可添加配置//1. 懶加載默認圖:(圖片和json文件是默認對外暴露的loading: Karry,
});

組件中<img v-lazy="image.src" />

路由懶加載

當打包構建應用時,js包會變得非常大,影響頁面加載。如果我們能把不同路由對應的組件分割成不同的代碼塊,然后當路由被訪問的時候才加載對應組件,這樣就更加高效了。

原先是在router中配置路由信息前import組件,現在是在配置路由信息component時import。—路由懶加載

 {path:"/home",component:()=>import ('@/pages/Home'),meta:{show:true}
},

只有當用戶訪問該路徑時才執行箭頭函數,引入組件。使得路由跳轉更高效

打包上線

打包:npm run build
在這里插入圖片描述
打包后(js文件夾),代碼都是經過壓縮加密的,如果運行時報錯,輸出的錯誤信息無法準確得知是哪里的代碼報錯。
有了map就可以像未加密的代碼一樣,準確輸出是哪一行有錯
在這里插入圖片描述
map文件也可以去除
在vue.config.js配置productionSourceMap: false即可。

重要知識點匯總

組件通信方式

1. props

①(非函數) 父傳子:
- 在父組件中如:<Floor v-for="floor in floorList" :key="floor.id" :list="floor" />在子組件上綁定屬性list,傳遞floor數據,子組件props:['list']接收
- props接受數據方式:數組[]或對象{list:Array}、{list:Array,default:[]}
② (函數)子傳父

// 子組件
<template>
<!--3.value雙向數據綁定,渲染接收過來的數據-->
<!--4.綁定原生事件input事件觸發updateValue回調--><input :value="value" @input="updateValue">
</template><script>
export default {
//2.子組件通過props接收數據props: ['value'],methods: {updateValue(event) {//5.輸入數據:調用觸發父組件的自定義input事件并傳值給父組件this.$emit('input', event.target.value);}}
}
</script>// 父組件
<template><div><!--1. 父組件的 message 初始為空字符串通過 v-model 將message作為value傳遞給子組件子組件輸入框顯示空值--><child-component v-model="message"></child-component><p>{{ message }}</p></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent},data() {return {message: ''};}
}
</script>

📌 v-model常規寫法(手動綁定 value 和 input)

<input	:value="message" 
@input="message = $event.target.value"
/>

? v-model 簡寫(推薦)

javascript <input v-model="message" />

完全等價于上面的寫法! Vue 內部會自動將其編譯成 :value + @input 的形式。

實現:父組件 →(通過 props)→ 子組件 →(通過 $emit)→ 父組件 → 循環更新。

注意:在組件身上@綁定事件會被當做自定義事件,而不是原生DOM事件。如果想把自定義事件變為原生DOM事件加上修飾符.native
(那么該組件任何位置都會觸發click[假設綁定的是@click],原理其實是利用事件委派給該組件根標簽綁定了該原生DOM事件)

總結:原生DOM節點(如<input>、<button>)—原生事件,自定義組件—自定義事件

2. 自定義事件

$on$emit:綁定事件、觸發事件
上面例子用到$emit,但是沒有用到$on,因為@input底層就是

this.$on('input', (value) => {this.message = value
})) // Vue 內部自動完成

3. 全局事件總線

main.js中:Vue.prototype.$bus = this
📌 為什么將this根實例掛載到$bus身上?
將根實例賦值給 Vue.prototype.$bus,使其成為全局可訪問的事件總線。而且根實例的原型鏈上有$on$emit屬性,使其可訪問到。

4. 訂閱與發布pubsub

在react中運用較多

5. Vuex

6. 插槽

可以實現父子組件通信,一般是結構

sync修飾符

父組件給子組件傳值,而且給子組件綁定一個自定義事件(update:money)

<Child :money="money" @update:money="money = $event">

等價于

<Child :money.sync="money">

子組件props:[‘money’]接受,
第一種觸發寫法$emit('upate:money',money-100)
第二種$emit('update',money-100)

attrs和listeners屬性

  1. $attrs:
    屬于組件的一個屬性,可以獲取到父組件傳遞過來的props數據

注意:如果是通過props接受的數據,那么在$atters中是獲取不到的

  • 應用:封裝elementUI
    父組件:
//引入的子組件
//傳入靜態屬性:直接作為字符串寫入DOM
<HintButton type="success" icon="el-icon-delete" size="mini" title="提示按鈕"></HintButton>

子組件:

<template><div><!--a標簽的額外屬性title,可以鼠標懸停時,瀏覽器會自動顯示 title 的內容作為提示文本--><a :title="title"><!--那么el-button會顯示響應type屬性的樣式--><el-button :type="$attrs.type"></el-button></a></div>
</template>
<script>export default{name:"",props:["title"],mounted(){console.log(this.$attrs);//{type:'success',icon:'el-icon-delete',size:'mini'}}}
</script>

如果有大量屬性
可以<el-button v-bind="$attrs"></el-button>將所有接受的數據作為el-button的屬性。注意必須寫v-bind全稱,不能寫冒號

  1. $listener:
    在父組件中給HintButton綁定自定義事件,子組件內可以通過$listener獲取到該自定義事件
//觸發自定義事件
<el-button v-on="$listener"></el-button>

同樣v-on不能簡寫為@

children和parent屬性

  1. $children

在父組件:

<!--ref:可以獲取節點(組件標簽)-->
<Son ref = "son"/>
<Girl ref="girl"/>

this.$refs.son就是子組件實例:
在這里插入圖片描述

那么就可以通過ref獲取到子組件里的數據

$children是組件的一個屬性,可以獲取當前組件的所有的子組件(Son和Girl)
打印:this.$children===>[VueComponent,VueComponent]
注意:該數組是無序的,this.$children[0]不一定是son

  1. $parent
    在某個子組件內可以通過$parent獲取到該組件的父組件,那么就可以獲取到父組件的數據/方法

mixin混入

邏輯復用:mixin,可以將多個組件共用的邏輯、數據、方法等提取到一個單獨的對象中,然后在多個組件中混入使用

可以將mixin單獨出一個模塊然后對外暴露,在組件中直接import使用

// 定義一個 mixin
const myMixin = {data() {return {message: 'Hello from mixin!'}},methods: {greet() {console.log(this.message);}}
};// 在組件中使用 mixin
export default {mixins: [myMixin],created() {this.greet(); // 輸出: Hello from mixin!}
};

作用域插槽

elementUI主要就是作用域插槽

父組件:

<!--父組件向List子組件傳遞 todos 數組-->
<List :todos="todos"><template slot-scope = "todo"><span :style="color:todo.todo.isComplete?'green':'red'}">{{todo.todo.text}}</span></template>
</List><!---->
<script>
export default{data(){return {todos:[{id: 1, text: 'AA', isComplete:false},{id: 2, text: 'BB', isComplete:true},{id: 3, text: 'CC', isComplete:false},]}}
}</script>

子組件:

<ul><li v-for="(item,index) in todos" :key="index"><!--每個 item 通過 slot 回傳給父組件 --><slot :todo="item"></slot></li>
</ul><!--script中:List組件接收todos-->
props:['todos']
  1. 核心概念:
  • 子組件通過 <slot> 暴露數據給父組件( :todo=“item”)
  • 父組件通過 slot-scope = “todo” 接收子組件暴露的數據命名為todo
  1. 關鍵點:
    (1)slot-scope 的命名
    父組件中 slot-scope="todo"todo 是臨時變量名,可以任意命名(如 scope、data)
    實際接收的是子組件 <slot :todo="item">:todo 綁定的數據
    (2)數據結構
    子組件傳遞給slot-scope變量todo的數據結構:
{ todo: { id: 1, text: 'AA', isComplete: false } }

因此父組件中訪問的是 todo.todo.text(第一個 todo 是 slot-scope 變量第二個 todo 是子組件綁定的屬性名[:todo=“item”])

總結:子組件的數據來源于父組件,子組件向父組件傳遞一個對象,父組件自定義子組件內部的部分渲染邏輯

在vue3中

在 Vue 3 中,slot-scope 被廢棄,改用 v-slot:

<List :todos="todos"><template v-slot="todo"><span :style="{color: todo.todo.isComplete ? 'green' : 'red'}">{{ todo.todo.text }}</span></template>
</List>

或解構寫法:

<template v-slot="{ todo }">  <!-- 解構 --><span :style="{color: todo.isComplete ? 'green' : 'red'}">{{ todo.text }}</span>
</template>

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

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

相關文章

【Linux】基礎指令(Ⅱ)

目錄 1. mv指令 2. cat指令 3.echo指令 補&#xff1a;輸出重定向 4. more指令 5. less指令 6. head指令和tail指令 7.date指令 時間戳&#xff1a; 8. cal指令 9. alias指令 10.grep指令 1. mv指令 語法&#xff1a;mv [選項]... 源文件/目錄 目標文件/目錄 …

docker及docker-compose安裝及使用

docker compose &#x1f517;官網地址 一、為什么要使用docker compose 1. 簡化管理 ? 通過一個 YAML 文件定義和管理多容器應用。 ? 簡化服務間的編排與協調&#xff0c;方便環境的管理與復制。 2. 提升協作效率 ? 配置文件易于共享&#xff0c;便于開發、運維等團隊協…

JVM學習專題(二)內存模型深度剖析

目錄 1.JVM結構體系 ?編輯 2.跨平臺特性 3.JVM整體結構及內存模型 1.棧內存 1、棧幀&#xff1a; 1.局部變量表 2.操作數棧 3.動態鏈接 4.方法出口 2、創建對象 2.程序計數器&#xff1a; 3.方法區 ?4.堆 5.本地方法區 6.總結 1.JVM結構體系 JDK、JRE 和 JVM…

Flink之Table API

Apache Flink 的 Table API 是 Flink 提供的一種高級抽象&#xff0c;用于以聲明式方式處理批處理和流處理數據。它是基于關系模型的 API&#xff0c;用戶可以像編寫 SQL 一樣&#xff0c;以簡潔、類型安全的方式編寫數據處理邏輯。 一、基本概念 1. 什么是 Table API&#xf…

基于Vue3.0的高德地圖api教程005:實現繪制線并編輯功能

文章目錄 6、繪制多段線6.1 繪制多段線6.1.1 開啟繪制功能6.1.2 雙擊完成繪制6.1.3 保存到數據庫6.2 修改多段線6.2.1 點擊線,進入編輯模式6.2.2 編輯線6.3 完整代碼6、繪制多段線 6.1 繪制多段線 6.1.1 開啟繪制功能 實現代碼: const changeSwitchDrawPolyline = ()=>…

“redis 目標計算機積極拒絕,無法連接” 解決方法,每次開機啟動redis

如果遇到以上問題 先打開“服務” 找到App Readiness 右擊-啟動 以管理員身份運行cmd&#xff0c;跳轉到 安裝redis的目錄 運行&#xff1a;redis-server.exe redis.windows.conf 以管理員身份打開另一cmd窗口&#xff0c;跳轉到安裝redis的目錄 運行&#xff1a;redis-…

Java 大視界——Java 大數據在智慧交通智能停車誘導系統中的數據融合與實時更新

面對城市停車資源錯配導致的30%以上交通擁堵問題&#xff0c;本文以某新一線城市智慧交通項目為藍本&#xff0c;深度解析Java大數據技術如何實現多源停車數據融合、動態路徑規劃與誘導策略優化。通過構建“感知-計算-決策”全鏈路系統&#xff0c;實現車位狀態更新延遲<200…

牛客周賽 Round 92(再現京津冀藍橋杯???)

1. 小紅的簽到題 現在小紅希望你寫出一個長度為 nnn 的、使用了下劃線命名法命名的變量。為了顯出特征&#xff0c;請保證該變量至少由兩個單詞組成。 輸入描述: 輸入一個正整數 n(3≦n≦100)&#xff0c;代表需要構造的變量長度。 輸出描述: 輸出一個長度為 n 的字符串&#x…

2025-05-11 Unity 網絡基礎11——UnityWebRequest

文章目錄 1 UnityWebRequest 介紹2 搭建 HTTP 服務器3 常用操作3.1下載資源3.1.1 下載文本3.1.2 下載圖片3.1.3 下載 AB 包 3.2 上傳資源3.2.1 上傳數據類3.2.2 POST 上傳3.3.3 PUT 上傳 4 自定義操作4.1 下載資源4.1.1 Unity 內置 Handler4.1.2 自定義 Handler 4.2 上傳資源4.…

GitHub 趨勢日報 (2025年05月09日)

本日報由 TrendForge 系統生成 https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日整體趨勢 Top 10 排名項目名稱項目描述今日獲星總星數語言1voideditor/void? 1879? 15214TypeScript2ruanyf/weekly科技愛好者周刊&…

.NET MAUI 基礎知識

文章目錄 什么是 .NET MAUI&#xff1f;MAUI的核心特點與Xamarin.Forms的區別 開發環境搭建安裝Visual Studio 2022安裝必要組件配置Android開發環境配置iOS開發環境驗證安裝 創建第一個MAUI應用創建新項目MAUI項目結構解析理解關鍵文件運行應用程序簡單修改示例使用熱重載 MAU…

卷積神經網絡全連接層詳解:特征匯總、FCN替代與性能影響分析

【內容摘要】 本文聚焦卷積神經網絡&#xff08;CNN&#xff09;的全連接層&#xff0c;詳細介紹其將二維特征圖轉化為一維向量的過程&#xff0c;闡述全卷積網絡&#xff08;FCN&#xff09;如何通過轉置卷積替代全連接層以實現像素級分類&#xff0c;并分析全連接層對圖像分類…

在C++中進行套接字編程時,主要使用以下頭文件

目錄 一.基本套接字頭文件<sys/socket.h><netinet/in.h><arpa/inet.h><unistd.h><netdb.h> 二. 完整示例頭文件包含三. 注意事項 在C中進行套接字編程時&#xff0c;主要使用以下頭文件&#xff1a; 一.基本套接字頭文件 <sys/socket.h>…

【Linux網絡】HTTP

應用層協議 HTTP 前置知識 我們上網的所有行為都是在做IO&#xff0c;&#xff08;我的數據給別人&#xff0c;別人的數據給我&#xff09;圖片。視頻&#xff0c;音頻&#xff0c;文本等等&#xff0c;都是資源答復前需要先確認我要的資源在哪臺服務器上&#xff08;網絡IP&…

JAVA異常體系

在 Java 里&#xff0c;異常體系是其錯誤處理機制的核心內容&#xff0c;它能夠幫助開發者有效應對程序運行時出現的各種意外狀況。 異常體系的基本架構 它主要包含兩個重要分支&#xff1a; Error&#xff08;錯誤&#xff09;&#xff1a;這類異常是程序自身無法處理的嚴重…

vue 去掉右邊table的下拉條與下面的白色邊框并補充滿

::v-deep table {width: 100% !important; } ::v-deep .el-table::after, .el-table::before {display: none !important; }/* 隱藏滾動條但保留滾動功能 */ ::v-deep .el-table__body-wrapper::-webkit-scrollbar {width: 0 !important;height: 0 !important; }::v-deep .el-t…

uniapp+vue3+uview來開發我們的項目

前言&#xff1a; 就像我們vue的web的框架element、iview等一樣&#xff0c;我們的uni-app開發也有適合的他的框架&#xff0c;除了他本身的擴展組件以外&#xff0c;第三方好用的就是就是uview了。 實現效果&#xff1a; 官網信息&#xff1a; vue2版本&#xff1a;uview-ui …

數據倉庫:企業數據管理的核心引擎

一、數據倉庫的由來 數據倉庫&#xff08;Data Warehouse, DW&#xff09;概念的誕生源于企業對數據價值的深度挖掘需求。在1980年代&#xff0c;隨著OLTP&#xff08;聯機事務處理&#xff09;系統在企業中的普及&#xff0c;傳統關系型數據庫在處理海量數據分析時顯露出明顯瓶…

YOLOv12模型部署(保姆級)

一、下載YOLOv12源碼 1.通過網盤分享的文件&#xff1a;YOLOv12 鏈接: https://pan.baidu.com/s/12-DEbWx1Gu7dC-ehIIaKtQ 提取碼: sgqy &#xff08;網盤下載&#xff09; 2.進入github克隆YOLOv12源碼包 二、安裝Anaconda/pycharm 點擊獲取官網鏈接(anaconda) 點擊獲取…

一篇解決Redis:持久化機制

目錄 認識持久化 持久化方案 RDB&#xff08;Redis DataBase&#xff09; 手動觸發 自動觸發 小結 AOF(Append-Only File) AOF緩沖區刷新機制 AOF重寫機制 AOF重寫流程 ?編輯 混合持久化 認識持久化 我們都知道Mysql有四大特征&#xff0c;原子性&#xff0c;持久…