Vue3學(xué)習(xí)法

常識(shí)

  • 項(xiàng)目都用的若依vue3,且項(xiàng)目統(tǒng)一有基礎(chǔ)架子,不用操心從零配置項(xiàng)目
  • 項(xiàng)目遵循一個(gè)規(guī)范是:一個(gè)頁(yè)面對(duì)應(yīng)一個(gè)文件夾,頁(yè)面主體用index.vue命名,拆分出的局部vue不要放在components里,而是和index.vue并排放,比如DetailDialog.vue
  • 左側(cè)菜單配置在若依里配置,不是李春時(shí)代直接寫數(shù)據(jù)表的土法子
  • code插件裝Vue-Offical

Vue3基礎(chǔ)

  • <script>用<script setup lang="ts">,里面視為普通邏輯代碼,沒有Vue2那種導(dǎo)出大對(duì)象
  • 不會(huì)再有任何this
  • 組件import之后就不用管了,沒有components: {}這種聲明
  • 以下提到的ref defineProps computed 什么的,通常不需要專門import,如果真的需要,vscode會(huì)提示你怎么引入
  • 原來的props,現(xiàn)在用const props = defineProps({......}),無(wú)論組件要定義多少prop,只用定義1次props
  • 原來的data,現(xiàn)在用const abc = ref(初始值,可以是[],可以是空值),注意,不能在函數(shù)里定義,必須在最表層定義,簡(jiǎn)單說,除了函數(shù)里臨時(shí)用一下的變量,其他變量一律在最表層定義。還有,凡是在<template>用的變量一律用ref,其他變量一律不寫ref
  • 修改data,用abc.value = 新值,注意別忘了.value
  • ref包裹任何類型,reactive只包裹數(shù)組和對(duì)象,ref使用概率90%,reactive10%
  • 包裹對(duì)象的前提下,ref用于整體對(duì)象被替換的場(chǎng)景,如abc.value = xxxreactive用于局部賦值的場(chǎng)景,如const abc = reactive({a:1}); abc.a = 2
  • 只有ref對(duì)象有.value,reactive對(duì)象不寫.value
  • template里寫變量,不加.value,JS里寫變量,加.value
  • 原來的methods,現(xiàn)在是一個(gè)個(gè)的函數(shù),函數(shù)和相關(guān)的const在書寫時(shí)就近寫
  • 原來的計(jì)算屬性,現(xiàn)在是const def = computed(()=> {return abc.value * 333222111})
  • 監(jiān)聽,現(xiàn)在是watch(()=>abc.value, ()=> {do something}),watch不用賦值給什么變量,寫在<script>表層任意位置均可
  • 修改了變量后DOM不會(huì)第一時(shí)間生效,Vue2的nextTick現(xiàn)在的寫法是:nextTick(()={...})
  • <script>代碼第一部分,import,如同Vue2
  • <script>第二部分,如果是子組件可能需要接props,寫法:
const props = defineProps({ // props變量名永遠(yuǎn)是這個(gè)變量名,defineProps函數(shù)不需引入,因?yàn)榭蚣茏詭?  xxxxx: { // Vue2寫法,不解釋
    type: Boolean,
    default: true
  }
})
  • <script>第三部分,如果是子組件可能需要定義emit,寫法:
const emit = defineEmits(['abc']) // emit永遠(yuǎn)是emit,defineEmits不需要引入,abc是父組件里寫的那個(gè)@abc=
  • <script>第四部分,按功能開始寫代碼,建議用明顯的注釋來劃分模塊,例如:
//region ************************************************** 一般常量 **************************************************
...
//region ************************************************** 一般函數(shù) **************************************************
...
//region ************************************************** XX區(qū)塊 **************************************************
...
//region ************************************************** OO區(qū)塊 **************************************************
...
//region ************************************************** 某某Dialog **************************************************
...
  • 區(qū)塊就是頁(yè)面里的一塊塊的部分,沒什么玄妙
  • 以XX區(qū)塊為例,比如一個(gè)輸入框<input :value="inputVal" @input="onInput" />,實(shí)質(zhì)上并不會(huì)用原生<input />,我就是告訴你,除了const就是function,沒什么玄妙:

const inputVal = ref('')
function onInput() {
  ......
}
  • 如何emit:
function xxx(){
  emit('上文自定義的那個(gè)事件名', '傳的值')
}
  • 周期鉤子:所有的鉤子都要背下來,用的時(shí)候一般只用onMounted onUnmounted,寫法:
onMounted(()=> {
   do something
})

onMounted可以多次定義,可以分布在任何角落,執(zhí)行的時(shí)候依次執(zhí)行,根據(jù)業(yè)務(wù)邏輯放置就行了。

  • 如何引用DOM:比如<el-form ref="formRef" ......,格式是隨便取個(gè)名字,最后加Ref,這個(gè)名字怎么寫都行,不受限制,推薦是相關(guān)名字Ref。用的時(shí)候:
const formRef = ref();  // 這里的formRef必須和<el-form ref="formRef"同名,必須在表層寫
onMounted(()=>{  formRef.value.offsetHeight ...........}) // 用的時(shí)候,必須在onMounted里,不然DOM獲取不到,你懂的。
  • 立即ajax

就在表層直接寫,注意表層不支持await,函數(shù)內(nèi)支持。所以表層用:

import mainApi from '@/api/xxx/ooo'
....

const xxList = ref([])
mainApi.getList({...}).then(res=> {
  xxList.value = res
})

Element Plus

  • 圖標(biāo)引入:import { Plus, Edit, Delete } from '@element-plus/icons-vue'

TS

  • 隨便定義個(gè)對(duì)象的接口:
interface SysUser {
  userId: number
  nickName: string
}
  • 如何用這個(gè)接口:
const abc: SysUser = {userId: 22, nickName: '李月靜'}
  • 復(fù)雜情況:對(duì)象套對(duì)象,所以接口套接口:
interface SysUser {
  userId: number
  nickName: string
  child: SysUser[]
}

上面是更特殊的情況,自己套自己,也可以套別的接口,不難理解。[]表示它是由SysUser組成的數(shù)組

  • type的用法:
type age = number | string

這就是更簡(jiǎn)單的定義。|表示“或”,number用小寫。

type age = 15 | 16 | 17 | 18

約束僅限于這4個(gè)值。

type SysUser = {
    userId: number
  nickName: string
}

這和interface功能一樣。

  • 函數(shù)參數(shù)定義類型:
type Sex: number
function abc(sex: Sex, age: Age) {}
  • 總結(jié):
  1. 首字母大寫
  2. interface 用花括號(hào),type用等于號(hào)
  3. interface用來定義對(duì)象(type也可以,但一般用interface),type用于定義簡(jiǎn)單類型,可以加|
  4. 函數(shù)的參數(shù)一定要定義上類型
  5. 別的咱不用管,工作中學(xué)習(xí)

示例:

import ... from ...
import ... from ...

//region ************************************************** 部門樹 **************************************************
interface SysUser {
  userId: number
  nickName: string
}

interface DeptUser {
  deptId: number
  parentId: number | null
  deptName: string
  sysUsers: SysUser[]
}

interface DeptUserList {
  value: DeptUser[]
}

let deptUserList: DeptUserList = ref([])
const deptTreeOptions = ref<any>([])
let deptUserListLoading = ref(false)
getUserTree().then((res) => {
  deptUserList.value = res.filter((v) => v.isUser === '1')
  deptTreeOptions.value = DeptUtils.arrayToTree(res)
  deptUserListLoading.value = false
})
  • 工作中棘手的事

    • 頁(yè)面是典型的搜索+表格的樣子的話,我給你一套快速開發(fā)模版
    • 左右結(jié)構(gòu)的話,多用flex:1,讓右側(cè)彈性
    • element-plus有3中樹形相關(guān)的組件,tree,tree-select,cascader,你怎么從扁平數(shù)據(jù)構(gòu)建樹形數(shù)據(jù)?你問AI:
      JS有數(shù)組,格式類似于{......后端返回的扁平格式.....},我想構(gòu)建成{id:'原id值', value:'原id值',label:'原name值',children:[]}的樹形格式,給我算法
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,494評(píng)論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,283評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,714評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,186評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,410評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,940評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,776評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,976評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,210評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評(píng)論 1 286
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,654評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,958評(píng)論 2 373

推薦閱讀更多精彩內(nèi)容

  • 在現(xiàn)在的前端開發(fā)中,前后端分離、模塊化開發(fā)、版本控制、文件合并與壓縮、mock數(shù)據(jù)等等一些原本后端的思想開始...
    Charlot閱讀 5,464評(píng)論 1 32
  • gulpjs是一個(gè)前端構(gòu)建工具,與gruntjs相比,gulpjs無(wú)需寫一大堆繁雜的配置參數(shù),API也非常簡(jiǎn)單,學(xué)...
    依依玖玥閱讀 3,166評(píng)論 7 55
  • gulpjs是一個(gè)前端構(gòu)建工具,與gruntjs相比,gulpjs無(wú)需寫一大堆繁雜的配置參數(shù),API也非常簡(jiǎn)單,學(xué)...
    井皮皮閱讀 1,318評(píng)論 0 10
  • gulpjs是一個(gè)前端構(gòu)建工具,與gruntjs相比,gulpjs無(wú)需寫一大堆繁雜的配置參數(shù),API也非常簡(jiǎn)單,學(xué)...
    小裁縫sun閱讀 942評(píng)論 0 3
  • 1、gulp的安裝 首先確保你已經(jīng)正確安裝了nodejs環(huán)境。然后以全局方式安裝gulp: npm install...
    F_imok閱讀 2,393評(píng)論 1 11