日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Vue入坑史,從一個(gè)簡(jiǎn)單的項(xiàng)目說(shuō)起(一)

 堂tj77m7tpne37 2018-09-17

最近一直在學(xué)習(xí)Vue,官方文檔也粗略的看過(guò)三四遍吧(有的東西老是記不住,可能是老了,開(kāi)個(gè)玩笑)。然后自己寫(xiě)了一個(gè)簡(jiǎn)單的Demo,模擬了iPhone端的微信界面,實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的聊天功能。

這里是GitHub的項(xiàng)目地址,目前雖然還是個(gè)半成品(有點(diǎn)懶),但對(duì)于初學(xué)者來(lái)說(shuō)應(yīng)該會(huì)有幫助,因?yàn)槲乙彩浅鯇W(xué)者。使用到的技術(shù)棧包括VueVuex,Vue-routerVue-cli,Pug,Sass等。點(diǎn)擊這里可在線查看效果,建議使用谷歌瀏覽器并在手機(jī)調(diào)試模式下查看。

這不是一篇純技術(shù)文章,更多的是我自己總結(jié)的一些方法和對(duì)Vue的理解。

初學(xué)者的難題

根據(jù)我學(xué)習(xí)的經(jīng)歷,我覺(jué)得對(duì)于初學(xué)者學(xué)習(xí)Vue(或React)最大的難題可能就是環(huán)境的搭建,尤其是對(duì)于沒(méi)有NodeJS方面經(jīng)驗(yàn)的人來(lái)說(shuō)。這里我要說(shuō)一下自己對(duì)于學(xué)習(xí)Vue的一些見(jiàn)解,可供參考。

從Vue-cli開(kāi)始

vue-cli是官方提供的一個(gè)命令行工具,可以一鍵部署開(kāi)發(fā)環(huán)境,這樣會(huì)省去很多麻煩。另外,通過(guò)vue-cli部署的環(huán)境可以直接進(jìn)入到單文件組件的學(xué)習(xí),這對(duì)以后的學(xué)習(xí)可能會(huì)更有幫助。如果自己搭建環(huán)境,一個(gè)webpack的相關(guān)配置都可能把你的意志消磨殆盡(webpack我就踩過(guò)很多坑),我猜很多學(xué)習(xí)VueReact的新手都是死在環(huán)境搭建的過(guò)程中。初學(xué)者應(yīng)該把注意力集中在Vue本身,等體會(huì)到其中的“樂(lè)趣”之后再回過(guò)頭來(lái)學(xué)習(xí)npmwebpack等相關(guān)知識(shí)可能會(huì)更好。

vue-cli使用如下,建議使用cnpm代替npm,具體可自行百度或Google。

# 全局安裝 vue-cli npm install -g vue-cli # 創(chuàng)建一個(gè)基于 Webpack 模板的項(xiàng)目 vue init webpack my-project # 安裝依賴(lài) cd my-project npm install # 運(yùn)行 npm run dev

直接進(jìn)入到單文件組件開(kāi)發(fā)

Vue可以直接通過(guò)script標(biāo)簽引入到HTML文件中,但我不建議這樣學(xué)習(xí)。因?yàn)檫@就違背了學(xué)習(xí)Vue的初衷,Vue是一個(gè)MVVM框架,其核心思想就是分組件開(kāi)發(fā),組件的復(fù)用,組件解耦。

Vue還可以使用字符串模板以及Render渲染來(lái)開(kāi)發(fā)組件,其弊端也很明顯。字符串模板不支持語(yǔ)法高亮,而且寫(xiě)起來(lái)也不直觀。Render函數(shù)渲染相對(duì)比較復(fù)雜,而且也不直觀。最重要的是他們都無(wú)法封裝CSS樣式,也無(wú)法使用預(yù)處理器PugSass)。

單文件組件(.vue后綴名)很好的實(shí)現(xiàn)了組件的封裝,讓組件看起來(lái)更像組件。文件結(jié)構(gòu)如下:

<template lang='html'> <!-- 這里是組件的 HTML 標(biāo)簽 --> </template> <script> export default { // 這里是組件 js 代碼 } </script> <style lang='scss' scoped> // 這里是組件的 CSS 樣式 </style>

選擇一款合適的編輯器

我曾經(jīng)無(wú)數(shù)次糾結(jié)過(guò)這個(gè)問(wèn)題:到底是使用Sublime,VS Code,還是Atom?或是WebStorm?百度一下,人們對(duì)這些工具也是各執(zhí)其詞,根本毫無(wú)可比性,一下子更不知如何選擇了(選擇困難癥,十分痛苦)?,F(xiàn)在想想其實(shí)也十分可笑,我們完全沒(méi)必要把時(shí)間花在這些無(wú)聊的事情上。這些編輯器我在Windows和MacOS中都嘗試過(guò),最終還是選擇了Sublime陣營(yíng)。

簡(jiǎn)單的說(shuō)一下,選擇Sublime一個(gè)字,兩個(gè)字穩(wěn)定,三個(gè)字插件豐富(假裝三個(gè)字)。Atom界面最好看,尤其是在MacOS下;VS Code沒(méi)什么心得,就是不喜歡;WebStorm相當(dāng)于IDE,笨重但功能齊全,前端初學(xué)者神器(也是我的入門(mén)工具)。Atom我也是比較看好的,只是閑置在電腦中,暫時(shí)沒(méi)怎么用。

如果你也跟我一樣糾結(jié)的話,那我建議你選擇Sublime,什么也別想,就選它。記住它的一些快捷操作,和一些實(shí)用技巧,我相信你會(huì)慢慢愛(ài)上它的。

Sublime作為前端編輯器,推薦幾個(gè)好用的插件:

  • Emmet:前端必備神器;
  • DocBlockr:統(tǒng)一文檔注釋的風(fēng)格;
  • Babel:支持ES6語(yǔ)法;
  • Pug:Jade的新叫法,語(yǔ)法高亮;
  • Sass:支持Sass語(yǔ)法高亮;
  • Vue Syntax Highlight:Vue必備,語(yǔ)法高亮。

另外推薦一款我在用的主題:Theme - SoDaReloaded。

縱觀全局

我一直有一個(gè)觀點(diǎn):就是看事物要先看全局,忽略那些繁瑣的細(xì)節(jié),然后再逐個(gè)深究。比如看書(shū)要先看目錄(雖然我討厭看書(shū)),首先做到心里有數(shù),知道自己在看什么或有沒(méi)有必要再看下去(比如這篇文章)。

比較重要的幾個(gè)概念

我不是一個(gè)語(yǔ)言表達(dá)能力很好的人,不會(huì)扯那些概念,我只能盡可能的說(shuō)一些自己的理解。

這里先說(shuō)一句,Vue中的this一般都指向當(dāng)前的Vue實(shí)例。也是就說(shuō),在哪個(gè)組件中使用,this就指向哪個(gè)組件。當(dāng)然,這只是對(duì)于組件本身具有的屬性和方法而言。

Vue實(shí)例

通過(guò)Vue開(kāi)發(fā)單頁(yè)面項(xiàng)目,一個(gè)項(xiàng)目就是一個(gè)Vue實(shí)例(暫且這么理解吧),也就是通過(guò)new Vue()語(yǔ)句創(chuàng)建的對(duì)象。那么既然有了一個(gè)實(shí)例,那么要顯示出來(lái),就得放入HTML文檔中,這就是掛載。對(duì)應(yīng)語(yǔ)法:

new Vue({ // el是實(shí)例掛載點(diǎn),會(huì)將根組件替換掉原文檔中id為 app 標(biāo)簽 el: '#app', // 通過(guò)render函數(shù)渲染 render: h => { // 這里App是根組件 h(App) } }) // 第二種寫(xiě)法 new Vue({ el: '#app', // 通過(guò)字符串模板 template: '<App />', components: { App } })

Vue擴(kuò)展實(shí)例

嚴(yán)格來(lái)說(shuō),通過(guò)new Vue()方式創(chuàng)建的實(shí)例叫做根實(shí)例,而還有一種叫擴(kuò)展實(shí)例。這里引用官方的一句話:所有的 Vue.js 組件其實(shí)都是被擴(kuò)展的 Vue 實(shí)例(其實(shí)我也是剛剛理解)。

擴(kuò)展實(shí)例創(chuàng)建方式:

const MyComponent = Vue.extend({ // 該對(duì)象就相當(dāng)于 單文件組件中 export 導(dǎo)出的對(duì)象 // 這就是為什么說(shuō) 所有的Vue組件都是被擴(kuò)展的Vue實(shí)例 }) // 創(chuàng)建擴(kuò)展實(shí)例 const component = new MyComponent()

同樣的,Vue擴(kuò)展實(shí)例也需要掛載,其語(yǔ)法與根實(shí)例掛載一樣:

// 會(huì)替換掉 HTML 文檔中 id 為 app 的標(biāo)簽 new MyComponent({el: '#app'}) // 但是這里不建議這么做,因?yàn)檫@樣會(huì)與實(shí)例掛載點(diǎn)沖突 // 這里僅僅是為了說(shuō)明擴(kuò)展實(shí)例與 根實(shí)例的相似之處

擴(kuò)展實(shí)例一個(gè)重要的用法就是在需要的時(shí)候才被插入到HTML文檔中。比如點(diǎn)擊一個(gè)按鈕,彈出一個(gè)模態(tài)(modal)框。在我的Demo中,正是通過(guò)該方法實(shí)現(xiàn)一個(gè)加載等待的模態(tài)框。通過(guò)此方法有一個(gè)好處就是,可以將該功能封裝成一個(gè)Vue插件,需要的時(shí)候通過(guò)一條指令就可以將組件插入到文檔中,不需要預(yù)先將組件寫(xiě)入到HTML文檔中。方法如下:

// 創(chuàng)建擴(kuò)展實(shí)例 let component = new MyComponent() // 掛載到虛擬DOM中 // 不傳遞參數(shù),若傳遞參數(shù)會(huì)掛載到指定的地方 component = component.$mount() // 通過(guò)原生語(yǔ)法將 擴(kuò)展實(shí)例添加到HTML文檔中 document.body.appendChild(component.$el)

同樣,Vue根實(shí)例也可以通過(guò)該方式掛載到HTML中。

組件

組件就是擴(kuò)展的Vue實(shí)例(哈哈)。反正記住在Vue中,一切可見(jiàn)的東西(但不限于可見(jiàn)的東西)都是組件,一個(gè)Vue實(shí)例就是由一大堆組件通過(guò)一定的組合和嵌套累積起來(lái)的。

學(xué)習(xí)組件無(wú)外乎就是它的創(chuàng)建使用,通過(guò)擴(kuò)展Vue實(shí)例也算是一種創(chuàng)建的方式,另外還有字符串模板render函數(shù)渲染的方式。我一開(kāi)始就建議直接使用單文件組件,具體請(qǐng)轉(zhuǎn)移官方文檔或從GitHub上Clone我的demo查看詳情。

生命周期

每個(gè)組件都有自己的生命周期,從廣義上來(lái)說(shuō),Vue實(shí)例其實(shí)也是一個(gè)組件。一般常用的幾個(gè)生命周期鉤子:created,mounted,updateddestroyed。mounted基本上用的最多。

所謂的生命周期鉤子,就是說(shuō)組件在特定的時(shí)刻會(huì)自動(dòng)觸發(fā)該事件,執(zhí)行對(duì)應(yīng)的函數(shù)。

學(xué)習(xí)Vue的基本思想

程序員,其實(shí)大部分時(shí)間是用于思考的。建立一種思想,一種思維方式很重要。這也是我現(xiàn)在一直在努力做的事。

學(xué)習(xí)一個(gè)框架,就要站在它的角度去思考問(wèn)題。而Vue是一種MVVM模式的框架,所以有必要先理解什么是MVVM?然后再去思考Vue的基本原理,它能做什么?又是如何做到的?為什么要使用Vue?可以去看一下官方文檔:Vue與其他框架的對(duì)比。

什么是MVVM

M就是Model(模型),V就是View(界面),MVVM也是就說(shuō)通過(guò)模型的改變來(lái)更新界面,然后通過(guò)界面的一些行為事件又來(lái)作用于模型。當(dāng)然,這只是從字面上來(lái)解釋。要更好的體會(huì)到Vue的MVVM思想,我建議去學(xué)習(xí)Vuex。

之前,我們使用jQuery或原生JS要想更改界面上的內(nèi)容,首先必須找到對(duì)應(yīng)的DOM節(jié)點(diǎn),然后通過(guò)直接操作DOM的語(yǔ)句來(lái)改變界面上的內(nèi)容。而MVVM的思維方式就是:一個(gè)模型對(duì)應(yīng)一個(gè)界面,界面的狀態(tài)和顯示的內(nèi)容完全取決于它對(duì)應(yīng)的模型。而我們只需改變模型,后臺(tái)(Vue)就會(huì)通過(guò)某種機(jī)制自動(dòng)去更新界面。

什么是MVC

順便談一下MVC設(shè)計(jì)模式,它其實(shí)是出現(xiàn)在MVVM之前,其中的C是指Controller(控制器)。MVC的基本思想就是:模型與界面之間的通信都是通過(guò)中間的控制器實(shí)現(xiàn)的。所以它的缺陷就是控制器層需要處理大量的業(yè)務(wù)邏輯代碼,不利于開(kāi)發(fā)和維護(hù)。

Vue的基本原理

我沒(méi)有研究過(guò)Vue的源碼,也解釋不出來(lái)它是怎么實(shí)現(xiàn)的?畢竟我們是使用框架,通過(guò)它來(lái)提高開(kāi)發(fā)效率,沒(méi)必要太過(guò)于深究,否則就失去了使用它的意義(大神請(qǐng)忽略之)。記住一句話:我們是站在巨人的肩膀上開(kāi)發(fā)的。如果什么都要去深究其原理,那還不累死?

Vue的核心是組件,一切可以看見(jiàn)的東西都是由組件構(gòu)成。然后通過(guò)把不同的組件組合和嵌套在一起,最終組成了一個(gè)根組件,也就是App。根組件會(huì)掛載到Vue的根實(shí)例中,而Vue根實(shí)例本身也相對(duì)于一個(gè)組件,然后又掛載到真實(shí)的HTML文檔中。對(duì)應(yīng)的語(yǔ)句也就是main.js文件中的語(yǔ)句。

new Vue({ // 該屬性會(huì) 將Vue實(shí)例掛載到 真實(shí)的HTML中 el: '#app', // App 就是根組件,被掛載到Vue實(shí)例中 render: h => h(App) })

最后

越寫(xiě)到后面感覺(jué)越偏離主題(不知所云,看來(lái)得好好練一下文筆了),實(shí)在寫(xiě)不出想要的那種效果,所以就先到此為止吧。先整理一下思路,后面有時(shí)間會(huì)接著更新,希望自己會(huì)堅(jiān)持下去,這是第一篇。

關(guān)注我,獲取前端更多技術(shù)文章!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多