久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      什么是語(yǔ)法糖?Vue3.2中怎么使用語(yǔ)法糖?

      Vue中怎么使用語(yǔ)法糖?下面本篇文章帶大家了解一下語(yǔ)法糖,并介紹一下Vue3.2語(yǔ)法糖的使用方法,希望對(duì)大家有所幫助!

      什么是語(yǔ)法糖?Vue3.2中怎么使用語(yǔ)法糖?

      前端(vue)入門(mén)到精通課程,老師在線輔導(dǎo):聯(lián)系老師
      Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調(diào)試工具:點(diǎn)擊使用

      一. 概述

      Vue2時(shí)期,組件里定義的各類(lèi)變量、方法、計(jì)算屬性等是分別存放到datamethods、computed等選項(xiàng)里,這樣編寫(xiě)的代碼不便于后期的查閱,查找一個(gè)業(yè)務(wù)邏輯需要在各個(gè)選項(xiàng)來(lái)回切換。vue3.0組合式APIsetup函數(shù)的推出就是為了解決這個(gè)問(wèn)題,它讓我們的邏輯關(guān)注點(diǎn)更加集中,語(yǔ)法也更加精簡(jiǎn),但是當(dāng)我們?cè)谑褂?code>vue3.0的語(yǔ)法就構(gòu)建組件的時(shí)候,總是需要把外面定義的方法變量必須要return出去才能在<template>,比較麻煩一些. vue3.2語(yǔ)法糖的出現(xiàn)以及一些新增的API,讓我們的代碼進(jìn)一步簡(jiǎn)化?!緦W(xué)習(xí)視頻分享:vue視頻教程、web前端視頻】

      什么是語(yǔ)法糖?

      語(yǔ)法糖(英語(yǔ):Syntactic sugar)是由英國(guó)計(jì)算機(jī)科學(xué)家彼得·蘭丁發(fā)明的一個(gè)術(shù)語(yǔ),指計(jì)算機(jī)語(yǔ)言中添加的某種語(yǔ)法,這種語(yǔ)法對(duì)語(yǔ)言的功能沒(méi)有影響,但是更方便程序員使用。語(yǔ)法糖讓程序更加簡(jiǎn)潔,有更高的可讀性。

      Vue3.2語(yǔ)法糖

      來(lái)看下vue3.0vue3.2的單文件組件(SFC,即.vue 文件)的結(jié)構(gòu)對(duì)比

      • vue3.0組件

      <template>     <div>     </div> </template> <script> export default {     components: {     },     props: {     },     setup () {         return {}     } } </script> <style scoped> </style>
      登錄后復(fù)制

      • vue3.2組件

      <template>     <MyTestVue :title="title" @click="changeTitle" /> </template> <script setup> import MyTestVue from './MyTest.vue'; import { ref } from 'vue'; const title = ref('測(cè)試一下') const changeTitle = () => {     title.value = 'Hello,World' } </script> <style scoped> </style>
      登錄后復(fù)制

      • 對(duì)比vue3.0vue3.2版本的組件模板,最主要的變化是3.2中沒(méi)有了setup函數(shù),而是把它放在了script標(biāo)簽中。

      • 我們定義的屬性和方法也不用在return中返回,直接就可以用在模板語(yǔ)法中 …

        這些是直觀的變化,接下來(lái)我們學(xué)習(xí)具體的用法。

      二.使用介紹

      1.組件注冊(cè)

      vue3.0中使用組件,需要使用 components 選項(xiàng)來(lái)顯式注冊(cè):

      <script> import ComponentA from './ComponentA.js'  export default {   components: {     ComponentA   },   setup() {     // ...   } } </script>
      登錄后復(fù)制

      vue3.2 <script setup> 的單文件組件中,導(dǎo)入的組件可以直接在模板中使用,組件會(huì)自動(dòng)注冊(cè),并且無(wú)需指定當(dāng)前組件的名字,它會(huì)自動(dòng)以文件名為主,也就是不用再寫(xiě)name屬性了。

      <script setup> import ComponentA from './ComponentA.vue' </script>  <template>   <ComponentA /> </template>
      登錄后復(fù)制

      2.Props 聲明

      vue3.0中,prop可以使用props選項(xiàng)來(lái)聲明

      <script> export default {   props: ['foo'],   // 或者用這種方式指類(lèi)型與默認(rèn)值   // props: {   //   foo:{   //     type: String,   //     default: ''   //   },   // },   setup(props) {     // setup() 接收 props 作為第一個(gè)參數(shù)     console.log(props.foo)   } } </script>
      登錄后復(fù)制

      vue3.2組件中,props可以使用defineProps()宏來(lái)聲明

      <script setup> const props = defineProps(['foo']) // 或者 const propsOther = defineProps({   title: String,   likes: Number })  console.log(props.foo) </script>
      登錄后復(fù)制

      注意事項(xiàng):所有的 props 都遵循著單向綁定原則,props 因父組件的更新而變化,自然地將新的狀態(tài)向下流往子組件,而不會(huì)逆向傳遞,這意味著你不應(yīng)該在子組件中去更改一個(gè) prop。

      3.計(jì)算屬性

      我們一般使用計(jì)算屬性來(lái)描述依賴響應(yīng)式狀態(tài)的復(fù)雜邏輯。說(shuō)白了就是這個(gè)計(jì)算屬性的值依賴于其他響應(yīng)式屬性的值,依賴的屬性發(fā)生變化,那么這個(gè)計(jì)算屬性的值就會(huì)進(jìn)行重新計(jì)算。

      <script setup> import { ref, computed } from 'vue'  const firstName = ref('John') const lastName = ref('Doe')  const fullName = computed({   // getter   get() {     return firstName.value + ' ' + lastName.value   },   // setter   set(newValue) {     // 注意:我們這里使用的是解構(gòu)賦值語(yǔ)法     [firstName.value, lastName.value] = newValue.split(' ')   } }) </script>
      登錄后復(fù)制

      當(dāng)調(diào)用fullName.value = 'John Doe'時(shí),setter會(huì)被調(diào)用,而firstNamelastName會(huì)被更新,在vue3.2中我們可以直接在<template>標(biāo)簽中使用它,不在需要return返回。

      • 不要在計(jì)算函數(shù)中做異步請(qǐng)求或者更改 DOM!
      • 一個(gè)計(jì)算屬性僅會(huì)在其響應(yīng)式依賴更新時(shí)才重新計(jì)算,如果他依賴的是個(gè)非響應(yīng)式的依賴,及時(shí)其值發(fā)生變化,計(jì)算屬性也不會(huì)更新。
      • 相比于方法而言,計(jì)算屬性值會(huì)基于其響應(yīng)式依賴被緩存,一個(gè)計(jì)算屬性僅會(huì)在其響應(yīng)式依賴更新時(shí)才重新計(jì)算

      4. watch

      在組合式API中,我們可以使用watch函數(shù)在每次響應(yīng)式狀態(tài)發(fā)生變化時(shí)觸發(fā)回調(diào)函數(shù),watch的第一個(gè)參數(shù)可以是不同形式的“數(shù)據(jù)源”:它可以是一個(gè) ref(包括計(jì)算屬性)、一個(gè)響應(yīng)式對(duì)象、一個(gè) getter 函數(shù)、或多個(gè)數(shù)據(jù)源組成的數(shù)組:watch()是懶執(zhí)行的:僅當(dāng)數(shù)據(jù)源變化時(shí),才會(huì)執(zhí)行回調(diào),例如:

      <script setup> import { ref,watch } from 'vue';  const props = defineProps({     title: String,     itemList: {         type: Array,         default: () => [{             text: 'title',             value: 0         }]     } })  watch(() => props.itemList.length,(newValue,oldValue) => {     console.log('newValue===',newValue);     console.log('oldValue===',oldValue); }) </script>
      登錄后復(fù)制

      這里監(jiān)聽(tīng)props.itemList.length,當(dāng)傳入的itemList數(shù)量發(fā)生變化時(shí),后面的回調(diào)方法會(huì)被調(diào)用。當(dāng)然wacth()還有第三個(gè)可選參數(shù):否開(kāi)啟深監(jiān)聽(tīng)(deep), 如果這里這樣寫(xiě):

      <script setup> import { ref,watch } from 'vue'; ... watch(() => props.itemList,(newValue,oldValue) => {     console.log('newValue===',newValue);     console.log('oldValue===',oldValue); }) </script>
      登錄后復(fù)制

      當(dāng)傳入的itemList數(shù)量發(fā)生改變時(shí),回調(diào)函數(shù)不會(huì)觸發(fā),正確的寫(xiě)法是加上其第三個(gè)參數(shù)deep:true

      <script setup> import { ref,watch } from 'vue'; ... watch(() => props.itemList,(newValue,oldValue) => {     console.log('newValue===',newValue);     console.log('oldValue===',oldValue); },{deep:true}) </script>
      登錄后復(fù)制

      watch也可以同時(shí)監(jiān)聽(tīng)多個(gè)屬性:

      <script setup> import { ref,watch } from 'vue';  const props = defineProps({     title: String,     itemList: {         type: Array,         default: () => [{             text: 'title',             value: 0         }]     } }) // 同時(shí)監(jiān)聽(tīng)多個(gè)屬性 watch(() => [props.itemList,props.title],(newValue,oldValue) => {     console.log('newValue===',newValue);     console.log('oldValue===',oldValue); },{deep:true})    </script>
      登錄后復(fù)制

      5. watchEffect()

      watch()的懶執(zhí)行不同的是,watchEffect()會(huì)立即執(zhí)行一遍回調(diào)函數(shù),如果這時(shí)函數(shù)產(chǎn)生了副作用,Vue會(huì)自動(dòng)追蹤副作用的依賴關(guān)系,自動(dòng)分析出響應(yīng)源。上面的例子可以重寫(xiě)為:

      <script setup>   ... watchEffect(() => {     console.log('itemList===',props.itemList.length);     console.log('title===',props.title); }) </script>
      登錄后復(fù)制

      這個(gè)例子中,回調(diào)會(huì)立即執(zhí)行。在執(zhí)行期間,它會(huì)自動(dòng)追蹤props.itemList.length作為依賴(和計(jì)算屬性的行為類(lèi)似)。每當(dāng)傳入的itemList.length變化時(shí),回調(diào)會(huì)再次執(zhí)行。

      如果要清除watchEffect()的的監(jiān)聽(tīng),只需要顯示的調(diào)用watchEffect()的返回函數(shù)就可以了,例如:

      <script setup>   ... const stopEffect = watchEffect(() => {     console.log('itemList===',props.itemList.length);     console.log('title===',props.title); }) stopEffect() </script>
      登錄后復(fù)制

      watch 只追蹤明確偵聽(tīng)的數(shù)據(jù)源。它不會(huì)追蹤任何在回調(diào)中訪問(wèn)到的東西。另外,僅在數(shù)據(jù)源確實(shí)改變時(shí)才會(huì)觸發(fā)回調(diào)。我們能更加精確地控制回調(diào)函數(shù)的觸發(fā)時(shí)機(jī)。 watchEffect,則會(huì)在副作用發(fā)生期間追蹤依賴。它會(huì)在同步執(zhí)行過(guò)程中,自動(dòng)追蹤所有能訪問(wèn)到的響應(yīng)式屬性。

      6.組件的事件調(diào)用

      6.1 子組件調(diào)用父組件的方法

      vue3.0中如果我們的子組件觸發(fā)父組件的方法,我們的做法:

      子組件 <script> export default {   emits: ['inFocus', 'submit'],   setup(props, ctx) {     ctx.emit('submit',params)   } } // 或者將可以將emit解構(gòu)使用 export default {     setup(props,{emit}) {     emit('submit',params)   } } </script> 父組件 <template>     <Children @submit="submitHandel"/>   </div> </template>  <script> export default {   name: 'TodoItem',   setup(props, { emit }) {     const submitHandel = () => {       console.log('子組件調(diào)用了父組件的submitHandel方法');     }     return {       submitHandel,     }   } }; </script>
      登錄后復(fù)制

      vue3.2語(yǔ)法糖中,子組件要觸發(fā)的事件需要顯式地通過(guò) defineEmits() 宏來(lái)聲明

      子組件 <script setup> const emit = defineEmits(['inFocus', 'submit'])  function buttonClick(parmas) {   emit('submit', parmas) } </script> 父組件 <template>     <Children @submit="submitHandel"/>   </div> </template>  <script setup>   const submitHandel = () => {     console.log('子組件調(diào)用了父組件的submitHandel方法');   } }; </script>
      登錄后復(fù)制

      6.2 父組件調(diào)用子組件的方法或是屬性

      vue3.0中如果父組件觸發(fā)子組件的方法或是屬性,直接在return函數(shù)中返回就可以,數(shù)據(jù)都是默認(rèn)隱式暴露給父組件的。

      <script> // 子組件 setup(props, { emit }) {   const isShow = ref(false)   // 父組件調(diào)用這個(gè)方法   const showSubComponent = () => {     isShow.value = !isShow.value   }   return {       // return 返回       showSubComponent,     }   } </script>
      登錄后復(fù)制

      父組件中通過(guò)ref獲取到子組件,并對(duì)子組件暴露的方法進(jìn)行訪問(wèn)

      父組件 <template>   <div class="todo-list">     <TodoItemVue :itemList="itemList" @clickItemHandel="clickItemHandel" ref="todoItemVueRef" />   </div> </template> <script>   import { ref } from 'vue';   export default {   setup(props, { emit }) {     //獲取子組件ref     const todoItemVueRef = ref(null)     // 調(diào)用子組件的方法     const callItemFuncHandel = () => {         todoItemVueRef.value.showSubComponent()     }     return {      todoItemVueRef     }   } }; </script>
      登錄后復(fù)制

      vue3.2語(yǔ)法中,父組件的調(diào)用方式相同,子組件通過(guò)defineExpose()將方法或是屬性暴露出去

      子組件 <script setup> const isShow = ref(false) // 父組件調(diào)用這個(gè)方法 const showSubComponent = () => {     isShow.value = !isShow.value } // 通過(guò)defineExpose將方法暴露出去 defineExpose({     showSubComponent }) </script>  父組件 <template>   <div class="todo-list">     <TodoItemVue :itemList="itemList" @clickItemHandel="clickItemHandel" ref="todoItemVueRef" />   </div> </template> <script setup>   import { ref } from 'vue';   //獲取子組件ref   const todoItemVueRef = ref(null)   // 調(diào)用子組件的方法   const callItemFuncHandel = () => {       todoItemVueRef.value.showSubComponent()   } </script>
      登錄后復(fù)制

      7.Vuex的使用

      vue3.0vue3.2中創(chuàng)建Vuex沒(méi)有區(qū)別,只不過(guò)在<template>模板中使用Vuex的store有細(xì)微差別。

      import { createStore } from 'vuex'; import { ADD_ITEM_LIST, REDUCE_ITEM_LIST, CHANGE_ITEM_LIST_ASYNC } from './constants';  export default createStore({   state: {     itemList: [       { text: 'Learn JavaScript', done: true },       { text: 'Learn Vue', done: false },       { text: 'Build something awesome', done: false },     ],   },   getters: {     doneItemList: (state) => state.itemList.filter((todo) => todo.done),   },   mutations: {     // 使用ES2015風(fēng)格的計(jì)算屬性命名功能 來(lái)使用一個(gè)常量作為函數(shù)名     [ADD_ITEM_LIST](state, item) {       console.log('增加數(shù)據(jù)', item);       state.itemList.push(item);     },     [REDUCE_ITEM_LIST](state) {       console.log('減少數(shù)據(jù)');       state.itemList.pop();     },   },   actions: {     [CHANGE_ITEM_LIST_ASYNC]({ commit, state }, todoItem) {       /// 模擬網(wǎng)絡(luò)請(qǐng)求       setTimeout(() => {         commit(ADD_ITEM_LIST, todoItem);         console.log('state===', state);       }, 1000);     },   },   modules: {   }, });
      登錄后復(fù)制

      vue3.0中我們一般在return中對(duì)store.state進(jìn)行解構(gòu),然后可以直接在<template>中使用state中的值

      <template>   <div class="todo-item">     <ol>       <li v-for="(item,index) in itemList" :key="index" class="todos" @click="clickItem(index)">         {{ item.text }}       </li>     </ol>   </div> </template> <script>   export default {   name: 'TodoItem',   setup(props, { emit }) {     return {       // 對(duì)store.state進(jìn)行解構(gòu)       ...store.state,       clickItem,       count,       isShow,       showSubComponent,     }   } }; </script>
      登錄后復(fù)制

      vue3.2中沒(méi)有了return,需要我們顯示的獲取要使用的stare的值

      <template>   <div class="todo-item">     <ol>       <li v-for="(item,index) in itemList" :key="index" class="todos" @click="clickItem(index)">         {{ item.text }}       </li>     </ol>   </div> </template> <script setup> import { useStore } from 'vuex'; const store = useStore() // 獲取后在<template>中使用 const itemList = store.state.itemList </script>
      登錄后復(fù)制

      8. <style>中的 v-bind

      <style>中的 v-bind: 用于在 SFC <style> 標(biāo)簽中啟用組件狀態(tài)驅(qū)動(dòng)的動(dòng)態(tài) CSS 值

      <script setup> import { ref, watchEffect } from 'vue'; const color = ref('black') const callChangeColorHandel = () => {   if(color.value === 'black') {     color.value = 'red'   }else {     color.value = 'black'   } } </script> <style lang="scss" scoped> .todo-list {   color: v-bind(color); } </style>
      登錄后復(fù)制

      觸發(fā)callChangeColorHandel 函數(shù),在<style>中的v-bind指令可以動(dòng)態(tài)綁定的響應(yīng)式狀態(tài)。

      三. 總結(jié)

      整體來(lái)說(shuō),setup語(yǔ)法糖的引入簡(jiǎn)化了使用Composition API時(shí)冗長(zhǎng)的模板代碼,也就是讓代碼更加簡(jiǎn)潔,可讀性也更高。并且官方介紹vue3.2在界面渲染的速度以及內(nèi)存的使用量上都進(jìn)行了優(yōu)化,本文只是對(duì)setup語(yǔ)法糖的常用方式進(jìn)行了總結(jié),

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)