可能是目前最完整的前端框架 Vue.js 全面介紹

摘要: 2019年最火的前端框架當屬Vue.js了启上,很多使用過vue的程序員這樣評價它,“vue.js兼具angular.js和react.js的優(yōu)點店印,并剔除了它們的缺點”冈在。授予了這么高的評價的vue.js,也是開源世界華人的驕傲按摘,因為它的作者是位中國人–尤雨溪(Evan You)包券。 Vue.js 是一個JavaScriptMVVM庫,是一套構(gòu)建用戶界面的漸進式框架炫贤。它是以數(shù)據(jù)驅(qū)動和組件化的思想構(gòu)建的溅固,采用自底向上增量開發(fā)的設(shè)計。相比于Angular.js兰珍,Vue.js提供了更加簡潔侍郭、更易于理解的API,使得我們能夠快速地上手并使用Vue.js掠河;同時比起 React + Redux 相對復(fù)雜的架構(gòu)亮元,

調(diào)試插件

在vue調(diào)試方面,可以選擇安裝chrome插件vue Devtools唠摹。打開vue項目爆捞,在console控制臺選擇vue面板。在Devtools工具中勾拉,可以選擇組件煮甥,查看對應(yīng)組件內(nèi)的數(shù)據(jù)信息。也可以選擇Vuex選項望艺,查看該項目內(nèi)Vuex的狀態(tài)變量信息苛秕。

UI組件庫

在vue組件庫方面肌访,個人不推薦使用UI組件庫找默,畢竟自己造輪子的過程還是很有成就感的。當然吼驶,如果更重視開發(fā)效率惩激,并且選擇了vue2.0作為前端框架,那么餓了么推出的Element組件就是一個很不錯的選擇蟹演。其github項目(https://github.com/ElemeFE/element)更新比較頻繁风钻,雖然項目會有些不穩(wěn)定,但是目前為止element就是最好的支持vue2.0的UI組件酒请。就像它的口號一樣骡技,“快速成型,就為讓你少加班”。

vue布朦、React囤萤、Angular1對比

性能 對比

在Angular1中,在scope作用域中每一次數(shù)據(jù)變化是趴,會觸發(fā)watcher的重新計算涛舍,angular對常用的dom事件,xhr事件等做了封裝唆途, 在里面觸發(fā)進入angular的digest流程富雅。在digest流程里面,會從rootscope開始遍歷肛搬, 檢查所有的watcher没佑。并且,如果一些 watcher 觸發(fā)另一個更新滚婉,臟檢查循環(huán)(digest cycle)可能要運行多次图筹。Vue則沒有這個問題,因為它使用基于依賴追蹤的觀察系統(tǒng)并且異步隊列更新让腹,數(shù)據(jù)的變化都是獨立處罰的远剩,除非數(shù)據(jù)之間有明確的依賴關(guān)系。

vue官方宣稱vue的渲染性能優(yōu)于react骇窍。為了有理有據(jù)讓人信服瓜晤,vue開發(fā)團隊建立了一個簡單的對比性能的項目(https://github.com/chrisvfritz/vue-render-performance-comparisons),它負責渲染10000個列表項100次腹纳。Vue官方將每一個參照項目都分別運行 20 次并取最好的結(jié)果結(jié)果如下圖:

由此可見痢掠,Vue的性能是遠好于Angular1,并且稍微優(yōu)于React的嘲恍。

社區(qū)拓展對比

Angular1的背后是Google足画,所以社區(qū)基礎(chǔ)是不需要擔心的,從Tutorial到StackOverflow的問題數(shù)量都可以反映出生態(tài)系統(tǒng)很完整佃牛。Angular1之后的2.0版本幾乎是一個推翻重做的框架淹辞,對于使用了1.X版本的項目,想要平滑的升級過渡到2.0版本應(yīng)該是非常困難的》溃現(xiàn)在Angular2的線上應(yīng)用數(shù)量還不算太多象缀,主流編碼還是以1.X版本居多。這個版本化巨大的差異也間接影響到了開發(fā)者對于angular的信心爷速。

Vue和React都有強大的社區(qū)支持央星。React有狀態(tài)管理庫Flux、ReduxVue惫东,相應(yīng)的莉给,Vue有vuex。Vue 和 React 都提供了強大的路由庫來應(yīng)對大型應(yīng)用。然而Vue的路由庫和狀態(tài)管理庫都是由官方維護支持的颓遏。React 則是選擇把這些問題交給社區(qū)維護胁黑,因此創(chuàng)建了一個更分散的生態(tài)系統(tǒng)。但相對的州泊,React 的生態(tài)系統(tǒng)相比 Vue 更加繁榮丧蘸。此外,Vue 提供了Vue-cli 腳手架遥皂,包括了Webpack力喷,Browserify,甚至路由庫演训,能讓你非常容易地構(gòu)建項目弟孟。

學習陡峭度對比

在指令與組件方面,Vue中將指令和組件分得更清晰样悟。指令只封裝 DOM 操作拂募,而組件代表一個自給自足的獨立單元,有自己的視圖和數(shù)據(jù)邏輯窟她。在 Angular1 中兩者有不少相混的地方陈症。在API與框架設(shè)計方面,angular1都比vue要復(fù)雜的多震糖。就個人感覺而言录肯,angular1和React的學習曲線會相對陡峭一些,而vue的編碼方式會更趨近于前端開發(fā)者的編程習慣吊说。

因為vue的作者是中國人论咏,vue的官方網(wǎng)站、教程和api肯定是最完善颁井、最易懂的谢揪。此外绣张,每次大版本的發(fā)布必怜,都會伴隨著詳盡的遷移說明文檔逢享,包含了很多詳盡的闡述以及許多遷移的例子,甚至還有遷移工具秀又。Angular的開發(fā)團隊你們就不覺得臉紅么…

Vue的使用非常的簡單单寂,創(chuàng)建一個本地的 .html 文件贬芥,然后通過如下方式引入 Vue:

這樣就生成了vue的hello world應(yīng)用吐辙。

渲染能力對比

ReactNative能使你用相同的組件模型編寫有本地渲染能力的 APP(iOS 和 Android)。能同時跨多平臺開發(fā)蘸劈,對開發(fā)者是非常棒的昏苏。為了彌補這方面的不足,在2016年9月舉辦的JSConf2016期間,vue.js的作者尤雨溪宣布加盟Weex團隊擔任技術(shù)顧問贤惯,雙方將進行更緊密的合作洼专,共建開發(fā)生態(tài)圈。Weex 是阿里的跨平臺用戶界面開發(fā)框架孵构,Weex 的 JavaScript 框架運行時用的就是 Vue屁商。在此之后,在 Weex 的幫助下颈墅,使用 Vue 語法開發(fā)的組件不僅僅可以運行在瀏覽器端蜡镶,還能被用于開發(fā) iOS 和 Android 上的原生應(yīng)用。

Vue.js 的作者尤雨溪表示:“Weex選擇Vue作為其JavaScript運行時框架是讓我非常高興的一件事恤筛。Vue的組件開發(fā)模式已經(jīng)被web開發(fā)者社區(qū)廣泛 認可官还,而把Vue的開發(fā)體驗拓展到原生平臺則是我一直想做但沒有余力去做的事情。一想到Weex將能讓開發(fā)者們用Vue的語法去寫跨 Web/Android/iOS三端的通用組件毒坛,就讓我很興奮望伦。”

vue的缺點

Vue就這么好煎殷,難道沒有缺點嗎屯伞?當然有,vue雖然在16年非澈乐保火爆愕掏,但是相比于angular和react,不論是成熟度還是社區(qū)活躍度都還不是對手顶伞。此外饵撑,Vue明確聲明了自己放棄了對IE8的支持。再看看現(xiàn)在的招聘網(wǎng)站上唆貌,有多少寫了需要有angular經(jīng)驗滑潘,而又有多少寫了需要vue經(jīng)驗,就可見vue的影響力相比于angular和react還差的很遠锨咙。

vue全家桶及項目架構(gòu)

Vue有著名的全家桶系列语卤,包含了vue-router(http://router.vuejs.org),vuex(http://vuex.vuejs.org)酪刀, vue-resource(https://github.com/pagekit/vue-resource)粹舵。再加上構(gòu)建工具vue-cli,就是一個完整的vue項目的核心構(gòu)成骂倘。

vue-router路由

推薦使用npm工具來安裝vue-router

npm install vue-router

通過import導入并定義Vue模塊眼滤、vue-router模塊和需要使用的組件,在本例中历涝,分別是Goods诅需、Ratings和Seller組件漾唉。最后,如果在一個模塊化工程中使用它堰塌,必須要通過 Vue.use() 明確地安裝路由功能赵刑。

import Vue from’vue’

importRouter from’vue-router’

import Goods from ‘@/components/goods/goods’;

import Ratings from ‘@/components/ratings/ratings’;

import Seller from ‘@/components/seller/seller’;

Vue.use(Router); // 需要import Vue和Router,不然會報錯undefined

通過const router= new VueRouter()來定義一個路由场刑,并傳入對應(yīng)的配置般此,包括路徑path和組件components。

最后牵现,在使用newVue來創(chuàng)建和掛載vue根實例的時候恤煞,記得要通過 router配置參數(shù)注入路由,即在router中export出來的路由對象施籍,從而讓整個應(yīng)用都有路由功能居扒。

vuex狀態(tài)管理

Vuex 是一個專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲管理應(yīng)用的所有組件的狀態(tài)丑慎,并以相應(yīng)的規(guī)則保證狀態(tài)以一種可預(yù)測的方式發(fā)生變化喜喂。如前面所提到的,Vuex 已經(jīng)集成到 Vue 的官方調(diào)試工具vue Devtools竿裂,可以輕松的查看項目中的Vuex狀態(tài)變化情況玉吁。

假設(shè)有這樣一個場景:我們的項目規(guī)模比較大,有多個父組件腻异,每個父組件同時又包含多個子組件进副。如何保持對所有時間的追蹤將變得很困難。到底哪個事件是哪個組件派發(fā)的悔常,哪個組件該監(jiān)聽哪個事件影斑?父組件將變得和子組件耦合越來越嚴重,因為它需要明確的派發(fā)和監(jiān)聽子組件的某些事件机打。項目邏輯分散在各個組件當中矫户,很容易導致邏輯的混亂,不利于我們項目的維護残邀。

這就是 Vuex 用來解決的問題皆辽。 Vuex 的四個核心概念分別是:

The state tree:Vuex 使用單一狀態(tài)樹,用一個對象就包含了全部的應(yīng)用層級狀態(tài)芥挣。至此它便作為一個『唯一數(shù)據(jù)源(SSOT)』而存在驱闷。這也意味著,每個應(yīng)用將僅僅包含一個 store 實例空免。單狀態(tài)樹讓我們能夠直接地定位任一特定的狀態(tài)片段空另,在調(diào)試的過程中也能輕易地取得整個當前應(yīng)用狀態(tài)的快照。

Getters:用來從 store 獲取 Vue 組件數(shù)據(jù)鼓蜒。

Mutators:事件處理器用來驅(qū)動狀態(tài)的變化痹换。

Actions:可以給組件使用的函數(shù),以此用來驅(qū)動事件處理器 mutations

Vuex和簡單的全局對象是不同的都弹,當Vuex從store中讀取狀態(tài)值的時候娇豫,若狀態(tài)發(fā)生了變化,那么相應(yīng)的組件也會高效的更新畅厢。并且冯痢,改變store中狀態(tài)的唯一途徑就是提交commit mutations。這樣便于我們跟蹤每一次狀態(tài)的變化框杜。只要發(fā)生了狀態(tài)的變化浦楣,一定伴隨著mutation的提交。

讓我們來看一個最簡單的vuex例子:

安裝 Vuex 之后咪辱,讓我們來創(chuàng)建一個 store振劳。創(chuàng)建過程直截了當——僅需要提供一個初始 state 對象和一些 mutations:

現(xiàn)在,你可以通過 store.state 來獲取狀態(tài)對象油狂,以及通過 store.commit 方法觸發(fā)狀態(tài)變更:

vue-resource介紹

Vue-resource有體積小历恐,支持IE9以上的瀏覽器,支持promise特性的特點专筷。同樣推薦使用npm來安裝Vue-resource弱贼。

$ npm install vue-resource

在安裝并引入vue-resource后,可以基于全局的Vue對象使用http磷蛹,也可以基于某個Vue實例使用http吮旅。

在發(fā)送請求后,使用then方法來處理響應(yīng)結(jié)果味咳,then方法有兩個參數(shù)庇勃,第一個參數(shù)是響應(yīng)成功時的回調(diào)函數(shù),第二個參數(shù)是響應(yīng)失敗時的回調(diào)函數(shù)槽驶。

vue-resource的請求API是按照REST風格設(shè)計的匪凉,它提供了7種請求API:

· get(url,[options])

· head(url,[options])

· delete(url,[options])

· jsonp(url,[options])

· post(url,[body], [options])

· put(url, [body],[options])

· patch(url,[body], [options])

vue工程目錄結(jié)構(gòu)

下圖是一個簡單的vue項目的大概結(jié)構(gòu),下面簡要介紹一下每個文件夾中一般都會存放哪些內(nèi)容捺檬。

components/文件夾用來存放Vue 組件再层。個人建議,把每一個組件中使用到的image圖片放置到對應(yīng)的組件子文件目錄下堡纬,便于統(tǒng)一的管理

Node_modules/npm安裝的該項目的依賴庫

vuex/文件夾存放的是和 Vuex store 相關(guān)的東西(state對象聂受,actions,mutations)

router/文件夾存放的是跟vue-router相關(guān)的路由配置項

build/文件是 webpack 的打包編譯配置文件

static/文件夾存放一些靜態(tài)的烤镐、較少變動的image或者css文件

config/文件夾存放的是一些配置項蛋济,比如服務(wù)器訪問的端口配置等

dist/該文件夾一開始是不存在,在我們的項目經(jīng)過 build 之后才會產(chǎn)出

App.vue根組件炮叶,所有的子組件都將在這里被引用

index.html整個項目的入口文件碗旅,將會引用我們的根組件 App.vue

main.js入口文件的 js 邏輯渡处,在webpack 打包之后將被注入到 index.html 中

vue中l(wèi)ess的應(yīng)用

在vue項目中一樣可以使用less預(yù)編譯,只是需要使用npm安裝less-loader插件祟辟。安裝完成后医瘫,在vue中的css模塊進行簡單的配置,這樣就可以直接使用less來編寫樣式表了旧困。在打包編譯的時候醇份,會自動生成對應(yīng)的css樣式。

vue合實例講解Vue核心功能

Vue的功能有很多吼具,很難一一進行詳細的解釋僚纷。下面根據(jù)在工作中的項目實例,結(jié)合代碼解釋一下vue的幾大核心功能拗盒。

計算屬性

假設(shè)有如下的購物車結(jié)算場景怖竭,用戶選中商品的總金額是根據(jù)商品數(shù)量、選中商品種類數(shù)

和商品單價來變化的陡蝇。然而侵状,數(shù)量、選中種類數(shù)量和單價這幾個對象都是根據(jù)用戶選擇而動態(tài)變化的毅整,如果在前端模版中為了計算最終商品總額趣兄,放入這幾個動態(tài)變化的變量(商品數(shù)量、商品單價悼嫉、選中商品種類)艇潭,會讓這個邏輯變得復(fù)雜難以維護。在這種情況下戏蔑,模版便不再簡潔清晰蹋凝。Vue給出了此種場景的解決方案,在任何復(fù)雜的邏輯总棵,vue都推薦使用計算屬性鳍寂。

如上圖所示,在html中情龄,我們只需要使用{{totalPrice}}這個計算屬性就可以來表示最終的商品總額迄汛。我們不需要關(guān)注這個變量的數(shù)值變化,totalPrice這個變量的邏輯寫在對應(yīng)的computed計算屬性中骤视。

也許會有疑問鞍爱,這個計算屬性和定義一個method方法不是差不多么?這兩者最大的區(qū)別是計算屬性是基于它的依賴進行緩存的专酗。計算屬性只有在它的相關(guān)依賴發(fā)生變化時才會重新計算求值睹逃。在本例中,只有當選擇商品的價格price和數(shù)量count發(fā)生變化時祷肯,這個計算屬性totalPrice才會重新計算新的值沉填。這就意味著疗隶,只要totalPrice這個值沒有發(fā)生變化,多次訪問該計算屬性會立即返回之前的計算結(jié)果翼闹,而不必再次執(zhí)行計算斑鼻。

模版語法

Vue.js 使用了基于 HTML 的模版語法,允許開發(fā)者聲明式地將 DOM 綁定至底層 Vue 實例的數(shù)據(jù)橄碾。所有 Vue.js 的模板都是合法的 HTML 卵沉,所以能被遵循規(guī)范的瀏覽器和 HTML 解析器解析颠锉。Vue的模版語法包括了使用雙大括號插入文本法牲、使用v-html插入純HTML內(nèi)容、使用v-bind插入對象琼掠、類似angular的v-if拒垃、v-show、v-for指令瓷蛙、以及過濾器等等悼瓮。

組件化

組件(Component)是 Vue.js 最強大的功能。組件可以封裝可重用的代碼艰猬,通過傳入對象的不同横堡,實現(xiàn)組件的復(fù)用。

舉一個簡單的組建例子冠桃,我們首先編寫一個star組件命贴,它就是一個普通的star.vue文件。它的作用就是簡單實現(xiàn)了一個五角星食听。

如何在其他的vue文件中使用這個star組件呢胸蛛?如下圖所示,首先通過import引入star組件對象樱报,并在想使用star組件的vue文件中聲明注冊star組件≡嵯睿現(xiàn)在就可以愉快的通過標簽來在該vue文件中任意地方使用star組件了。在你想展示一個五角星的地方迹蛤,使用一個star標簽民珍,就可以輕松完成這個功能。

組件實例的作用域是孤立的盗飒。這意味著不能在子組件的模板內(nèi)直接引用父組件的數(shù)據(jù)穷缤。要讓子組件使用父組件的數(shù)據(jù),我們需要通過子組件的props選項箩兽。如本例所示津肛,子組件star要顯式的使用props選項聲明它期待獲得的數(shù)據(jù)。在這里就是指的“size”和“score”兩個變量汗贫。我們可以通過父級給子組件star傳入大小和數(shù)值這兩個對象身坐,來實現(xiàn)對子組件的定制化秸脱。

過渡效果

Vue 在插入、更新或者移除 DOM 時部蛇,提供多種不同方式的應(yīng)用過渡效果摊唇,可以用簡單的幾行代碼實現(xiàn)酷炫的過渡效果。Vue 提供了 transition 的封裝組件涯鲁,在使用v-if巷查、v-show等方法使得transition內(nèi)部dom元素發(fā)生變化時,可以給任何元素和組件添加 entering/leaving 過渡抹腿。

當v-show中內(nèi)容發(fā)生變化時岛请,transition組件中的元素會發(fā)生狀態(tài)的改變,在應(yīng)用了transition封裝后警绩,Vue會自動識別目標元素是否應(yīng)用了CSS過渡效果動畫崇败,如果有,會在合適的時機添加 entering/leaving的class來實現(xiàn)該過渡效果肩祥。

下圖所示是一個簡單的過渡效果的例子后室,需要將想實現(xiàn)過渡效果的元素放在transition標簽中包裹,通過name=“slide-fade”來聲明過渡效果名稱混狠,并在對應(yīng)的vue文件中添加過渡效果

的css樣式岸霹,這樣就可以簡單的完成該元素的過渡效果。

總結(jié)

根據(jù)不完全統(tǒng)計将饺,包括餓了么贡避、稀土掘金、蘇寧易購俯逾、美團贸桶、天貓、荔枝FM桌肴、房多多皇筛、Laravel、htmlBurger等國內(nèi)外知名大公司都在使用vue進行新項目的開發(fā)和舊項目的前端重構(gòu)工作坠七。

此外水醋,vue + vuex+ vue-resource + vue-router + webpack + es6 + less的項目架構(gòu)成為了越來越多大公司的第一選擇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末彪置,一起剝皮案震驚了整個濱河市拄踪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拳魁,老刑警劉巖惶桐,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡姚糊,警方通過查閱死者的電腦和手機贿衍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來救恨,“玉大人贸辈,你說我怎么就攤上這事〕Σ郏” “怎么了擎淤?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長秸仙。 經(jīng)常有香客問我嘴拢,道長,這世上最難降的妖魔是什么筋栋? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任炊汤,我火速辦了婚禮正驻,結(jié)果婚禮上弊攘,老公的妹妹穿的比我還像新娘。我一直安慰自己姑曙,他們只是感情好襟交,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伤靠,像睡著了一般捣域。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宴合,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天焕梅,我揣著相機與錄音,去河邊找鬼卦洽。 笑死贞言,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的阀蒂。 我是一名探鬼主播该窗,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蚤霞!你這毒婦竟也來了酗失?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤昧绣,失蹤者是張志新(化名)和其女友劉穎规肴,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡拖刃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年鉴嗤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片序调。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡醉锅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出发绢,到底是詐尸還是另有隱情硬耍,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布边酒,位于F島的核電站经柴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏墩朦。R本人自食惡果不足惜坯认,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氓涣。 院中可真熱鬧牛哺,春花似錦、人聲如沸劳吠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痒玩。三九已至淳附,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蠢古,已是汗流浹背奴曙。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留草讶,地道東北人洽糟。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像到涂,于是被迫代替她去往敵國和親脊框。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容