vue梳理

vue使用總結心得

vue的安裝

在這里我們主要針對的是vue的單頁面項目 如果僅僅是為了單個案例可以直接下載 然后script安裝

Vue 提供一個官方命令行工具,可用于快速搭建大型單頁應用。該工具為現代化的前端開發工作流提供了開箱即用的構建配置。只需幾分鐘即可創建并啟動一個帶熱重載、保存時靜態檢查以及可用于生產環境的構建配置的項目:

# 全局安裝 vue-cli
$ npm install --global vue-cli
# 創建一個基于 webpack 模板的新項目
$ vue init webpack my-project
# 安裝依賴,走你
$ cd my-project
$ npm install
$ npm run dev

vue的生命周期

vue的生命周期圖示

mark
header 1 header 2
beforeCreate 實例剛剛被創建 el和data并未初始化
created 實例創建完成 data被初始化 但是el沒有被初始化 dom不存在
beforeMount 完成了el的初始化 模板編譯之前
mounted 模板編譯之后 完成掛載
beforeUpdate 組件更新之前
uodated 組件更新之后
beforeDestory 組件銷毀前調用
destoryed 組件銷毀后調用

vue的核心思想(數據綁定和組件化)

  • ==vue的雙向數據綁定==
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app">
    <input type="text" v-model="text">
    {{ text }}

</div>
</body>
</html>
<script>
    /*
      1 數據監聽器 首先有一個數據監聽的函數 目的是 監聽數據的變化 拿到最新值 并通知訂閱者
      2 指令解析器 有一個編譯的函數 對元素的節點進行掃描和解析 并綁定相關的更新函數
      3 watcher 作為連接observe和compile的敲了
      3 訂閱者 這個訂閱者 負責與watcher 配合收到屬性變動的通知,執行相應的回調函數 完成視圖的更新     */
    function observe(obj, vm) {
        //  對傳入的對象 遍歷 并分別添加 object.defineProperty
        Object.keys(obj).forEach((key) => {
            defineReactive(vm, key, obj[key])
        })
    }

    function defineReactive(vm, key, val) {
        var dep = new Dep();
        Object.defineProperty(vm, key, {
            get: function () {
                // 通過這一步 添加訂閱者
                if (Dep.target) dep.addSub(Dep.target)
                return val;
            },
            set: function (newval) {
                if (newval === val) return
                val = newval;
                // 通知訂閱者
                dep.notify()
            }
        })
    }

    // 需要實現一個消息訂閱器
    function Dep() {
        // 消息訂閱的讓容器是一個數組 數組的每一項 都是指代一個view和mode的中間者
        this.subs = []
    }

    Dep.prototype = {
        addSub: function (sub) {
            this.subs.push(sub)
        },
        notify: function () {
            this.subs.forEach((sub) => {
                // 在這里 需要配合watcher進行更新
                sub.update()
            })
        }
    }

    //  在這里增加dom編譯模板
    function nodeToFragment(node, vm) {
        var flag = document.createDocumentFragment();
        var child;
        while (child = node.firstChild) {
            compile(child, vm);
            // 將子節點劫持到文本節點中
            flag.appendChild(child)
        }
        return flag
    }

    function compile(node, vm) {
        var reg = /\{\{(.*)\}\}/;
        // 跟據節點類型去判斷
        if (node.nodeType === 1) {
            var attr = node.attributes;
            for (var i = 0; i < attr.length; i++) {
                if (attr[i].nodeName === 'v-model') {
                    // 此時 name為text
                    var name = attr[i].nodeValue;
                    // 增加數據的變化監聽
                    node.addEventListener('input', (e) => {
                        vm[name] = e.target.value;
                    });
                    // 在這里 因為 我們的數據監聽器 已經封裝了vm[name]  觸發了 getter方法 完成了數據的初始化
                    node.value = vm[name];
                    node.removeAttribute('v-model')
                }
            }
            new Watcher(vm, node, name, 'input')
        }
        if (node.nodeType === 3) {
            if (reg.test(node.nodeValue)) {
                var name = RegExp.$1;
                name = name.trim();
                new Watcher(vm, node, name, 'text')
            }
        }
    }

    //訂閱者 搭建數據監聽變化和變異模板的橋梁
    function Watcher(vm, node, name, nodeType) {
        Dep.target = this;
        this.vm = vm;
        this.node = node;
        this.name = name;
        this.nodeType = nodeType
        this.update()
        Dep.target = null;
    }

    Watcher.prototype = {
        update: function () {
            this.get()
            if (this.nodeType === 'text') {
                this.node.nodeValue = this.value
            }
            if (this.nodeType === 'input') {
                this.node.value = this.value
            }
        },
        get: function () {
            this.value = this.vm[this.name];
        }
    }


    function Vue(options) {
        // 將options里面的data屬性 放入數據監聽器
        this.data = options.data;
        var data = this.data;
        observe(data, this); // this指代vm
        // 對指定id的dom 進行頁面的渲染
        this.$el = options.el;
        var id = this.$el;
        var Dom = nodeToFragment(document.getElementById(id), this);
        // 編譯完成之后 將dom 添加到節點中
        document.getElementById(id).appendChild(Dom)
    }

    var vm = new Vue({
        el: 'app',
        data: {
            text: 'hello,world'
        }
    })

    vm.text = 'ma'

</script>
mark
  • 組件化思想
  1. 將實現頁面的某一部分功能的結構,樣式和邏輯封裝為一個整體,使其高內聚,低耦合,達到分治和復用的目的

     為了提高代碼復用性,減少重復性的開發,我們就把相關的代碼按照 template、style、script 拆分,封裝成一個個的組件。組件可以擴展
    

    HTML 元素,封裝可重用的 HTML 代碼,我們可以將組件看作自定義的 HTML 元素。在 Vue 里面,每個封裝好的組件可以看成一個個的 ViewModel。

  2. 組件的執行順序

  • 子組件先在父組件中的 components 中進行注冊。
  • 父組件利用 Vue.component 注冊到全局。
  • 當渲染父組件的時候,渲染到 <child-component> ,會把子組件也渲染出來。

vue的路由分發(vue-router)

vue的路由分發主要是使用vue-router 本質來說 使用了哈希路徑和瀏覽器的history(html5新增api)

vue-router的安裝和項目中的配置

npm install vue-router --save

vue-router的官網

//  在main.js中這樣配置  
import Vue from 'vue'
import App from './App'
import router from './router'

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  store,
  template: '<App/>',
  components: {App},
  methods: {
    
  },
  created() {
    
  },
})

//  在router文件夾下的index.js中 這樣配置  

import Vue from 'vue';
import Router from 'vue-router';
import dashboard from '../pages/dashboard/dashboard.vue';


import index from '../pages/index.vue';
//系統設置頁面
import systemSetting from '../components/systemSetting/systemSetting.vue'
// 引入登錄頁
import login from '../pages/auth/login/login.vue'
//引入注冊頁
import register from '../pages/auth/register/register.vue'

Vue.use(Router)

var router = new Router({
  routes: [
    {
      path: '/login',
      name: 'login',
      component: superTubeLogin,
    },
    {
      path: '/register',
      name: 'register',
      component: register
    },
   
    {
      path: '/',
      name: 'index',
      component: index,
      children: [
        {
          path: '/dashboard',
          name: 'dashboard',
          component: dashboard,
        },
        //系統設置的頁面
        {
          path: '/systemSetting',
          name: 'systemSetting',
          component: systemSetting,
        },
        //工作組

        //授權用戶管理
        {
          path: '/boxUserManageAllow',
          name: 'boxUserManageAllow',
          component: boxUserManageAllow
        },
      ]
    },
    {
      path: '*',
      component: notFoundComponent
    }
  ]
})


router.beforeEach((to, from, next) => {
  // 這里寫的邏輯 任何路由跳轉之前都會執行
})


export default router



我們可以使用vue-router做那些事

  1. 配置路由分發

  2. 設置路由重定向

    • 典型的應用場景有 做登錄前的禁止跳轉
    • 在用戶訪問不存在的頁面的時候 跳轉到自定義的404頁面
  3. 在組件中進行路由的跳轉

  4. 進行組件之間的傳參

    const router = new VueRouter({
      routes: [
        {
          // 
          path: '/user/:userId',
          name: 'user',
          component: User
        }
      ]
    })
    
    // 在組件中 應該這樣寫 router-link 在渲染時 會被轉化為a標簽
    <router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link>
    // 在vue的生命周期 或者 methods中 應該這樣寫  
    router.push({ name: 'user', params: { userId: 123 }})
    
    // 關于如何使用query進行傳遞參數  這里給出了一個示例
    // http://blog.csdn.net/k491022087/article/details/70214664
    

    向路由組件傳遞props

    https://router.vuejs.org/zh-cn/essentials/passing-props.html

  5. 根據路由元信息 設置組件的初始化或者區別組件

  6. 設置過渡的動態效果

  7. 路由信息對象

    https://router.vuejs.org/zh-cn/api/route-object.html

vue-router的使用注意事項

  • 在組件中跳轉的時候 和 獲取路由元信息的時候

    //  組件中跳轉
    this.$router.push({
              name: page,
              params: {id: 0, type: page, content: item.content, template: item.template}
     })
     
     //  獲取路由元信息 
    this.$route.params.apiId
     
    

    ?

  • 監聽路由變化

    wacth:{
      '$route'(to, from) {
           .....
          },
    }
    

vue的復雜存儲(vuex)

vue通信

項目中遇到的比較通用的問題(易錯點)

1 如何阻止冒泡和事件的默認行為

2 多層數據的嵌套以及更改vue遍歷好的數組之后 如何進行實時顯示

3 如果遇到跨域問題 如何解決

4 如何減少文件壓縮體積

5 如何進行文件的打包

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容