成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Vue3 中有哪些值得深究的知識點?

開發 前端
眾所周知,前端技術一直更新很快,這不 vue3 也問世這么久了,今天就來給大家分享下vue3中值得注意的知識點。

[[443164]]

眾所周知,前端技術一直更新很快,這不 vue3 也問世這么久了,今天就來給大家分享下vue3中值得注意的知識點。

1、createApp

vue2 和 vue3 在創建實例時,有很大的區別,具體對比如下:

  1. //Vue 2 
  2. Vue.use({ 
  3.  router, 
  4.  store, 
  5.   render:h=>h(App) 
  6. }).$mount("#app"
  7.  
  8. //Vue 3 
  9. createApp(App).use(router).use(store).mount("#app"

 vue2 創建實例,使用的是 new Vue() 對應的 router、store 都是其中一部分參數。

而 vue3 中,使用 createApp 創建應用實例,router、store 被當作插件通過鏈式調用。

在 vue2 中,創建多個實例的話,如果有 mixin、prototype 等時,容易造成實例污染。而 createApp 方法創建的是一個全新的實例,可以有效地避免這個問題。所以在vue3中,可以任意地創建多個實例。

2、setup

vue2 中選項式開發的,而 vue3 采用組合式開發,也可以向下兼容選項式開發。

setup 函數就是 vue3 中 Composition API 的入口,是處于生命周期鉤子函數 beforeCreate 和 created 兩個函數之間,所以 setup 中的屬性和方法無法在外部使用。如果需要使用的話,必須 return 暴露出去。

對比一下 vue2 和 vue3 中 data 和 method 使用區別:

  1. // vue2 
  2. export default
  3.  data(){ 
  4.   return
  5.    name:"熱愛前端的小姐姐" 
  6.   }, 
  7.   methods:{ 
  8.    print(){ 
  9.     console.log("打印"
  10.    } 
  11.   } 
  12.  } 
  13.  
  14. // vue3 
  15. export default
  16.  setup(){ 
  17.   const name="熱愛前端的小姐姐" 
  18.   function print(){ 
  19.    console.log("打印"
  20.   } 
  21.   return {  name , print } 
  22.  } 

 vue2 中,this 是我們的常客,隨處可見它的蹤影。我們在 setup 中加入 this 的打印,試著查看下結果,發現運行結果是 undefined。

所以在 setup 內無法使用 this 以及掛載 this 相關的東西。

所以 setup 函數提供了兩個參數:

  1. setup(props,context){ 
  2.  //props 是響應式數據,不能直接解構賦值 
  3.  //context 非響應式對象,可以直接解構使用 
  4.    
  5.  // Attribute (非響應式對象) 
  6.  console.log(context.attrs) 
  7.   
  8.  // 插槽 (非響應式對象) 
  9.  console.log(context.slots) 
  10.   
  11. // 觸發事件 (方法) 
  12. console.log(context.emit) 

3、script setup 語法糖

簡化上述 setup 組合式 API 的寫法,屬于 vue3 的新語法糖。

特點:

  1. 定義的屬性和方法無需 return,可以直接使用。
  2. 自動注冊組件,不再需要 components 內注冊組件。

大大簡化上述 setup() 的代碼。

4、鉤子函數

vue2 使用生命周期函數時,直接使用就好了。如:

  1. // vue2 
  2. export default
  3.  beforeCreate(){ 
  4.  }, 
  5.  mounted(){ 
  6.    
  7.  } 

 但是在 vue3 組合式 API 中,通過生命周期鉤子前面加 on 來訪問,使用之前必須引入。如:

  1. // vue3  
  2. <script setup> 
  3.  import { onMounted } from "vue" 
  4.  onMounted(()=>{ 
  5.   
  6.  }) 
  7. </script> 

 由于 setup 是圍繞 beforeCreate 和 created 生命周期鉤子運行的,所以在 setup 內不需要這兩個鉤子函數,剩余的都是一樣的。

官方提供生命周期鉤子:

Vue3 中有哪些值得深究的知識點?

5、teleport 傳送門

teleport 傳送門可以把內部的元素綁定到任意父元素上,使用方式簡單靈活。

使用方式:

  1. <teleport to="body"></teleport> 

to 屬性是指定 teleport 中內容加入的 DOM 元素,可以是標簽名、類名或 id 。

  1. //標簽名  。上述實例就是加入body元素內,使用的是標簽名。 
  2. <teleport to="body"></teleport> 
  3.  
  4. //類名。如:to=".className" 
  5. <teleport to=".className"></teleport> 
  6.  
  7. //id名 
  8. <teleport to="#idName"></teleport> 

 優點:多個組件嵌套層次過多時,樣式層級處理麻煩,使用 teleport 可以把元素剝離出來,設置樣式方便,同時 vue 控制狀態也方便。

6、mixin 混入

mixin 對象會把多個組件公用的選項提取出來,需要的組件內引入,管理方便。在 vue3 中 mixin 使用較少。

使用方式:

  1. <script> 
  2. const myMixin = { 
  3.  data(){ 
  4.   return {name:'熱愛前端的小姐姐'
  5.  } 
  6. export default { 
  7.  mixins:[myMixin], 
  8.  data(){ 
  9.   return { 
  10.    qdr:"前端人" 
  11.   } 
  12.  } 
  13. </script> 

 使用時,可以引入多個 mixin 對象。使用注意事項:

  1. mixin 對象與組件包含相同選項時,會自動合并。
  2. mixin 對象與組件相同選項內擁有相同屬性時,就近原則,優先繼承實例內的值。
  3. mixin 和組件包含相同的鉤子函數時,會合并執行,優先執行 mixin 中的鉤子函數。
  4. mixin 自定義屬性與實例中沖突時,可以通過 optionMergeStrategies 定義優先級。

7、自定義指令

全局自定義指令:

vue2 的 directive 掛載到 Vue 對象上。

vue3 的 directive 掛載到 app 上,如:

  1. //Vue 2 
  2. Vue.directive('name',opt) 
  3.  
  4. //Vue 3 
  5. const app = createApp(App) 
  6. app.directive("name",options) 
  7. app.mount("#app"

 局部自定義指令:與 vue2 寫法相同。

在 vue3 中自定義指令生命周期鉤子函數有一部分改變,鉤子函數分別為:

  • created
  • beforeMounted
  • mounted
  • beforeUpdate
  • updated
  • beforeUnmounted
  • unmounted

8、ref、reactive

ref 作用是讓基礎類型數據具備響應式。

reactive 讓引用數據類型具備響應式能力。

ref 和 reactive 包裹數據,使數據具備響應式,在使用之前需要先引入。

使用方法如:

  1. <script setup> 
  2.  import { ref , reactive } from "vue" 
  3.  let mood = ref("value"
  4.  let me = reactive({ 
  5.   str:value, 
  6.  }) 
  7. </script> 

 setup + ref + reactive 就可以實現 vue2 中 data 的響應式功能,所以 setup 能夠替換掉 data 。

9、toRefs、toRef

toRefs 解構 props 傳遞的數據,由于父向子組件通過 props 傳值是響應式的,使用 ES6 解構會消除響應特性,所以使用 toRefs 。

  1. <script setup> 
  2.  const props = defineProps({ 
  3.   selectNum:Number, 
  4.   allNum:Number, 
  5.  }) 
  6.  const { selectNum, allNum } = toRefs(props) 
  7. </script> 

toRef 也是解構數據,主要是對可選參數處理,運行時先檢查 解構的數據中是否存在該屬性,如果存在就繼承,不存在則會創建一個屬性,這樣就不會報錯了。

  1. const str = toRef( props, 'str' ) 

10、watch、watchEffect 新用法

watch 、watchEffect 都是偵聽器。

watch 會監聽某個基礎類型數據或引用數據類型的某個具體屬性。

vue3 使用 watch 之前,必須引入。

  1. //vue2 
  2. watch:{ 
  3.  mood(curVal,preVal){ 
  4.   console.log('cur',curVal);//最新值 
  5.   console.log('pre',preVal);//修改之前的值 
  6.  } 
  7.  
  8. //vue3 
  9. import { watch } from "vue" 
  10. watch( 
  11.  name , 
  12.  ( curVal , preVal )=>{ //業務處理  }, 
  13.  options 

 watchEffect 監聽的是引用數據類型的所有屬性,不需要指定是哪個具體的屬性,一旦運行,就會立刻執行。

watchEffect 使用之前也必須引入。

  1. import { watchEffect } from "vue" 
  2. let obj = reactive({ name:'qq',sex:'女'}) 
  3. watchEffect(() => { 
  4.  console.log('name',obj.name); 
  5.  console.log('sex' , obj.sex); 
  6. }) 

 watch 與 watchEffect 對比:

  1. watch 運行的時候不會立刻執行, watchEffect 立即執行。
  2. watch 更加具體,需要指定監聽的誰,watchEffect 不要執行具體監聽誰,回調函數內直接使用就可以,比較抽象。
  3. watch 回調內可以訪問到修改之前的值,watchEffect 只能訪問最新的值。
  4. watch 可通過配置實現 watchEffect 的前兩個特性。

11、computed 新用法

computed 計算屬性

選項式 API 中 vue2 和 vue3 使用相同。

組合式 API 中,使用之前需要引入。

  1. // 選項式 
  2. computed:{ 
  3.  sum(){ 
  4.   return this.num1+ this.num2 
  5.  } 
  6.  
  7. //組合式 
  8. import { ref, computed } from "vue" 
  9. export default
  10.  setup(){ 
  11.   const num1 = ref(1) 
  12.   const num2 = ref(1) 
  13.   let sum = computed(()=>{ 
  14.    return num1.value + num2.value 
  15.   }) 
  16.  } 

 或者,它可以使用一個帶有 get 和 set 函數的對象來創建一個可寫的對象。

  1. let mul = computed({ 
  2.  get:()=>{ 
  3.   return num1.value *10 
  4.  }, 
  5.  set:(value)=>{ 
  6.   return num1.value = value/10 
  7.  } 
  8. }) 

 在vue3.2+內,computed 可接受一個帶有 onTrack 和 onTrigger 選項的對象作為第二個參數:

  • onTrack 會在某個響應式 property 或 ref 作為依賴被追蹤時調用。
  • onTrigger 會在偵聽回調被某個依賴的修改觸發時調用。

12、provide / inject

provide/inject 類似于消息的訂閱和發布,provide 提供或發送數據或方法, inject 接收數據或方法。

優點:組件嵌套層級較多,父組件向子組件、多個孫組件傳值時,傳遞數據需要一級一級向下傳遞,比較麻煩,使用 project 和 inject 很方便地解決了這個問題。

  1. //vue2 
  2. export default
  3.  provide:{ 
  4.   info:"提供數據" 
  5.  } 
  6. //接收數據 
  7. export default
  8.  inject:['info'], 
  9.  mounted(){ 
  10.     console.log("接收數據:", this.info) // 接收數據:提供數據 
  11.  } 
  12. }  
  13.  
  14. //vue3 
  15. <script setup> 
  16.  import { provide } from "vue" 
  17.  provide( 'info'"值" ) 
  18. </script> 
  19. //接收數據 
  20. <script setup> 
  21.  import { inject } from "vue" 
  22.  const info = inject( 'info'"設置默認值" ) 
  23. </script> 

13、readonly

readonly 只讀函數,使用之后該數據只能使用,不能修改,修改時會有警告。

父子組件之間傳值時,如果傳遞的是響應式數據,子組件修改的時候,父組件的也會更新,這樣就容易造成狀態混亂,不符合 vue 的單項數據流。

如果使用 readonly ,保證數據在其他組件內只能使用,并不能修改,規避混亂。

14、獲取真實DOM

vue2 使用 $ref 獲取真實DOM。

vue3 使用 ref 獲取真實DOM。與上述的 ref 不同。

  1. <div ref="box" class="test" id="boxtest">獲取真實DOM</div> 
  2.  
  3. //vue2 
  4. <script> 
  5.  export default
  6.   mounted(){ 
  7.    console.log('box', this.$refs.box); 
  8.   } 
  9.  } 
  10. </script> 
  11.  
  12. //vue3 
  13. <script setup> 
  14.  const box = ref(null
  15.   onMounted(()=>{ 
  16.   console.log('box',box.value); 
  17.  })   
  18. </script> 

15、vue3 中的 vuex4

createStore 函數創建新的 store 實例。使用之前需要先引入。

  1. import { createApp } from 'vue' 
  2. import App from './App.vue' 
  3. import { createStore } from "vuex" 
  4.  
  5. const store = createStore({ 
  6.  state(){ 
  7.   return
  8.    num:1, 
  9.   } 
  10.  } 
  11. }) 
  12.  
  13. const app = createApp(App) 
  14. app.use(store) 
  15. app.mount('#app'

 組件內使用 store 時,通過 useStore 引入,使用之前也需要引入。

  1. import { useStore } from "vuex" 
  2. const store = useStore() 

使用的時候,與低版本都是一樣的。使用 state 內數據時,可以通過 toRefs 解構。

16、v-slot

v-slot 指令只能用在 template 或組件上,否則就會報錯。

簡化 slot、slot-scope 作用域插槽的功能,相比更加強大,代碼效率更高。

使用:

  1. <child-com> 
  2.  <template v-slot:header> 
  3.   頭部 
  4.  </template> 
  5.  <template v-slot:body> 
  6.   內容 
  7.  </template> 
  8. </child-com> 

簡寫:

  1. <child-com> 
  2.  <template #header> 
  3.   頭部 
  4.  </template> 
  5.  <template #body> 
  6.   內容 
  7.  </template> 
  8. </child-com> 

17、vue3 中的 vue-router4

createRouter 創建 router 實例,之前的 mode 改為 history 。

  1. import { createRouter,createWebHashHistory } from "vue-router"
  2.  
  3. const routes = [] 
  4.  
  5. const router = createRouter({ 
  6.  history:createWebHashHistory('/'), 
  7.  routes 
  8. }) 
  9.  
  10. export default router 

 在 main.js 內引入的時候,通過 use 引用。

  1. import { createApp } from 'vue' 
  2. import App from './App.vue' 
  3. import router from "./router/index" 
  4.  
  5. const app = createApp(App) 
  6. app.use(router) 
  7. app.mount('#app'

 關于 vue-router4 更新挺多的,更多知識請閱讀《 vue-router 4 你真的熟練嗎?》文章。

18、render

在 vue3 中,render 函數的參數發生了改變,之前的 h 去掉,變成全局引入,虛擬節點具備扁平的屬性結構。

vue3中 render 應用

  1. import { h } from "vue" 
  2. export default { 
  3.  render(){ 
  4.   return h("div", {}, content) 
  5.  } 

 【編輯推薦】

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2020-10-26 10:40:31

Axios前端攔截器

2021-05-12 10:25:29

開發技能代碼

2024-03-05 08:33:52

OptionsAPIcomuted

2024-04-02 08:50:08

Go語言react

2010-08-06 10:51:16

使用IBM DB2

2022-11-28 08:02:17

DNSIP計算機

2024-03-12 12:27:00

Vue 3前端開發

2021-05-12 10:25:53

組件驗證漏洞

2025-02-25 08:51:19

2010-08-17 14:56:00

HCNE認證

2011-04-15 12:25:21

BGP路由

2021-12-01 08:11:44

Vue3 插件Vue應用

2016-05-30 17:31:34

Spring框架

2021-11-30 08:19:43

Vue3 插件Vue應用

2023-11-28 09:03:59

Vue.jsJavaScript

2021-12-02 05:50:35

Vue3 插件Vue應用

2020-09-19 21:15:26

Composition

2018-08-10 11:20:35

編程語言Python網絡爬蟲

2021-04-13 08:25:12

測試開發Java注解Spring

2011-04-01 15:28:40

Zabbix配置安裝
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天堂网中文 | 黄网站在线播放 | 成人免费大片黄在线播放 | 操夜夜 | 欧美精品一区二区三区在线播放 | 在线视频日韩 | 久久精品亚洲精品国产欧美 | 一级一片在线观看 | 国产精品一区二区在线 | 日本在线免费 | 日韩www| 精品国产一区二区三区久久久四川 | 久久精彩视频 | 三级视频网站 | 91视频久久 | 久久91| 国产亚韩| 国产一区不卡在线观看 | 中文字幕国产视频 | 伊人网站视频 | 欧美专区在线 | 国产精品99久久久久久人 | 亚洲成人av一区二区 | 国产高清在线观看 | 中文在线a在线 | 日韩三级在线观看 | 污片在线观看 | 国产精品不卡 | 一区二区三区日本 | 精品成人69xx.xyz | 国产在线97 | av中文字幕在线观看 | 亚洲毛片在线观看 | 国产精品国产三级国产aⅴ原创 | 欧美日韩在线成人 | 精品国产91久久久久久 | 亚洲一区二区久久 | 中文字幕1区 | 国产一区三区在线 | 在线播放国产一区二区三区 | 精品一二三 |