最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

前端框架Vue.js構(gòu)建大型應(yīng)用淺析

 更新時間:2016年09月12日 14:53:09   作者:lihongxun945  
這篇文章主要為大家詳細(xì)介紹了前端框架Vue.js構(gòu)建大型應(yīng)用的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

真正的模塊化

前端模塊化很早就開始了,無論是 require.js,browserify 進(jìn)行模塊化打包, 還是 Angular 進(jìn)行依賴注入,我們都可以把JS代碼分成一個個小的模塊并組裝起來。然后我們還會通過 less 或者 sass 來把CSS文件也拆成一個個小的模塊來寫,甚至我們在CSS代碼中感受到了 封裝,繼承,多態(tài) 等面向?qū)ο蟮奶匦浴?/p>

然而,在 webpack 出來之前,我們所謂的模塊化根本不能算作模塊化。為什么這么講,因為我們存在一個重要的問題沒有解決,就是JS模塊對CSS模塊的依賴。

比如我們有一個JS模塊 modal 那么我們直接導(dǎo)入并調(diào)用它就能彈出一個對話框嗎?如下圖所示可以嗎?

理論上應(yīng)該是這樣的,但實際上這個 modal其實還依賴一個對應(yīng)的CSS模塊 modal.less ,如果不導(dǎo)入這個模塊我們是無法彈出一個正常的對話框的,而且,導(dǎo)入這個CSS模塊竟然不是和導(dǎo)入JS模塊寫在同一個地方,而是寫在另一個CSS文件中。也就是說,其實依賴關(guān)系是這樣的:

為了使用一個模塊,我們需要在兩個文件中分別做一次引入操作。這其實是一件非常奇怪不合理的事!我們?yōu)槭裁匆K化?就是為了封裝一個模塊,可以做到導(dǎo)入它就能使用,而它是如何實現(xiàn)的,它有什么依賴關(guān)系完全是這個模塊自己處理的,也就是上圖中對 modal.css 的依賴應(yīng)該是 modal.js 自己處理的。
但是我們寫了N年的前端卻一直這樣寫模塊,不是因為他對,而是因為我們習(xí)慣了這種錯誤的方式?,F(xiàn)在用Vue我們可以完全封裝一個模塊的全部依賴,無論是模板、CSS還是JS,我們都不需要再去關(guān)心,只要引入這個模塊就可以使用,而模塊的依賴是它自己進(jìn)行處理的。

那么我們的依賴關(guān)系就變成了:

其中 modal.vue 包含了全部所需要的依賴,那么我們就不在需要自己去處理對應(yīng)的 CSS 甚至 模板了。這才是模塊化應(yīng)該達(dá)到的效果。

創(chuàng)建 Vue 項目

Vue 提供了一個工具 vue-cli 可以創(chuàng)建一個項目模板: https://github.com/vuejs/vue-cli

這里我先嘗試了一下另一個模板項目:https://github.com/vuejs-templates/webpack

然后我們就可以不用 純JS來寫模塊了,而是借助 webpack 來把一個模塊相關(guān)的所有內(nèi)容全部寫到一個文件中。以之前的 todo list 為例,其實上一章講的只是component的用法所以那樣寫了。我們改成一個更好的寫法如下:

List.vue:

<template>
 <ul>
 <li v-for='todo in list'>
  <label v-bind:class="{ done : todo.done }" >
  <input type="checkbox" v-model="todo.done"/>
  {{todo.title}}
  </label>
 </li>
 </ul>

</template>

<script>
export default {
 props: {
 initList: {
  type: Array
 }
 },
 data () {
 return {
  list: []
 }
 },
 events: {
 add (input) {
  if (!input) return false
  this.list.unshift({
  title: input,
  done: false
  })
 }
 }
}
</script>

<style lang="less" scoped>
ul {
 margin-left: 2rem;
 padding: 0;

 .done {
 text-decoration: line-through;
 }
}
</style>

Form.vue:

<template>
 <h1>{{username}}'s Todo List</h1>
 <form v-on:submit="add" v-on:submit.prevent>
 <input type="text" v-model="input"/>
 <input type="submit" value='add' />
 </form>
</template>

<script>
export default {
 props: {
 username: {
  type: String,
  default: 'Unnamed'
 }
 },

 data () {
 return {
  input: ''
 }
 },

 methods: {
 add () {
  this.$dispatch('add', this.input)
  this.input = ''
 }
 }
}
</script>

Todo.vue:

<template>

 <div id="todo">
 <todo-form username='Lily'></todo-form>
 <todo-list></todo-list>
 </div>

</template>

<script>
import Form from './Form.vue'
import List from './List.vue'

export default {
 components: {
 'todo-form': Form,
 'todo-list': List
 },

 events: {
 add (input) {
  this.$broadcast('add', input)
 }
 }
}

</script>

<style>
</style>

App.vue:

<template>
 <todo></todo>
</template>

<script>
import Todo from './components/Todo.vue'

export default {
 components: {
 'todo': Todo
 }
}
</script>

<style>
</style>

這樣我們就把之前的 Todo List 按照 模塊化 重寫了一遍。模塊化是構(gòu)建大型應(yīng)用的基礎(chǔ)之一,但是這一點還不夠,我們還需要做到:
 •更好的狀態(tài)管理,把不同組件共享的 State 獨立出來管理
 •自動化測試
 •路由等 

這里我們只做其中一個,就是把 State 獨立成一個單獨模塊。很顯然,對一個 Todo List 應(yīng)用來說,保存 todo list 的數(shù)據(jù)結(jié)構(gòu)就是不同組件共享的 State。
之前我們?yōu)槭裁葱枰M(jìn)行事件廣播,就是因為不同組件之間要操作的數(shù)據(jù)就保存在 List.vue 中,所以在 Form.vue 中想增加一條數(shù)據(jù)的時候需要通過事件的方式去通知 List.vue 來添加。
也就是其實這個數(shù)據(jù)不是 List.vue 私有的,應(yīng)該至少是這兩個組件公有的,現(xiàn)在被 List.vue 據(jù)為己有之后,F(xiàn)orm.vue 沒法修改它只好通過事件進(jìn)行通知。
雖然事件的方式很優(yōu)雅,但其實我們可以做的更好,就是把數(shù)據(jù)獨立出來,這樣 Form.vue 和 List.vue 都可以直接修改數(shù)據(jù),而不用那么麻煩發(fā)通知。

這里我們增加一個 Store.js 文件:

export default {
 list: [
 ],

 add (title) {
 if (!title) return
 this.list.unshift({
  title: title,
  done: false
 })
 }
}

 然后 我們可以把 List.vue 改成這樣,這里只貼出JS部分的代碼:

import Store from '../Store.js'

export default {
 props: {
 initList: {
  type: Array
 }
 },
 data () {
 return Store
 }
}

 Form.vue 也不需要廣播了,直接調(diào)用 Store.add 方法既可以添加:

import Store from '../Store.js'
export default {
 props: {
 username: {
  type: String,
  default: 'Unnamed'
 }
 },

 data () {
 return {
  input: ''
 }
 },

 methods: {
 add () {
  Store.add(this.input)
  this.input = ''
 }
 }
}

 這樣一改之后,整個邏輯會清晰很多,并且應(yīng)用越是復(fù)雜,越是應(yīng)該抽出公有的 Store ,不然會出現(xiàn)廣播事件滿天飛的情況。
另外用這個項目模板之后,hot-reload 爽的不要不要的,刷新操作都省了。

上述的源碼在這里:https://github.com/lihongxun945/vue-webpack-todo-list

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue實現(xiàn)的微信機(jī)器人聊天功能案例【附源碼下載】

    vue實現(xiàn)的微信機(jī)器人聊天功能案例【附源碼下載】

    這篇文章主要介紹了vue實現(xiàn)的微信機(jī)器人聊天功能,結(jié)合實例形式分析了基于vue.js的微信機(jī)器人聊天相關(guān)界面布局、ajax交互等操作技巧,并附帶源碼供讀者下載參考,需要的朋友可以參考下
    2019-02-02
  • 關(guān)于vue3使用particles粒子特效的問題

    關(guān)于vue3使用particles粒子特效的問題

    這篇文章主要介紹了關(guān)于vue3使用particles粒子特效的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 將 vue 生成的 js 上傳到七牛的實例

    將 vue 生成的 js 上傳到七牛的實例

    本篇文章主要介紹了將 vue 生成的 js 上傳到七牛的實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Vue+node實現(xiàn)音頻錄制播放功能

    Vue+node實現(xiàn)音頻錄制播放功能

    這篇文章主要介紹了Vue+node實現(xiàn)音頻錄制播放,功能,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • vue中的inject學(xué)習(xí)教程

    vue中的inject學(xué)習(xí)教程

    本文通過實例代碼給大家介紹了vue中的inject學(xué)習(xí)教程,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2019-04-04
  • 使用vue2.6實現(xiàn)抖音【時間輪盤】屏保效果附源碼

    使用vue2.6實現(xiàn)抖音【時間輪盤】屏保效果附源碼

    前段時間看抖音,有人用時間輪盤作為動態(tài)的桌面壁紙,一時間成為全網(wǎng)最火的電腦屏保,后來小米等運用市場也出現(xiàn)了【時間輪盤】,有點像五行八卦,感覺很好玩,于是突發(fā)奇想,自己寫一個網(wǎng)頁版小DEMO玩玩,需要的朋友可以參考下
    2019-04-04
  • vue項目是如何運行起來的

    vue項目是如何運行起來的

    這篇文章主要介紹了vue項目是如何運行起來的,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Vue.js按鍵修飾符及v-model修飾符示例詳解

    Vue.js按鍵修飾符及v-model修飾符示例詳解

    這篇文章主要介紹了Vue.js按鍵修飾符及v-model修飾符,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • vueRouter--matcher之動態(tài)增減路由方式

    vueRouter--matcher之動態(tài)增減路由方式

    這篇文章主要介紹了vueRouter--matcher之動態(tài)增減路由方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue如何在vue.config.js文件中導(dǎo)入模塊

    vue如何在vue.config.js文件中導(dǎo)入模塊

    這篇文章主要介紹了vue如何在vue.config.js文件中導(dǎo)入模塊問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評論

武威市| 汉源县| 麻阳| 莱芜市| 屯留县| 咸丰县| 灵石县| 玛沁县| 牡丹江市| 丹阳市| 庆安县| 汉阴县| 玉田县| 霍林郭勒市| 龙州县| 翁牛特旗| 会理县| 梁河县| 沁阳市| 乐山市| 贵定县| 荥经县| 民勤县| 资源县| 奉化市| 喜德县| 云安县| 温州市| 钟山县| 黄浦区| 新丰县| 桃园市| 裕民县| 太和县| 封开县| 姜堰市| 行唐县| 长汀县| 盐边县| 当涂县| 莱阳市|