Vue3.0入門教程

目錄
一、組合API
二、帶ref響應(yīng)式變量
三、帶reactive響應(yīng)式變量
四、computed計(jì)算屬性
五、watch響應(yīng)式更改
六、props傳值
七、emit回調(diào)
八、provide/inject

一、 組合API

通過創(chuàng)建 Vue 組件,我們可以將接口的可重復(fù)部分及其功能提取到可重用的代碼段中。僅此一項(xiàng)就可以使我們的應(yīng)用程序在可維護(hù)性和靈活性方面走得更遠(yuǎn)。然而,我們的經(jīng)驗(yàn)已經(jīng)證明,光靠這一點(diǎn)可能是不夠的,尤其是當(dāng)你的應(yīng)用程序變得非常大的時(shí)候——想想幾百個(gè)組件。在處理如此大的應(yīng)用程序時(shí),共享和重用代碼變得尤為重要。
用組件的選項(xiàng) (data、computed、methods、watch) 組織邏輯在大多數(shù)情況下都有效。然而,當(dāng)我們的組件變得更大時(shí),邏輯關(guān)注點(diǎn)的列表也會(huì)增長(zhǎng)。這可能會(huì)導(dǎo)致組件難以閱讀和理解,尤其是對(duì)于那些一開始就沒有編寫這些組件的人來說。這種碎片化使得理解和維護(hù)復(fù)雜組件變得困難。選項(xiàng)的分離掩蓋了潛在的邏輯問題。此外,在處理單個(gè)邏輯關(guān)注點(diǎn)時(shí),我們必須不斷地“跳轉(zhuǎn)”相關(guān)代碼的選項(xiàng)塊。
如果我們能夠?qū)⑴c同一個(gè)邏輯關(guān)注點(diǎn)相關(guān)的代碼配置在一起會(huì)更好。而這正是組合式 API 使我們能夠做到的。

<template>
 <h2>{{userName}}</h2>
</template>
<script>
export default {
  components: {},
  props: {
  },
  setup(props) {
    let userName = '星星編程';
    return {userName} 
  }
}
</script>

二、 帶ref響應(yīng)式變量

ref 接受參數(shù)并返回它包裝在具有 value property 的對(duì)象中,然后可以使用該 property 訪問或更改響應(yīng)式變量的值。

<template>
 <h2>{{userName}}</h2>
 <input type="text" v-model="userName" />
</template>
<script>
import { ref } from 'vue'
export default {
  setup(props) {
    let userName = ref('星星編程');
    return {userName} 
  }
}
</script>

三、帶reactive響應(yīng)式變量

reactive 返回對(duì)象的響應(yīng)式副本。響應(yīng)式轉(zhuǎn)換是“深層”的——它影響所有嵌套 property。在基于 ES2015 Proxy 的實(shí)現(xiàn)中,返回的 proxy 是不等于原始對(duì)象的。建議只使用響應(yīng)式 proxy,避免依賴原始對(duì)象。

<template>
 <h2>姓名:{{userName}}</h2>
 <h2>性別:{{sex}}</h2>
 <h2>職業(yè):{{job}}</h2>
</template>
<script>
import { reactive, toRefs} from 'vue'
export default {
  setup(props) {
    let user  = reactive({
        userName:'星星編程',
        sex:'男',
        job:'前端開發(fā)工程師'
    });
    return {
        ...toRefs(user)
    } 
  }
}
</script>

四、computed計(jì)算屬性

computed使用 getter 函數(shù),并為從 getter 返回的值返回一個(gè)不變的響應(yīng)式 ref 對(duì)象。
computed 函數(shù)返回一個(gè)作為 computed 的第一個(gè)參數(shù)傳遞的 getter 類回調(diào)的輸出的一個(gè)只讀的響應(yīng)式引用。為了訪問新創(chuàng)建的計(jì)算變量的 value,我們需要像使用 ref 一樣使用 .value property。

<template>
 <h2>{{tip}}</h2>
</template>
<script>
import { computed } from 'vue'
export default {
  setup(props) {
    let userName = '星星編程';
    let tip = computed(()=>{
         return '歡迎關(guān)注' + userName + '微信公眾號(hào)!' ;
     })
    return {
       tip
    } 
  }
}
</script>

五、watch響應(yīng)式更改

watch 需要偵聽特定的數(shù)據(jù)源,并在單獨(dú)的回調(diào)函數(shù)中執(zhí)行副作用。默認(rèn)情況下,它也是惰性的——即回調(diào)僅在偵聽源發(fā)生更改時(shí)調(diào)用。

<template>
  <h2>count:{{ count }}</h2>
  <button @click="random">隨機(jī)數(shù)</button>
</template>
<script>
import { reactive, toRefs, watch } from "vue";
export default {
  setup() {
    const state = reactive({ count: 0 });
    watch(
      () => state.count,
      (count, prevCount) => {
          console.log(prevCount);
      }
    );
    function random() {
      state["count"] = Math.round(Math.random()*10000) ;
    }
    return { ...toRefs(state), random };
  },
};
</script>

六、props傳值

1、父組件通過userName屬性將userName傳遞給子組件DemoComponent。

<template>
 <DemoComponent :userName='userName'></DemoComponent>
</template>
<script>
import DemoComponent from '@src/components/DemoComponent.vue';
export default {
  components:{ DemoComponent },
  setup(props) {
    let userName = '星星編程';
    return {
       userName
    } 
  }
}
</script>

2、子組件DemoComponent接收父組件傳遞userName參數(shù)。

<template>
 <h2>{{userName}}</h2>
</template>
<script>
export default {
  props: {
    userName: String
  },
  setup(props) {
    let userName = props.userName;
    return {
       userName
    } 
  }
}
</script>

七、emit回調(diào)

1、父組件實(shí)現(xiàn)子組件DemoComponent的callback函數(shù),并將接收到tip參數(shù)顯示到<h2>標(biāo)簽里。

<template>
<h2>{{userName}}</h2>
 <DemoComponent @callback='showTip'></DemoComponent>
</template>
<script>
import { ref } from 'vue'
import DemoComponent from '@src/components/DemoComponent.vue';
export default {
  components:{ DemoComponent },
  setup(props,content) {
    let userName = ref('星星編程');
    function showTip(tip){
       userName.value = tip;
    }
    return {
       userName,
       callback
    } 
  }
}
</script>

2、子組件DemoComponent通過content.emit實(shí)現(xiàn)callback回調(diào)。

<template>
 <button @click='done'>emit回調(diào)</button>
</template>
<script>
export default {
  props: {
    userName: String
  },
  setup(props,content) {
    function done() {
      content.emit('callback','歡迎關(guān)注星星編程微信公眾號(hào)!')
    }
    return {
        done
    } 
  }
}
</script>

八、provide/inject

provide/inject兩者都只能在當(dāng)前活動(dòng)實(shí)例的 setup() 期間調(diào)用。
1、在 setup() 中使用 provide 時(shí),我們首先從 vue 顯式導(dǎo)入 provide 方法。這使我們能夠調(diào)用 provide 時(shí)來定義每個(gè) property。
provide 函數(shù)允許你通過兩個(gè)參數(shù)定義 property:
property 的 name (<String> 類型)
property 的 value

<template>
<h2>provide/inject</h2>
<DemoComponent></DemoComponent>
</template>
<script>
import { ref,provide } from 'vue'
import DemoComponent from '@src/components/DemoComponent.vue';
export default {
  components:{ DemoComponent },
  setup() {
    let userName = ref('星星編程');
    provide('userName', userName);
  }
}
</script>

2、在 setup() 中使用 inject 時(shí),還需要從 vue 顯式導(dǎo)入它。一旦我們這樣做了,我們就可以調(diào)用它來定義如何將它暴露給我們的組件。
inject 函數(shù)有兩個(gè)參數(shù):
要 inject 的 property 的名稱
一個(gè)默認(rèn)的值 (可選)

<template>
  <h2>{{ userName }}</h2>
</template>
<script>
import { inject } from "vue";
export default {
  setup() {
    const userName = inject("userName", "默認(rèn)名字");
    return {
      userName,
    };
  },
};
</script>

3、provide/inject和props傳值、emit回調(diào)相比傳參更加方便,而且可以跨組件傳參。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容