Vue3教程-使用Vue3新特性創(chuàng)建一個(gè)簡(jiǎn)單App

Vue3目前還沒(méi)有文檔仔蝌,但git上面卻有些樣本,本來(lái)打算但拿它的樣本去寫(xiě)一個(gè)tutorial,但發(fā)現(xiàn)已經(jīng)有人寫(xiě)了挡育,而且寫(xiě)得很好。此文是我按著他的文章內(nèi)容用自己的系統(tǒng)環(huán)境走了一遍編寫(xiě)朴爬,大多數(shù)只是翻譯過(guò)來(lái)即寒。
相關(guān)參考:
https://vuejsdevelopers.com/2020/03/16/vue-js-tutorial/
https://github.com/vuejs/vue-next-webpack-preview
開(kāi)發(fā)環(huán)境:
window10 x64
node v10.16.3
npm v6.13.4

1.Vue3安裝和設(shè)置

首先,我們需要把項(xiàng)目vue-next-webpack-preview復(fù)制過(guò)來(lái),此項(xiàng)目包含Vue的設(shè)置

 git clone https://github.com/vuejs/vue-next-webpack-preview.git vue3-experiment
 cd vue3-experiment
 npm i

當(dāng)我們復(fù)制完項(xiàng)目和安裝完node_modules之后召噩,我們需要把樣板的文件刪除,和重新創(chuàng)建一個(gè)新的main.js(window系統(tǒng)我找不到好命令母赵,只好全部刪了再重新創(chuàng)建)

rd -r "src" 
mkdir src
cd src
type > main.js

現(xiàn)在我們來(lái)運(yùn)行一下(記得把路徑切換回跟目錄,假如路徑還是‘src’的話具滴,執(zhí)行下‘cd ../’)

npm run dev

2.創(chuàng)建一個(gè)新的Vue app

以前我們會(huì)用new Vue()去創(chuàng)建應(yīng)用凹嘲,現(xiàn)在我們引入createApp方法去創(chuàng)建。
我們會(huì)調(diào)用createApp方法构韵,然后把我們定義的Vue實(shí)例對(duì)象作為參數(shù)傳入周蹭,之后createApp方法會(huì)返回一個(gè)app對(duì)象。
下一步疲恢,我們會(huì)調(diào)用app對(duì)象的mount方法谷醉,把我們css選擇器的元素傳進(jìn)去,這個(gè)就像我們之前的vue2的$mount方法一樣

//main.js

import { createApp } from "vue";

const app = createApp({
  // root instance definition
});

app.mount("#app");

為何要這么做
以前的話冈闭,我們會(huì)把一些全局寫(xiě)在這里(如plugins, mixins, prototype properties等等)俱尼,假如有多個(gè)app的話,會(huì)造成實(shí)例污染萎攒。

//main.js

// Affects both instances
Vue.mixin({ ... })

const app1 = new Vue({ el: '#app-1' })
const app2 = new Vue({ el: '#app-2' })

vue3的createApp會(huì)返回一個(gè)全新的app遇八,可以很好地避免這個(gè)問(wèn)題

3.添加state屬性

這里,我們會(huì)創(chuàng)建一個(gè)'計(jì)數(shù)'的app耍休,每次我們點(diǎn)擊按鈕刃永,計(jì)數(shù)都+1。
在Vue2羊精,我們可以在我們的app創(chuàng)建一個(gè)data對(duì)象斯够,data對(duì)象里有創(chuàng)建一個(gè)count屬性作為記錄計(jì)數(shù)。

//main.js

const app = createApp({
  data: {
    count: 0
  }
});

但現(xiàn)在不允許這樣干了喧锦,data對(duì)象必須通過(guò)工廠方法創(chuàng)建并返回读规,你必須要在Vue components中這么做。

//main.js

const app = createApp({
  data: () => ({
    count: 0
  })
});

為何要這么做
假如有些情況燃少,我們需要共享state呢束亏??jī)蓚€(gè)app之間的state會(huì)互相影響。

//main.js

const state = {
  sharedVal: 0
};

const app1 = new Vue({ state });
const app2 = new Vue({ state });

// Affects both instances
app1._data.sharedVal = 1;

但這方面的用例很少而且可以繞過(guò)阵具,而且這樣聲明很不友善碍遍,所以這種特征(feature定铜,或者說(shuō)這種寫(xiě)法吧)已經(jīng)決定移除。
我們來(lái)繼續(xù)剛才計(jì)數(shù)app,我們需要加一個(gè)方法去增加記錄計(jì)數(shù)(count),這一點(diǎn)和Vue 2沒(méi)什么不同

//main.js

const app = createApp({
  data: () => ({
    count: 0  
  }),
  methods: {
    inc() {
      this.count++;
    }
  }
});

4.使用root component

我們目前為止還有沒(méi)有component來(lái)瀏覽效果(文章說(shuō)在控制臺(tái)會(huì)出現(xiàn)‘Component is missing render function’的警告怕敬,但反正我看不到這個(gè)警告)揣炕。
現(xiàn)在我們來(lái)創(chuàng)建一個(gè)component來(lái)作為一個(gè)root實(shí)例。

cd src
type > App.vue

App.vue的內(nèi)容我們先不管东跪,現(xiàn)在我們可以獲取root實(shí)例用來(lái)渲染component了畸陡,在Vue2中,我們通常會(huì)用render方法去做:

//main.js

import App from "./App.vue";

const app = createApp({
  ...
  render: h => h(App)
});

app.mount("#app");

我們依然可以這么做越庇,但在Vue 3有一種更簡(jiǎn)單的方法罩锐,我們可以直接把root實(shí)例作為參數(shù)帶過(guò)去:

//main.js

import App from "./App.vue";

const app = createApp(App);

app.mount("#app");

這意味著App component不止用來(lái)渲染root實(shí)例,而且本身就是一個(gè)root實(shí)例卤唉。
至此涩惑,我們讓代碼再變簡(jiǎn)單點(diǎn)吧:

//main.js

createApp(App).mount("#app");

我們把之前計(jì)數(shù)的state和方法移動(dòng)到App.vue(root component)吧。

//App.vue

<script>
export default {
  data: () => ({
    count: 0  
  }),
  methods: {
    inc() {
      this.count++;
    }
  }
};
</script>

5.創(chuàng)建template

這個(gè)沒(méi)啥好說(shuō)桑驱,就是在root component添加template代碼竭恬,放一個(gè)按鈕,然后每點(diǎn)擊一次按鈕就+1熬的,我們?yōu)g覽器看到的就這個(gè)部分的內(nèi)容:

//App.vue

<template>
  <span>Button clicked {{ count }} times.</span>
  <button @click="inc">Inc</button>
</template>
<script>
...
</script>

以前的話痊硕,這樣寫(xiě)一定會(huì)報(bào)錯(cuò),因?yàn)橛袃蓚€(gè)root元素押框,template下面只能允許一個(gè)大的html元素岔绸,包含所有,但在Vue3橡伞,我們沒(méi)有這樣的強(qiáng)制(終于把單元素這種寫(xiě)法改掉了盒揉,以前一直就覺(jué)得有點(diǎn)受迫)。

6.Composition API

Composition API是Vue3的一個(gè)王牌兑徘。Composition API可以讓你使用setup方法去定義(define刚盈,定義或者設(shè)計(jì)的意思)控件。
直接看代碼吧挂脑,我們可以把App.vue寫(xiě)成:

//App.vue

<template>
  <span>Button clicked {{ count }}</span>
  <button @click="inc">Inc</button>
</template>
<script>
import { ref } from "vue";
export default {
  setup () {
    const count = ref(0);
    const inc = () => {
      count.value++;
    };
    return {
      count,
      inc
    }
  }
};
</script>

我們導(dǎo)入ref方法藕漱,這個(gè)方法可以讓我們?nèi)ザxcount這個(gè)變成,這個(gè)變量相當(dāng)于this.count崭闲。假如我們不加ref方法肋联,直接寫(xiě)成‘const count = 0;’,count會(huì)變成一個(gè)常量镀脂,不會(huì)再改變牺蹄,這個(gè)跟react是不是有點(diǎn)像?
更多可以參考這個(gè)文檔 Vue Composition API docs

附最終效果圖:


App.vue
main.js
瀏覽器效果
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末薄翅,一起剝皮案震驚了整個(gè)濱河市沙兰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌翘魄,老刑警劉巖鼎天,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異暑竟,居然都是意外死亡斋射,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)但荤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)罗岖,“玉大人,你說(shuō)我怎么就攤上這事腹躁∩0” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵纺非,是天一觀的道長(zhǎng)哑了。 經(jīng)常有香客問(wèn)我,道長(zhǎng)烧颖,這世上最難降的妖魔是什么弱左? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮炕淮,結(jié)果婚禮上拆火,老公的妹妹穿的比我還像新娘。我一直安慰自己涂圆,他們只是感情好们镜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著乘综,像睡著了一般憎账。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卡辰,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天胞皱,我揣著相機(jī)與錄音,去河邊找鬼九妈。 笑死反砌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的萌朱。 我是一名探鬼主播宴树,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼晶疼!你這毒婦竟也來(lái)了酒贬?” 一聲冷哼從身側(cè)響起又憨,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锭吨,沒(méi)想到半個(gè)月后蠢莺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡零如,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年躏将,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片考蕾。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡祸憋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肖卧,到底是詐尸還是另有隱情蚯窥,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布喜命,位于F島的核電站沟沙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏壁榕。R本人自食惡果不足惜矛紫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牌里。 院中可真熱鬧颊咬,春花似錦、人聲如沸牡辽。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)态辛。三九已至麸澜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奏黑,已是汗流浹背炊邦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留熟史,地道東北人馁害。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蹂匹,于是被迫代替她去往敵國(guó)和親碘菜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353