復習Vue136~180

1.使用create-vue創建項目

npm init vue@latest

項目目錄和關鍵文件:
new Vue() 創建一個應用實例 => createApp()、createRouter() createStore() 、將創建實例進行了封裝,保證每個實例的獨立封閉性。
禁用vue2的插件vuter
使用vue3的插件volar
script寫在最前面
不再要求唯一根元素
加上setup允許在script中直接編寫組合式API

將創建的實例往id為app的盒子上掛載
createApp(App).mount('#app')
2.setup選項
  • setup應寫在beforeCreate()之前
  • setup函數中,獲取不到this (this是undefined)
  • 數據 和 函數,需要在 setup 最后 return,才能模板中應用
<script>
export default {setup () {// 數據const message = 'hello Vue3'// 函數const logMessage = () => {console.log(message)}return {message,logMessage}},
}
</script>
<template><div>{{ message }}</div><button @click="logMessage">按鈕</button>
</template>

通過 setup 語法糖簡化代碼

<script setup>
const message = 'this is a message'
const logMessage = () => {console.log(message)
}
</script>
這樣就不用return了
3.reactive和ref函數

reactive作用:接收對象類型傳參并返回一個響應式的對象
對象類型

<script setup>
import {reactive} from 'vue'
const state = reactive({count:100
})
const addCount = () => {state.count++
}</script><template><div><div>{{ state.count }}</div><button @click="addCount">+1</button></div>
</template>

ref: 接收簡單類型 或 復雜類型,返回一個響應式的對象
本質:是在原有傳入數據的基礎上,外層包了一層對象,包成了復雜類型底層,包成復雜類型之后,再借助 reactive 實現的響應式。
注意點:

  1. 腳本中訪問數據,需要通過 .value
  2. 在template中,.value不需要加 (幫我們扒了一層)

簡單類型

<script setup>
import { ref } from 'vue'
const name = ref(0)
const setName = () => {name.value++
}
</script><template><div><div>{{ name }}</div><button @click="setName">+1</button></div>
</template>

推薦:以后聲明數據,統一用 ref => 統一了編碼規范

4.computed
const 計算屬性 = computed(() => {return 計算返回的結果
})
<script setup>
import { computed, ref } from 'vue'// 聲明數據
const list = ref([1, 2, 3, 4, 5, 6, 7, 8])// 基于list派生一個計算屬性,從list中過濾出 > 2
const computedList = computed(() => {return list.value.filter(item => item > 2)
})const computedList2 = computed(() => {return list.value.filter(item => item > 3)
})//這時候就不用return 
const AddNumber = () => {list.value.push(999)
}
// 定義一個修改數組的方法
const addFn = () => {list.value.push(666)
}
</script><template><div><div>原始數據: {{ list }}</div><div>計算后的數據: {{computedList2 }}</div><div>原始數據: {{ list }}</div><div>計算后的數據: {{ computedList }}</div><button @click="AddNumber" type="button">修改2/</button><button @click="addFn" type="button">修改</button></div>
</template>
5.watch函數
  1. 監視單個數據的變化
// watch(ref對象, (newValue, oldValue) => { ... })watch(count, (newValue, oldValue) => {console.log(newValue, oldValue)
})
  1. 監視多個數據的變化
// watch([ref對象1, ref對象2], (newArr, oldArr) => { ... })watch([count, nickname], (newArr, oldArr) => {console.log(newArr, oldArr)
})
  1. immediate 立刻執行(一進頁面立刻觸發)
watch(count, (newValue, oldValue) => {console.log(newValue, oldValue)
}, {immediate: true
})
  1. deep 深度監視, 默認 watch 進行的是 淺層監視
    const ref1 = ref(簡單類型) 可以直接監視
    const ref2 = ref(復雜類型) 監視不到復雜類型內部數據的變化
deep 深度監視
watch(userInfo, (newValue) => {console.log(newValue)
}, {deep: true
})
  1. 對于對象中的單個屬性,進行精確監視
只監視age不監視name
watch(() => userInfo.value.age, (newValue, oldValue) => {console.log(newValue, oldValue)
})
6.生命周期函數

請添加圖片描述

寫成函數的調用方式,可以調用多次,并不會沖突,而是按照順序依次執行
onMounted(() => {console.log('mounted生命周期函數 - 邏輯2')
})
7.組合式下的父子通信

父傳子
子組件中
注意:由于寫了 setup,所以無法直接配置 props 選項
所以:此處需要借助于 “編譯器宏” 函數接收子組件傳遞的數據

<template><!-- 對于props傳遞過來的數據,模板中可以直接使用 --><div class="son">我是子組件 - {{ car }} - {{ money }}<button @click="buy">花錢</button></div>
</template>
父組件
<template><div><h3>父組件 - {{ money }}<button @click="getMoney">掙錢</button></h3><!-- 給子組件,添加屬性的方式傳值 --><SonCom car="寶馬車" :money="money"></SonCom></div>
</template>

子傳父

子組件
const emit = defineEmits(['changeMoney'])
const buy = () => {emit('changeMoney', 5)
}
<template><!-- 對于props傳遞過來的數據,模板中可以直接使用 --><div class="son">我是子組件 - {{ car }} - {{ money }}<button @click="buy">花錢</button></div>
</template>父組件
const changeFn = (newMoney) => {money.value = newMoney
}
<template><div><h3>父組件 - {{ money }}<button @click="getMoney">掙錢</button></h3><!-- 給子組件,添加屬性的方式傳值 --><SonCom@changeMoney="changeFn"car="寶馬車":money="money"></SonCom></div>
</template>
8.模板引用

模板引用(可以獲取dom,也可以獲取組件)

  1. 調用ref函數,生成一個ref對象
  2. 通過ref標識,進行綁定
  3. 通過ref對象.value即可訪問到綁定的元素(必須渲染完成后,才能拿到)

模板引用的時機:組件掛載完畢
defineExpose編譯宏的作用:顯示暴露組件內部的屬性和方法

<script setup>
import TestCom from '@/components/test-com.vue'
import { onMounted, ref } from 'vue'const inp = ref(null)// 生命周期鉤子 onMounted
onMounted(() => {// console.log(inp.value)// inp.value.focus()
})
const clickFn = () => {inp.value.focus()
}// --------------------------------------
const testRef = ref(null)
const getCom = () => {console.log(testRef.value.count)testRef.value.sayHi()
}</script><template><div><input ref="inp" type="text"><button @click="clickFn">點擊讓輸入框聚焦</button></div><TestCom ref="testRef"></TestCom><button @click="getCom">獲取組件</button>
</template>
9.provide和inject

為了跨層級組件通信

  1. 頂層組件通過provide函數提供數據
  2. 底層組件通過inject函數獲取數據
頂層組件
<script setup>
import CenterCom from '@/components/center-com.vue'
import { provide, ref } from 'vue'// 1. 跨層傳遞普通數據
provide('theme-color', 'pink')// 2. 跨層傳遞響應式數據
const count = ref(100)
provide('count', count)setTimeout(() => {count.value = 500
}, 2000)// 3. 跨層傳遞函數 => 給子孫后代傳遞可以修改數據的方法
provide('changeCount', (newCount) => {count.value = newCount
})</script><template>
<div><h1>我是頂層組件</h1><CenterCom></CenterCom>
</div>
</template>
底部組件
<script setup>
import { inject } from 'vue'
const themeColor = inject('theme-color')
// const themeColor = inject('theme-color')
const count = inject('count')
const change = inject('change')
const clickFn1 = () => {change(200)
}
const changeCount = inject('changeCount')
const clickFn = () => {changeCount(1000)
}
</script><template>
<div><h3>我是底層組件-{{ themeColor }} - {{ count }}</h3><button @click="clickFn">更新count</button><button @click="clickFn1">更新count</button></div>
</template>
10.defineOptions

可以用defineOptions定義任意的選項,(prop,emit,expose,slots除外)

defineOptions({name: 'IndexPage'
})
11.defineModel
<script setup>
import { defineModel } from 'vue'
const modelValue = defineModel()
</script><template>
<div><input type="text" :value="modelValue"@input="e => modelValue = e.target.value">
</div>
</template>

使用defineModel需要加配置

import { fileURLToPath, URL } from 'node:url'import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'// https://vitejs.dev/config/
export default defineConfig({plugins: [vue({script: {defineModel: true}}),],resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))}}
})
12.Pinia

是vuex的替代品

  1. 有更簡單的API
  2. 與vue3新語法統一
  3. 去掉了modules的概念,每個store都是獨立的模塊
  4. 對TypeScript更友好
13.添加Pinia到vue項目

生成

import { defineStore } from 'pinia'
import { computed, ref } from 'vue'// 定義store
// defineStore(倉庫的唯一標識, () => { ... })
export const useCounterStore = defineStore('counter', () => {// 聲明數據 state - countconst count = ref(100)// 聲明操作數據的方法 action (普通函數)const addCount = () => count.value++const subCount = () => count.value--// 聲明基于數據派生的計算屬性 getters (computed)const double = computed(() => count.value * 2)// 聲明數據 state - msgconst msg = ref('hello pinia')return {count,msg,}
}
})

使用(導入后可直接使用)

<script setup>
import { useCounterStore } from '@/store/counter'
const counterStore = useCounterStore()
</script><template><div>我是Son1.vue - {{ counterStore.count }} - {{ counterStore.double }}<button @click="counterStore.addCount">+</button></div>
</template>
14.action異步
import { defineStore } from 'pinia'
import { ref } from 'vue'
import axios from 'axios'export const useChannelStore = defineStore('channel', () => {// 聲明數據const channelList = ref([])// 聲明操作數據的方法const getList = async () => {// 支持異步const { data: { data }} = await axios.get('http://geek.itheima.net/v1_0/channels')channelList.value = data.channels}// 聲明getters相關return {channelList,getList}
})
15.storeToRef方法
import { storeToRefs } from 'pinia'
// 此時,直接解構,不處理,數據會丟失響應式
// 加storeToRefs就不丟失
const { count, msg } = storeToRefs(counterStore)
16.Pinia持久化

安裝插件,導入插件,persist: true就行了

export const useCounterStore = defineStore('counter', () => {// 聲明數據 state - msgconst msg = ref('hello pinia')return {count,double,addCount,subCount,msg,}
}, {// persist: true // 開啟當前模塊的持久化persist: {key: 'hm-counter', // 修改本地存儲的唯一標識paths: ['count'] // 存儲的是哪些數據}
})
17.大事件

createRouter 創建路由實例
配置 history 模式

  1. history模式:createWebHistory 地址欄不帶 #
  2. hash模式: createWebHashHistory 地址欄帶 #
    console.log(import.meta.env.DEV)

vite 中的環境變量 import.meta.env.BASE_URL 就是 vite.config.js 中的 base 配置項

在 Vue3 CompositionAPI 中

  1. 獲取路由對象 router useRouter
    const router = useRouter()
  2. 獲取路由參數 route useRoute
    const route = useRoute()

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

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

相關文章

QT采用mqtt進行通信(17.1)

文章目錄 1.試錯歷程2. qt5.8安裝3. 開始搞了4. 測試連接mqtt broker1.試錯歷程 嘗試過網上說的各種版本,官方庫和第三方庫,試過qt5.9.9, qt5.12, qt5.12.2, qt5.14 等各個版本,都能編譯通過,調用mqtt庫,但是都不能連接成功,真的是試吐了,不知道他們的為什么都能成功,…

西門子PLC結構化編程_水處理系統水泵多備多投

文章目錄 前言一、功能概述二、程序編寫1. 需求分析2. 編寫運行時間累計功能塊3. 創建自定義數據類型1. 時間排序數據類型2. 多備多投數據類型3. 多備多投切換數據類型 4. 編程1. 創建DB數據塊1. 多備多投數據塊2. 多備多投切換數據塊 2. 創建FB功能塊 三、程序調用總結 前言 …

QT:自定義ComboBox

實現效果: 實現combobox的下拉框區域與item區域分開做UI交互顯示。 支持4種實現效果,如下 效果一: 效果二: 效果三: 效果四: 實現邏輯: ui由一個toolbutton和combobox上下組合成,重點在于combobox。 我設置了4種枚舉,ButtonWithComboBox對應效果一;OnlyButt…

VS2022+OpenCasCade配置編譯

一、Open CASCADE Technology介紹及安裝&#xff08;windows10&#xff09; Open CASCADE Technology&#xff08;簡稱OCCT&#xff09;是一款開源的 3D CAD/CAM/CAE 軟件開發平臺&#xff0c;廣泛應用于工業設計、工程仿真、制造等領域。開源OCC對象庫是一個面向對象C類庫&…

【OSG學習筆記】Day 12: 回調機制——動態更新場景

UpdateCallback 在OpenSceneGraph&#xff08;OSG&#xff09;里&#xff0c;UpdateCallback是用來動態更新場景的關鍵機制。 借助UpdateCallback&#xff0c;你能夠實現節點的動畫效果&#xff0c;像旋轉、位移等。 NodeCallback osg::NodeCallback 是一個更通用的回調類&…

全新升級:BRAV-7601-T003高性能無風扇AI邊緣計算系統,助力智能未來!

在數字化與智能化飛速發展的今天&#xff0c;AI邊緣計算正成為各行各業的核心驅動力。BRAV-7601作為一款高性能無風扇AI邊緣計算系統&#xff0c;憑借其強大的硬件配置與豐富的擴展能力&#xff0c;為車路協同、特種車輛車載、機器視覺、醫療影像等領域提供了卓越的解決方案。最…

刪除 Git 遠程記錄并重新設置

刪除 Git 遠程記錄并重新設置 以下是在 Windows 平臺上刪除當前項目的 Git 遠程記錄并重新設置遠程存儲庫的步驟&#xff1a; 步驟一&#xff1a;查看當前遠程倉庫 首先&#xff0c;檢查當前設置的遠程倉庫&#xff1a; git remote -v這會顯示所有已配置的遠程倉庫及其 URL…

有哪些和PPT自動生成有關的MCP項目?

隨著AI技術的快速發展, Model Context Protocol(MCP) 作為一種連接大型語言模型(LLMs)與外部工具的開放協議,正在重塑自動化辦公領域。在PPT自動生成場景中,MCP通過標準化接口實現了AI模型與設計工具、數據源的無縫整合。以下從技術框架、項目案例、應用場景三個維度展開…

PostgreSQL psql 命令和常用的 SQL 語句整理

PostgreSQL psql 命令和常用的 SQL 語句整理 1、登錄PostgreSQL數據庫2、psql 命令3、數據庫操作4、模式操作5、表操作6、數據操作7、索引操作8、視圖操作9、權限操作 1、登錄PostgreSQL數據庫 在系統的命令行界面&#xff08;如 Windows 的 cmd 或者 PowerShell、Linux 的終端…

【unity游戲開發入門到精通——UGUI】文本輸入控件 —— InputField舊控件

注意&#xff1a;考慮到UGUI的內容比較多&#xff0c;我將UGUI的內容分開&#xff0c;并全部整合放在【unity游戲開發——UGUI】專欄里&#xff0c;感興趣的小伙伴可以前往逐一查看學習。 文章目錄 前言1、文本輸入控件2、InputField舊文本輸入控件組成 一、InputField文本輸入…

獲得ecovadis徽章資格標準是什么?ecovadis評估失敗的風險

EcoVadis徽章資格標準 EcoVadis徽章是對企業在可持續發展&#xff08;環境、勞工與人權、商業道德、可持續采購&#xff09;方面表現的認可。獲得徽章需滿足以下條件&#xff1a; 完成評估&#xff1a; 企業必須完成EcoVadis的問卷評估&#xff0c;并提交所有必要文件。 評分…

Python初學 有差異的知識點總結(一)

目錄 一、基礎語法規則 1.注釋 2.代碼編寫 二、基礎語法 1.變量 2.數據類型 3.數據類型的轉換 &#xff08;1&#xff09;隱式轉換 &#xff08;2&#xff09;顯示轉換 4.標識符 5.運算符 6.字符串 &#xff08;1&#xff09;定義 &#xff08;2&#xff09;拼接 …

Java面試場景深度解析

Java面試場景深度解析 在互聯網大廠Java求職者的面試中&#xff0c;經常會被問到關于Java項目中的各種技術場景題。本文通過一個故事場景來展示這些問題的實際解決方案。 第一輪提問 面試官&#xff1a;馬架構&#xff0c;歡迎來到我們公司的面試現場。請問您對Java內存模型…

【數據可視化藝術·應用篇】三維管線分析如何重構城市“生命線“管理?

在智慧城市、能源管理、工業4.0等領域的快速發展中&#xff0c;地下管線、工業管道、電力通信網絡等“城市血管”的復雜性呈指數級增長。傳統二維管理模式已難以應對跨層級、多維度、動態變化的管線管理需求。三維管線分析技術應運而生&#xff0c;成為破解這一難題的核心工具。…

Spring-全面詳解(學習總結)

一&#xff1a;概述 1.1 為什么學 解決了兩個主要問題 1. 2 學什么 1.3 怎么學 二&#xff1a;系統架構 作用&#xff1a;web開發、微服務開發、分布式系統開發 容器&#xff1a;用于管理對象 AOP:面向切面編程&#xff08;不驚動原始程序下對其進行加強&#xff09; 事…

企業架構之旅(2):解鎖TOGAF ADM

文章目錄 一、什么是 TOGAF ADM二、TOGAF ADM 的關鍵階段架構愿景&#xff08;Phase A&#xff09;業務架構&#xff08;Phase B&#xff09;信息系統架構&#xff08;Phase C&#xff09;技術架構&#xff08;Phase D&#xff09;機會與解決方案&#xff08;Phase E&#xff0…

MySQL 中 SQL 語句的詳細執行過程

MySQL 中 SQL 語句的詳細執行過程 當一條 SQL 語句在 MySQL 中執行時&#xff0c;它會經歷多個階段的處理。下面我將詳細描述整個執行流程&#xff1a; 1. 連接階段 (Connection) 客戶端與 MySQL 服務器建立連接服務器驗證用戶名、密碼和權限連接器負責管理連接狀態和權限驗…

ETL架構、數據建模及性能優化實踐

ETL&#xff08;Extract, Transform, Load&#xff09;和數據建模是構建高性能數據倉庫的核心環節。下面從架構設計、詳細設計、數據建模方法和最佳實踐等方面系統闡述如何優化性能。 一、ETL架構設計優化 1. 分層架構設計 核心分層&#xff1a; 數據源層&#xff1a;對接O…

快速上手Prism WPF 工程

1、Prism 介紹 ?定位?&#xff1a; Prism 是 ?微軟推出的框架&#xff0c;專為構建 ?模塊化、可維護的復合式應用程序? 設計&#xff0c;主要支持 WPF、Xamarin.Forms、UWP 等平臺。?核心功能?&#xff1a; ?模塊化開發?&#xff1a;將應用拆分為獨立模塊&#xff0c…

React 單一職責原則:優化組件設計與提高可維護性

單一職責原則&#xff08;SRP&#xff09; 在 React 中&#xff0c;組件是構建 UI 的核心單位&#xff0c;而良好的組件設計是保證應用質量和可維護性的關鍵。單一職責原則是一種設計原則&#xff0c;也適用于 React 組件的開發。它強調每個組件應該只關注一個職責&#xff0c…