Vue3基礎(chǔ)知識

  • vue3優(yōu)點
  1. 性能提升(首次渲染更快, diff算法更快,內(nèi)存占用更少,打包體積更小)
  2. 更好的Typescript支持
  3. Composition API 組合式api(重點)
  • vue3和vue2對比
  1. 實例方法$on移除 (eventBus現(xiàn)有實現(xiàn)模式不再支持 可以使用三方插件替代)
  2. 過濾器filter移除 (插值表達(dá)式里不能再使用過濾器 可以使用methods替代)
  3. .sync語法移除 (和v-model語法合并)
  4. vue3.0的單文件組件中不再強制要求必須有唯一根元素

更多閱讀:https://v3.cn.vuejs.org/guide/migration/introduction.html

vue3組件庫


  • element-plus(elementUi3.0適配)
    Element Plus朽褪,一套為開發(fā)者法梯、設(shè)計師和產(chǎn)品經(jīng)理準(zhǔn)備的基于 Vue 3.0 的桌面端組件庫
    網(wǎng)址:| https://element-plus.gitee.io/#/zh-CN |


  • Naive UI
    一個 Vue 3 組件庫比較完整脾歇,主題可調(diào)序六,使用 TypeScript跃须,不算太慢,有點意思
    網(wǎng)址:https://www.naiveui.com/zh-CN/

  • VueUse
    基于composition組合api的常用集合球榆,小兔仙項目會部分使用
    網(wǎng)址:https://vueuse.org/

組合式API

  • 特定功能相關(guān)的所有東西都放到一起維護(hù)朽肥,比如功能A相關(guān)的響應(yīng)式數(shù)據(jù),操作數(shù)據(jù)的方法等放到一起持钉,這樣不管應(yīng)用多大衡招,都可以快讀定位到某個功能的所有相關(guān)代碼
  • 維護(hù)方便,設(shè)置如果功能復(fù)雜每强,代碼量大始腾,我們還可以進(jìn)行邏輯拆分處理


    image.png

特別注意:

  1. 選項式api和組合式api倆種風(fēng)格是并存的關(guān)系 并不是非此即彼
  2. 需要大量的邏輯組合的場景,可以使用compition API進(jìn)行增強

setup入口函數(shù)

  1. setup 函數(shù)是一個新的組件選項空执,作為組件中組合式API 的入口函數(shù)
  2. setup 中不能使用 this浪箭, this 指向 undefined
  3. setup函數(shù)只會在組件初始化的時候執(zhí)行一次
  4. setup函數(shù)在beforeCreate生命周期鉤子執(zhí)行之前執(zhí)行
export default {
  setup () {
    console.log('setup執(zhí)行了')
    console.log(this)
  },
  beforeCreate() {
    console.log('beforeCreate執(zhí)行了')
    console.log(this)
  }
}

響應(yīng)式API - reactive

  • 作用:reactive是一個函數(shù),接收一個普通的對象傳入辨绊,把對象數(shù)據(jù)轉(zhuǎn)化為響應(yīng)式對象并返回
  • 使用步驟
  1. 從vue框架中導(dǎo)入reactive函數(shù)
  2. 在setup函數(shù)中調(diào)用reactive函數(shù)并將對象數(shù)據(jù)傳入
  3. 在setup函數(shù)中把reactive函數(shù)調(diào)用完畢之后的返回值以對象的形式返回出去
<template>
  <div>{{ state.name }}</div>
  <div>{{ state.age }}</div>
  <button @click="state.name = 'pink'">改值</button>
</template>

<script>
import { reactive } from 'vue' //引入reactive函數(shù)
export default {
  setup () {
    const state = reactive({   //在reactive函數(shù)中傳入對象
      name: 'cp',
      age: 18
    })
    return {
      state
    }
  }
}
</script>

響應(yīng)式API - ref

  • 作用:ref是一個函數(shù)奶栖,接受一個簡單類型或者復(fù)雜類型的傳入并返回一個響應(yīng)式且可變的 ref 對象
  • 使用步驟
  1. 從vue框架中導(dǎo)出ref函數(shù)
  2. 在setup函數(shù)中調(diào)用ref函數(shù)并傳入數(shù)據(jù)(簡單類型或者復(fù)雜類型)
  3. 在setup函數(shù)中把ref函數(shù)調(diào)用完畢的返回值以對象的形式返回出去
  4. 注意:在setup函數(shù)中使用ref結(jié)果,需要通過.value 訪問邢羔,模板中使用不需要加.value
<template>
  <div>{{ money }}</div>
  <button @click="changeMondy">改值</button>
</template>

<script>
import { ref } from 'vue'
export default {
  setup() {
    let money = ref(100)
    console.log(money.value)
    return {
      money
    }
  }
}
</script>

ref和reactive函數(shù)對比結(jié)論:

  1. ref 函數(shù)可以接收一個簡單類型的值驼抹,返回一個可改變的 ref 響應(yīng)式對象,從而彌補reactive函數(shù)不支持簡單類型的問題
  2. 只有我們明確知道要轉(zhuǎn)換的對象內(nèi)部的字段名稱我們才使用reactive拜鹤,否則就一律使用ref框冀,從而降低在語法選擇上的心智負(fù)擔(dān)

響應(yīng)式API - computed

  • 作用:根據(jù)現(xiàn)有響應(yīng)式數(shù)據(jù)經(jīng)過一定的計算得到全新的數(shù)據(jù)
  • 使用步驟
  1. 從vue框架中導(dǎo)入computed 函數(shù)
  2. 在setup函數(shù)中執(zhí)行computed函數(shù),并傳入一個函數(shù)敏簿,在函數(shù)中定義計算公式
  3. 把computed函數(shù)調(diào)用完的執(zhí)行結(jié)果放到setup的return值對象中
<template>
  {{ list }}
  {{ filterList }}
  <button @click="changeList">change list</button>
</template>

<script>
import { computed, ref } from 'vue'
export default {
  setup() {
    const list = ref([1, 2, 3, 4, 5])
    // 輸入大于3的數(shù)字
    const filterList = computed(() => {
      return list.value.filter(item => item > 3)
    })
    // 修改list的函數(shù)
    function changeList() {
      list.value.push(6, 7, 8)
    }
    return {
      list,
      filterList,
      changeList
    }
  }
}
</script>

響應(yīng)式API - watch

  • 作用:基于響應(yīng)式數(shù)據(jù)的變化執(zhí)行回調(diào)邏輯明也,和vue2中的watch的功能完全一致
  1. 普通監(jiān)聽
  2. 立即執(zhí)行
  3. 深度監(jiān)聽

  • 使用步驟
  1. 從vue框架中導(dǎo)入watch函數(shù)
  2. 在setup函數(shù)中執(zhí)行watch函數(shù)開啟對響應(yīng)式數(shù)據(jù)的監(jiān)聽
  3. watch函數(shù)接收三個常規(guī)參數(shù)
    1. 第一個參數(shù)為函數(shù)宣虾,返回你要監(jiān)聽變化的響應(yīng)式數(shù)據(jù)
    2. 第二個參數(shù)為響應(yīng)式數(shù)據(jù)變化之后要執(zhí)行的回調(diào)函數(shù)
    3. 第三個參數(shù)為一個對象,在里面配置是否開啟立刻執(zhí)行或者深度監(jiān)聽

1)普通監(jiān)聽

<template>
  {{ age }}
  <button @click="age++">change age</button>
</template>

<script>
import { ref, watch } from 'vue'
export default {
  setup() {
    const age = ref(18)
    watch(() => {
      // 返回你想要監(jiān)聽的響應(yīng)式屬性(ref產(chǎn)生的對象必須加.value)
      return age.value
    }, () => {
      // 數(shù)據(jù)變化之后的回調(diào)函數(shù)
      console.log('age發(fā)生了變化')
    })
    return {
      age
    }
  }
}
</script> 

2)開啟立刻執(zhí)行

  • watch的效果默認(rèn)狀態(tài)下温数,只有監(jiān)聽的數(shù)據(jù)發(fā)生變化才會執(zhí)行回調(diào)绣硝,如果你需要在一上來的時候就立刻執(zhí)行一次,需要配置一下immediate屬性
<template>
  {{ age }}
  <button @click="age++">change age</button>
</template>
<script>
import { ref, watch } from 'vue'
export default {
  setup() {
    const age = ref(18)
    watch(() => {
      // 返回你想要監(jiān)聽的響應(yīng)式屬性(ref產(chǎn)生的對象必須加.value)
      return age.value
    }, () => {
      // 數(shù)據(jù)變化之后的回調(diào)函數(shù)
      console.log('age發(fā)生了變化')
    },{ immediate: true})
    return {
      age
    }
  }
}
</script> 

3)開啟深度監(jiān)聽

  • 當(dāng)我們監(jiān)聽的數(shù)據(jù)是一個對象的時候撑刺,默認(rèn)狀態(tài)下鹉胖,對象內(nèi)部的屬性發(fā)生變化是不會引起回調(diào)函數(shù)執(zhí)行的,如果想讓對象下面所有屬性都能得到監(jiān)聽够傍,需要開啟deep配置
  • 注意: 使用watch的時候甫菠,盡量詳細(xì)的表明你到底要監(jiān)聽哪個屬性,避免使用deep引起的性能問題冕屯,
<template>
  {{ name }}
  {{ info.age }}
  <button @click="name = 'pink'">change name</button>
  <button @click="info.age++">change age</button>
</template>

<script>
import { reactive, toRefs, watch } from 'vue'
export default {
  setup() {
    const state = reactive({
      name: 'cp',
      info: {
        age: 18
      }
    })
    watch(() => {
      return state
    }, () => {
      // 數(shù)據(jù)變化之后的回調(diào)函數(shù)
      console.log('age發(fā)生了變化')
    }, {
      deep: true
    })
    return {
      ...toRefs(state)
    }
  }
}
</script> 

生命周期函數(shù)

  • 使用步驟
  1. 先從vue中導(dǎo)入以on打頭的生命周期鉤子函數(shù)
  2. 在setup函數(shù)中調(diào)用生命周期函數(shù)并傳入回調(diào)函數(shù)
  3. 生命周期鉤子函數(shù)可以調(diào)用多次
<template>
  <div>生命周期函數(shù)</div>
</template>

<script>
import { onMounted } from 'vue'
export default {
  setup() {
    // 時機成熟 回調(diào)函數(shù)自動執(zhí)行
    onMounted(() => {
      console.log('mouted生命周期執(zhí)行了')
    })
     onMounted(() => {
      console.log('mouted生命周期函數(shù)又執(zhí)行了')
    })
  }
}
</script> 

image.png

父子通信

  • 實現(xiàn)步驟
  1. setup函數(shù)提供倆個參數(shù)寂诱,第一個參數(shù)為props,第二個參數(shù)為一個對象context
  2. props為一個對象安聘,內(nèi)部包含了父組件傳遞過來的所有prop數(shù)據(jù)痰洒,context對象包含了attrs,slots浴韭, emit屬性丘喻,其中的emit可以觸發(fā)自定義事件的執(zhí)行從而完成子傳父

app.vue

<template>
  <son :name="name" @get-msg="getMsg"></son>
</template>

<script>
import { ref } from 'vue'
import Son from './components/son'
export default {
  components: {
    Son
  },
  setup() {
    const name = ref('cp')
    function getMsg(msg) {
      console.log(msg)
    }
    return {
      name,
      getMsg
    }
  }
}
</script>

components/son.vue

<template>
  <div>
    {{name}}
    <button @click="setMsgToSon">set</button>
  </div>
</template>

<script>
export default {
  props: {
    name: {
      type: String
    }
  },
  emits: ['get-msg'], // 聲明當(dāng)前組件觸發(fā)的自定義事件
  setup(props,{emit}) {
    console.log(props.name)
    function setMsgToSon(){
      emit('get-msg','這是一條來自子組件的msg信息')
    }
    return {
      setMsgToSon
    }
  }
}
</script>

provide 和 inject (組件傳值)

  • provide 和 inject,它們配合起來可以完成從頂層組件向任意底層組件傳遞數(shù)據(jù)的效果,也可以傳遞響應(yīng)式數(shù)據(jù)
  • 實現(xiàn)步驟
  1. 頂層組件在setup方法中使用provide函數(shù)提供數(shù)據(jù)
    provide('key'囱桨,數(shù)據(jù))
  2. 任何底層組件在setup方法中使用inject函數(shù)獲取數(shù)據(jù)
    const data = inject('key')

爺爺組件 - app.vue

<template>
  <father></father>
</template>

<script>
import Father from '@/components/Father'
import { provide } from 'vue'
export default {
  components: {
    Father
  },
  setup() {
    let name = '柴柴老師'
    // 使用provide配置項注入數(shù)據(jù) key - value
    provide('name', name)
  }
}
</script> 

孫組件 - components/Son.vue

<template>
  我是子組件
  {{ name }}
</template>

<script>
import { inject } from 'vue'
export default {
  setup() {
    const name = inject('name')
    return {
      name
    }
  }
}
</script>

TemplateRef(獲取組件實例)

  • 實現(xiàn)步驟
  1. 使用ref函數(shù)傳入null創(chuàng)建 ref對象,并return接收的變量 const hRef = ref(null)
  2. 模板中通過定義ref屬性等于1中創(chuàng)建的ref對象名稱建立關(guān)聯(lián) <h1 ref="hRef"></h1>
  3. 使用 hRef.value

components/RefComponent.vue

<template>
  我是一個普通的組件
</template>

app.vue

<template>
  <h1 ref="h1Ref">我是普通dom標(biāo)簽</h1>
  <ref-comoonent ref="comRef"></ref-comoonent>
</template>

<script>
import { onMounted, ref } from 'vue'
import RefComoonent from '@/components/RefComponent'
export default {
  components: {
    RefComoonent
  },
  setup() {
    const h1Ref = ref(null)
    const comRef = ref(null)
    onMounted(() => {
      console.log(h1Ref.value)
      console.log(comRef.value)
    })
    // 必須return
    return {
      h1Ref,
      comRef
    }
  }
}
</script> 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仓犬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子舍肠,更是在濱河造成了極大的恐慌搀继,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翠语,死亡現(xiàn)場離奇詭異叽躯,居然都是意外死亡,警方通過查閱死者的電腦和手機肌括,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門点骑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谍夭,你說我怎么就攤上這事黑滴。” “怎么了紧索?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵袁辈,是天一觀的道長。 經(jīng)常有香客問我珠漂,道長晚缩,這世上最難降的妖魔是什么尾膊? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮荞彼,結(jié)果婚禮上冈敛,老公的妹妹穿的比我還像新娘。我一直安慰自己鸣皂,他們只是感情好抓谴,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著寞缝,像睡著了一般齐邦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上第租,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音我纪,去河邊找鬼慎宾。 笑死,一個胖子當(dāng)著我的面吹牛浅悉,可吹牛的內(nèi)容都是我干的趟据。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼术健,長吁一口氣:“原來是場噩夢啊……” “哼汹碱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起荞估,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤咳促,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后勘伺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跪腹,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年飞醉,在試婚紗的時候發(fā)現(xiàn)自己被綠了冲茸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡缅帘,死狀恐怖轴术,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钦无,我是刑警寧澤逗栽,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站铃诬,受9級特大地震影響祭陷,放射性物質(zhì)發(fā)生泄漏苍凛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一兵志、第九天 我趴在偏房一處隱蔽的房頂上張望醇蝴。 院中可真熱鬧,春花似錦想罕、人聲如沸悠栓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惭适。三九已至,卻和暖如春楼镐,著一層夾襖步出監(jiān)牢的瞬間癞志,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工框产, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凄杯,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓秉宿,卻偏偏與公主長得像戒突,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子描睦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

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

  • 2020 年 9 月膊存,它終于來了,盡管很早就上了 Beta 版本忱叭,但是尤大確一直沒有推出正式版隔崎,如今正式版上線,讓...
    橙色流年閱讀 1,087評論 1 4
  • 快速開始 通過 CDN: 通過 Codepen[https://codepen.io/yyx990803/pen/...
    AAA前端閱讀 575評論 0 1
  • https://blog.csdn.net/weixin_44475093/article/details/112...
    sun_hl閱讀 4,181評論 0 2
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來的情緒埂息。表情可以傳達(dá)很多信息技潘。高興了當(dāng)然就笑了,難過就哭了千康。兩者是相互影響密不可...
    Persistenc_6aea閱讀 124,193評論 2 7
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險厭惡者享幽,不喜歡去冒險,但是人生放棄了冒險拾弃,也就放棄了無數(shù)的可能值桩。 ...
    yichen大刀閱讀 6,033評論 0 4