<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一篇文章上手Vue3中新增API

          共 5244字,需瀏覽 11分鐘

           ·

          2020-10-09 18:34


          作者:liulongbin
          http://www.liulongbin.top:8085/#/?id=_3-setup

          1. 初始化項(xiàng)目

          //?①?npm?i?-g?@vue/cli
          //?②?vue?create?my-project
          //?③?npm?install?@vue/composition-api?-S

          //?④?main,js
          import?Vue?from?'vue'
          import?VueCompositionApi?from?'@vue/composition-api'
          Vue.use(VueCompositionApi)

          2. setup方法

          setup是vue3.x中新的操作組件屬性的方法,它是組件內(nèi)部暴露出所有的屬性和方法的統(tǒng)一API。

          2.1 執(zhí)行時(shí)機(jī)

          setup的執(zhí)行時(shí)機(jī)在:beforeCreate 之后 created之前

          setup(props,?ctx)?{
          ????console.log('setup')
          ??},
          ??beforeCreate()?{
          ????console.log('beforeCreate')
          ??},
          ??created()?{
          ????console.log('created')
          ??},

          2.2 接受props數(shù)據(jù)

          "傳值給?com-setup"/>

          //?通過 setup 函數(shù)的第一個(gè)形參,接收 props 數(shù)據(jù):
          setup(props)?{
          ??console.log(props)
          },
          //?在 props 中定義當(dāng)前組件允許外界傳遞過來的參數(shù)名稱:
          props:?{
          ????p1:?String
          }
          /*
          {}
          p1:?"傳值給 com-setup"
          get?p1:???reactiveGetter()
          set?p1:???reactiveSetter(newVal)
          __proto__:?Object
          */

          2.3 context

          setup 函數(shù)的第二個(gè)形參是一個(gè)上下文對(duì)象,這個(gè)上下文對(duì)象中包含了一些有用的屬性,這些屬性在 vue 2.x 中需要通過 this 才能訪問到,在 vue 3.x 中,它們的訪問方式如下:

          setup(props,?ctx)?{
          ????console.log(ctx)
          ????console.log(this)?//?undefined
          ??},
          /*
          attrs:?Object
          emit:???()
          listeners:?Object
          parent:?VueComponent
          refs:?Object
          root:?Vue
          ...
          */

          注意:在 setup() 函數(shù)中無法訪問到 this

          3. reactive

          reactive函數(shù)接收一個(gè)普通函數(shù),返回一個(gè)響應(yīng)式的數(shù)據(jù)對(duì)象。

          reactive函數(shù)等價(jià)于 vue 2.x 中的 Vue.observable() 函數(shù),vue 3.x 中提供了 reactive() 函數(shù),用來創(chuàng)建響應(yīng)式的數(shù)據(jù)對(duì)象,基本代碼示例如下:





          4. ref

          ref() 函數(shù)用來根據(jù)給定的值創(chuàng)建一個(gè)響應(yīng)式的數(shù)據(jù)對(duì)象,ref() 函數(shù)調(diào)用的返回值是一個(gè)對(duì)象,這個(gè)對(duì)象上只包含一個(gè) .value 屬性:





          4.1 在 reactive 對(duì)象中訪問 ref 創(chuàng)建的響應(yīng)式數(shù)據(jù)

          當(dāng)把 ref() 創(chuàng)建出來的響應(yīng)式數(shù)據(jù)對(duì)象,掛載到 reactive() 上時(shí),會(huì)自動(dòng)把響應(yīng)式數(shù)據(jù)對(duì)象展開為原始的值,不需通過 .value 就可以直接被訪問,例如:

          setup()?{
          ??const?refCount?=?ref(0)
          ??const?state?=?reactive({refCount})
          ??console.log(state.refCount)?//?輸出?0
          ??state.refCount++?//?此處不需要通過?.value?就能直接訪問原始值
          ??console.log(refCount)?//?輸出?1
          ??return?{
          ????refCount
          ??}
          }

          注意:新的 ref 會(huì)覆蓋舊的 ref,示例代碼如下:

          setup()?{
          ??//?創(chuàng)建?ref?并掛載到?reactive?中
          ??const?c1?=?ref(0);
          ??const?state?=?reactive({?c1?});

          ??//?再次創(chuàng)建?ref,命名為?c2
          ??const?c2?=?ref(9);
          ??//?將?舊?ref?c1?替換為?新?ref?c2
          ??state.c1?=?c2;
          ??state.c1++;

          ??console.log(state.c1);?//?輸出?10
          ??console.log(c2.value);?//?輸出?10
          ??console.log(c1.value);?//?輸出?0
          }

          5. isRef

          isRef() 用來判斷某個(gè)值是否為 ref() 創(chuàng)建出來的對(duì)象;應(yīng)用場景:當(dāng)需要展開某個(gè)可能為 ref() 創(chuàng)建出來的值的時(shí)候,例如:

          import?{?ref,?reactive,?isRef?}?from?"@vue/composition-api";
          export?default?{
          ??setup()?{
          ????const?unwrapped?=?isRef(foo)???foo.value?:?foo
          ??}
          };

          6. toRefs

          toRefs() 函數(shù)可以將 reactive() 創(chuàng)建出來的響應(yīng)式對(duì)象,轉(zhuǎn)換為普通的對(duì)象,只不過,這個(gè)對(duì)象上的每個(gè)屬性節(jié)點(diǎn),都是 ref() 類型的響應(yīng)式數(shù)據(jù)。





          7. computed計(jì)算屬性

          7.1 只讀的計(jì)算屬性




          7.2 可讀可寫的計(jì)算屬性




          8. watch

          watch() 函數(shù)用來監(jiān)視某些數(shù)據(jù)項(xiàng)的變化,從而觸發(fā)某些特定的操作,使用之前需要按需導(dǎo)入:

          import?{?watch?}?from?'@vue/composition-api'

          8.1 基本用法




          8.2 監(jiān)視數(shù)據(jù)源

          監(jiān)視 reactive 類型的數(shù)據(jù)源:





          監(jiān)視 ref 類型的數(shù)據(jù)源:

          export?default?{
          ??setup()?{
          ????//?定義數(shù)據(jù)源
          ????let?count?=?ref(0);
          ????//?指定要監(jiān)視的數(shù)據(jù)源
          ????watch(count,?(count,?prevCount)?=>?{
          ??????console.log(count,?prevCount)
          ????})
          ????setInterval(()?=>?{
          ??????count.value?+=?2
          ????},?2000)
          ????console.log(count.value)
          ????return?{
          ??????count
          ????}
          ??}
          };

          8.3 監(jiān)聽多個(gè)數(shù)據(jù)源

          監(jiān)視 reactive 類型的數(shù)據(jù)源:

          export?default?{
          ??setup()?{
          ????const?state?=?reactive({count:?100,?name:?'houfei'})
          ????watch(
          ??????//?監(jiān)聽count?name
          ??????[()?=>?state.count,?()?=>?state.name],
          ??????//?如果變換?執(zhí)行以下函數(shù)
          ??????([newCount,?newName],?[oldCount,?oldName])?=>?{
          ????????console.log(newCount,?oldCount)
          ????????console.log(newName,?oldName)
          ??????},
          ??????{?lazy:?true}?//?在?watch?被創(chuàng)建的時(shí)候,不執(zhí)行回調(diào)函數(shù)中的代碼
          ????)
          ????setTimeout(()?=>?{
          ??????state.count?+=?2
          ??????state.name?=?'qweqweewq'
          ????},?3000)
          ????return?state
          ??}
          };

          監(jiān)視 ref 類型的數(shù)據(jù)源:

          export?default?{
          ??setup()?{
          ????//?定義數(shù)據(jù)源
          ????const?count?=?ref(10)
          ????const?name?=?ref('zs')
          ????//?指定要監(jiān)視的數(shù)據(jù)源
          ????watch(
          ??????[count,?name],
          ??????([newCount,?newName],?[oldCount,?oldName])?=>?{
          ????????console.log(newCount,?oldCount)
          ????????console.log(newName,?oldName)
          ??????},
          ??????{?lazy:?true}
          ????)
          ????setInterval(()?=>?{
          ??????count.value?+=?2
          ????},?2000)
          ????console.log(count.value)
          ????return?{
          ??????count
          ????}
          ??}
          };

          8.4 清除監(jiān)視

          在 setup() 函數(shù)內(nèi)創(chuàng)建的 watch 監(jiān)視,會(huì)在當(dāng)前組件被銷毀的時(shí)候自動(dòng)停止。如果想要明確地停止某個(gè)監(jiān)視,可以調(diào)用 watch() 函數(shù)的返回值即可,語法如下:



          8.5 在watch中清除無效的異步任務(wù)

          有時(shí)候,當(dāng)被 watch 監(jiān)視的值發(fā)生變化時(shí),或 watch 本身被 stop 之后,我們期望能夠清除那些無效的異步任務(wù),此時(shí),watch 回調(diào)函數(shù)中提供了一個(gè) cleanup registrator function 來執(zhí)行清除的工作。這個(gè)清除函數(shù)會(huì)在如下情況下被調(diào)用:

          watch 被重復(fù)執(zhí)行了

          watch 被強(qiáng)制 stop 了

          Template 中的代碼示例如下:



          Script 中的代碼示例如下:



          9. provide & inject 組件傳值

          provide() 和 inject() 可以實(shí)現(xiàn)嵌套組件之間的數(shù)據(jù)傳遞。這兩個(gè)函數(shù)只能在 setup() 函數(shù)中使用。父級(jí)組件中使用 provide() 函數(shù)向下傳遞數(shù)據(jù);子級(jí)組件中使用 inject() 獲取上層傳遞過來的數(shù)據(jù)。

          9.1 共享普通數(shù)據(jù)

          app.vue 根組件:






          06.son.vue son 組件:





          07.grandson.vue son 組件:





          9.2 共享ref響應(yīng)式數(shù)據(jù)

          app.vue 根組件:





          06.son.vue son 組件:





          07.grandson.vue son 組件:

          template>
          ??

          ????"{color:?color}">grandson?組件
          ??





          10. 節(jié)點(diǎn)的引用 template ref

          10.1 dom的引用




          10.2 組件的引用

          App父組件:





          06.son.vue子組件:





          11 nextTick






          學(xué)習(xí)交流

          • 關(guān)注公眾號(hào)【前端宇宙】,每日獲取好文推薦
          • 添加微信,入群交流

          “在看和轉(zhuǎn)發(fā)”就是最大的支持
          瀏覽 41
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人看片黄a免费看视频 | 欧美www网站 | 国产黄色影片免费 | 一级a一级a爰片免费免软件ww | 日韩三级欧美激情 |