學習Vue.js-Day1

學習內容

1,Vue基本語法和概念
2, 打包工具 Webpack , Gulp
3,實戰操做html


參考文獻:
官網: https://cn.vuejs.org/v2/guide/
官方資料庫: https://github.com/vuejs/awes...
全家桶: https://github.com/vuejs/vue-cli
Webpack全家桶文檔: http://vuejs-templates.github...
Vue Router: https://router.vuejs.org/
Vuex: https://vuex.vuejs.org/
Vue-resource: https://github.com/pagekit/vu...
Element-UI: http://element.eleme.io/#/zh-CN前端


Vue概念

  • VUE.js前端框架(藉助Wexx能夠實現手機App開發);React前端框架;
  • Vue.js是一套構造用戶界面的框架,只關於視圖層;
  • 前端的主要工做室跟用戶界面打交道,MVC中的V,實現界面效果;框架是爲了提升開發效率;
  • 在Vue中,一個核心的概念,就是讓用戶不在操做DOM元素,解放了用戶的雙手(幫助咱們減小沒必要要的DOM操做,【雙向綁定概念】經過框架提供的指令,咱們前端程序員只須要關心數據的業務邏輯,不在關心DOM是如何渲染的了)
  • Vue.js 最核心的功能有兩個,一是響應式的數據綁定系統,二是組件系統。

框架和庫的區別

  • 框架是一整套的解決方案;對項目的侵入性較大, 項目在進行中時,更做框架更換是不可取的;
  • 庫(插件):庫是提供某一個小功能,對項目的侵入性較小,若是某個庫沒法知足開發需求,則能夠很容易切換到其它庫實現需求
    -1. 從Jquery 切換到 Zepto
    -2. 從EJS 切換到 art-template

Node(後端)中的MVC與 前端 中的 MVVM 之間的區別

  • MVC 是後端的分層開發概念;

MVC開發思想

  • MVVM 是端視圖層的概念
    MVVM是前端視圖層的分層開發思想,主要把每一個頁面,分紅了M,V,VM三個頁面
    其中VM 是MVVM 思想的核心;由於VM是M 和V之間的調度者
    前端頁面中使用MVVM的思想,主要是爲了讓咱們開發更加方便,由於MVVM提供了數據的雙向綁定(由VM提供的)

clipboard.png

首個Vue頁面

  • 如今官網下載VUE
  • 在編輯器中導入
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <!-- 1. 導入Vue的包 -->
    <script src="./lib/vue-2.4.0.js"></script>
</head>

<body>
    <!-- 未來 new 的Vue實例,會控制這個 元素中的全部內容 -->
    <!-- Vue 實例所控制的這個元素區域,就是咱們的 V  -->
    <div id="app">
        <p>{{ msg }}</p>
    </div>

    <script>
        // 2. 建立一個Vue的實例
        // 當咱們導入包以後,在瀏覽器的內存中,就多了一個 Vue 構造函數
        //  注意:咱們 new 出來的這個 vm 對象,就是咱們 MVVM中的 VM調度者
        var vm = new Vue({
            el: '#app', // 表示,當前咱們 new 的這個 Vue 實例,要控制頁面上的哪一個區域
            // 這裏的 data 就是 MVVM中的 M,專門用來保存 每一個頁面的數據的
            data: { // data 屬性中,存放的是 el 中要用到的數據
                msg: '歡迎學習Vue',
                // 經過 Vue 提供的指令,很方便的就能把數據渲染到頁面上,程序員再也不手動操做DOM元素了
                //【前端的Vue之類的框架,不提倡咱們去手動操做DOM元素了】
            }
        })
    </script>
</body>

</html>

v-cloak,v-text,v-html的基本使用

  • v-cloak 可以解決 插值表達式閃爍的問題
  • v-text 會覆蓋元素中本來的內容,可是插值表達式 只會替換本身的這個佔位符,不會把 整個元素的內容清空.
  • v-html 能夠解析表達式中的<h2>等html標籤

v-bind的使用

用於綁定屬性的指令,例如給input標籤下的 title 綁定 屬性show ,使得鼠標放置在按鈕時呈現show中的內容vue

<input type="button" value="按鈕"  v-bind:title="show">

鼠標放置在按鈕時,將顯示「這是一個本身定義的titile」webpack

var vm = new Vue({
      el: '#app',
      data: {
        msg: '123',
        msg2: '<h1>哈哈,我是一個大大的H1, 我大,我驕傲</h1>',
        show: '這是一個本身定義的title'
      },

ps. v-bind 中,能夠寫合法的JS表達式,所以能夠在後面添加表達式,好比v-bind:title='show+'123'';
注意: v-bind: 指令能夠被簡寫爲 :要綁定的屬性git

:title='show+'123'';

v-on指令定義Vue中的事件

在不操做DOM的狀況下,實現事件綁定機制程序員

<input type="button" name="" id="" value="按鈕" v-on:click="zxc"/>

ps. 一樣的 v-on 能夠簡寫爲 @github

methods: { // 這個 methods屬性中定義了當前Vue實例全部可用的方法
        zxc: function () {
          alert('Hello')
        }
      }

跑馬燈效果製做

難點:web

  • 屢次點擊'啓動'時,須要屢次點擊'中止'
  • 注意局部變量的訪問問題
  • 當點擊'啓動'時將定時器定義爲null,再次點擊無效,將'中止'定義爲null,再次點擊無效果

分析:vuex

1. 給 【浪起來】 按鈕,綁定一個點擊事件   `v-on`   @
 2. 在按鈕的事件處理函數中,寫相關的業務邏輯代碼:拿到 msg 字符串,而後 調用 字符串的 substring 來進行字符串的截取操做,把 第一個字符截取出來,放到最後一個位置便可;
 3. 爲了實現點擊下按鈕,自動截取的功能,須要把 2 步驟中的代碼,放到一個定時器中去;
<!-- 2. 建立一個要控制的區域 -->
  <div id="app">
    <input type="button" value="浪起來" @click="lang">
    <input type="button" value="低調" @click="stop">

    <h4>{{ msg }}</h4>

  </div>

  <script>
    // 注意:在 VM實例中,若是想要獲取 data 上的數據,或者 想要調用 methods 中的 方法,必須經過 this.數據屬性名  或  this.方法名 來進行訪問,這裏的this,就表示 咱們 new 出來的  VM 實例對象
    var vm = new Vue({
      el: '#app',
      data: {
        msg: '猥瑣發育,別浪~~!',
        intervalId: null // 在data上定義 定時器Id
      },
      methods: {
        lang() {
          // console.log(this.msg)
          // 獲取到頭的第一個字符
          // this

          if (this.intervalId != null) return;

          this.intervalId = setInterval(() => {
            var start = this.msg.substring(0, 1)
            // 獲取到 後面的全部字符
            var end = this.msg.substring(1)
            // 從新拼接獲得新的字符串,並賦值給 this.msg
            this.msg = end + start
          }, 400)

          // 注意: VM實例,會監聽本身身上 data 中全部數據的改變,只要數據一發生變化,就會自動把 最新的數據,從data 上同步到頁面中去;【好處:程序員只須要關心數據,不須要考慮如何從新渲染DOM頁面】
        },
        stop() { // 中止定時器
          clearInterval(this.intervalId)
          // 每當清除了定時器以後,須要從新把 intervalId 置爲 null
          this.intervalId = null;
        }
      }
    })

Vue 中的事件修飾符

  • .stop 阻止冒泡

點擊button按鈕時,控制檯只輸出 button 的點擊事件,不會捕獲<div>中的事件vue-cli

<div id="" class="inner" @click="div1Handler">
    <input type="button" name="" id="" value="點擊它" @click.stop="btnHandler"/>
</div>
  • .prevent 阻止默認事件

tx事件被阻止,頁面不會跳轉

<a href="http://www.qq.com" @click.prevent='tx'>騰訊網</a>
  • .capture 添加事件監聽器時使用事件捕獲模式

.stop 是阻止冒泡,也就是說阻止外表事件的發生。而.capture是讓外部事件先發生
點擊按鈕時先觸發空間背景事件。

clipboard.png

  • .self 只當事件在該元素自己(好比不是子元素)觸發回調

只能放在元素自己;當下面代碼中的.self放在input當中時,依舊會發生冒泡事件

<div id="" class="inner" @click.self="div1Handler">
    <input type="button" name="" id="" value="點擊它" @click="btnHandler"/>
</div>
  • .once 事件只觸發一次

只觸發一次事件處理函數

<a href="http://www.qq.com" @click.once='tx'>騰訊網</a>

v-model和數據雙向綁定

v-bind只能實現數據的單線綁定,從M層綁定到V層;
v-model 只能用在表單元素中
其中包括:input(redio,text.address,email...) select checkbox textarea

<div id="app-6">
  <p>{{ message }}</p>
  <input v-model="message">
</div>
var app6 = new Vue({
  el: '#app-6',
  data: {
    message: 'Hello Vue!'
  }
})

經過雙向綁定完成--計算器Demo

定義3個input標籤text屬性,1個select標籤

<div id="app">
    <input type="text" v-model="n1">

    <select v-model="opt">
      <option value="+">+</option>
      <option value="-">-</option>
      <option value="*">*</option>
      <option value="/">/</option>
    </select>

    <input type="text" v-model="n2">

    <input type="button" value="=" @click="calc">

    <input type="text" v-model="result">
  </div>

在data下定義事件,初始化值。能夠選用switch作判斷循環;也可使用 eval方案(該方法可直接判斷加減乘除符號)

<script>
    // 建立 Vue 實例,獲得 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        n1: 0,
        n2: 0,
        result: 0,
        opt: '+'
      },
      methods: {
        calc() { // 計算器算數的方法  
          // 邏輯:
          /* switch (this.opt) {
            case '+':
              this.result = parseInt(this.n1) + parseInt(this.n2)
              break;
            case '-':
              this.result = parseInt(this.n1) - parseInt(this.n2)
              break;
            case '*':
              this.result = parseInt(this.n1) * parseInt(this.n2)
              break;
            case '/':
              this.result = parseInt(this.n1) / parseInt(this.n2)
              break;
          } */

          // 注意:這是投機取巧的方式,正式開發中,儘可能少用
          var codeStr = 'parseInt(this.n1) ' + this.opt + ' parseInt(this.n2)'
          this.result = eval(codeStr)
        }
      }
    });
  </script>

在Vue中使用樣式(綁定HTML CSS Class)

如下例子將的將於此代碼,爲方便理解在此展現出來

<style>
    .red {
      color: red;
    }

    .thin {
      font-weight: 200;
    }

    .italic {
      font-style: italic;
    }

    .active {
      letter-spacing: 0.5em;
    }
  </style>
<script>
    // 建立 Vue 實例,獲得 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        flag: true,
        classObj: { red: true, thin: true, italic: false, active: false }
      },
      methods: {}
    });
  </script>

ps.傳統實現方式: <h1 :class="['red', 'thin']">這是一個邪惡的H1</h1>

  1. 第一種使用方式,直接傳遞一個數組,注意: 這裏的 class 須要使用 v-bind 作數據綁定

    <h1 :class="['red', 'thin']">這是一個邪惡的H1</h1>
  2. 在數組中使用三元表達式

當flag爲真時,執行active樣式,不然不執行

<h1 :class="['red', 'thin', flag?'active':'']">這是一個邪惡的H1</h1>
  1. 在數組中使用 對象來代替三元表達式,提升代碼的可讀性

    <h1 :class="['thin', 'italic', {'active':flag} ]">

  2. 當在一個自定義組件上使用 class 屬性時,這些類將被添加到該組件的根元素上面。這個元素上已經存在的類不會被覆蓋
<h1 :class="{red:true, italic:true, active:true, thin:true}">這是一個邪惡的H1</h1>

能夠在class中直接寫,也能夠將對象寫在data中,直接引用其屬性.

<h1 :class="classObj">這是一個很大很大的H1,大到你沒法想象!!!</h1>

在Vue中使用樣式(內聯樣式)

  1. 直接在元素上經過 :style 的形式,書寫樣式對象
<h1 :style="{color: 'red', 'font-size': '40px'}">這是一個善良的H1</h1>
  1. 將樣式對象,定義到 data 中,並直接引用到 :style
data: {
        h1StyleObj: { color: 'red', 'font-size': '40px', 'font-weight': '200' }
}
  • 在元素中,經過屬性綁定的形式,將樣式對象應用到元素中:
<h1 :style="h1StyleObj">這是一個善良的H1</h1>
  1. :style 中經過數組,引用多個 data 上的樣式對象
  • 在data上定義樣式:
data: {
        h1StyleObj: { color: 'red', 'font-size': '40px', 'font-weight': '200' },
        h1StyleObj2: { fontStyle: 'italic' }
}
  • 在元素中,經過屬性綁定的形式,將樣式對象應用到元素中:
<h1 :style="[h1StyleObj, h1StyleObj2]">這是一個善良的H1</h1>

Vue指令v-forkey

ps.在使用2.X以上的版本時,key屬性是必須有的

  1. 循環普通數組
<div id="app">
    <p v-for="(item, i) in list">索引值:{{i}} --- 每一項:{{item}}</p>
  </div>
<script>
    // 建立 Vue 實例,獲得 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        list: [1, 2, 3, 4, 5, 6]
      },
      methods: {}
    });
  </script>

  1. 循環對象數組
<div id="app">
    <p v-for="(user, i) in list">Id:{{ user.id }} --- 名字:{{ user.name }} --- 索引:{{i}}</p>
  </div>
<script>
    // 建立 Vue 實例,獲得 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        list: [
          { id: 1, name: 'zs1' },
          { id: 2, name: 'zs2' },
          { id: 3, name: 'zs3' },
          { id: 4, name: 'zs4' }
        ]
      },
      methods: {}
    });
  </script>

  1. 循環對象
<div id="app">
    <!-- 注意:在遍歷對象身上的鍵值對的時候, 除了 有  val  key  ,在第三個位置還有 一個 索引  -->
    <p v-for="(val, key, i) in user">值是: {{ val }} --- 鍵是: {{key}} -- 索引: {{i}}</p>
  </div>
<script>
    // 建立 Vue 實例,獲得 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        user: {
          id: 1,
          name: '託尼·屎大顆',
          gender: '男'
        }
      },
      methods: {}
    });
  </script>

  1. 迭代數子
<div id="app">
    <!-- in 後面咱們放過  普通數組,對象數組,對象, 還能夠放數字 -->
    <!-- 注意:若是使用 v-for 迭代數字的話,前面的 count 值從 1 開始 -->
    <p v-for="count in 10">這是第 {{ count }} 次循環</p>
  </div>
<script>
    // 建立 Vue 實例,獲得 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {},
      methods: {}
    });
  </script>

Vue中 v-for 中的key屬性

<div id="app">

    <div>
      <label>Id:
        <input type="text" v-model="id">
      </label>

      <label>Name:
        <input type="text" v-model="name">
      </label>

      <input type="button" value="添加" @click="add">
    </div>

    <!-- 注意: v-for 循環的時候,key 屬性只能使用 number獲取string -->
    <!-- 注意: key 在使用的時候,必須使用 v-bind 屬性綁定的形式,指定 key 的值 -->
    <!-- 在組件中,使用v-for循環的時候,或者在一些特殊狀況中,若是 v-for 有問題,必須 在使用 v-for 的同時,指定 惟一的 字符串/數字 類型 :key 值 -->
    <p v-for="item in list" :key="item.id">
      <input type="checkbox">{{item.id}} --- {{item.name}}
    </p>
  </div>
<div id="app">

    <div>
      <label>Id:
        <input type="text" v-model="id">
      </label>

      <label>Name:
        <input type="text" v-model="name">
      </label>

      <input type="button" value="添加" @click="add">
    </div>

    <!-- 注意: v-for 循環的時候,key 屬性只能使用 number獲取string -->
    <!-- 注意: key 在使用的時候,必須使用 v-bind 屬性綁定的形式,指定 key 的值 -->
    <!-- 在組件中,使用v-for循環的時候,或者在一些特殊狀況中,若是 v-for 有問題,必須 在使用 v-for 的同時,指定 惟一的 字符串/數字 類型 :key 值 -->
    <p v-for="item in list" :key="item.id">
      <input type="checkbox">{{item.id}} --- {{item.name}}
    </p>
  </div>

v-ifv-show

<div id="app">

    <!-- <input type="button" value="toggle" @click="toggle"> -->
    <input type="button" value="toggle" @click="flag=!flag">

    <!-- v-if 的特色:每次都會從新刪除或建立元素 -->
    <!-- v-show 的特色: 每次不會從新進行DOM的刪除和建立操做,只是切換了元素的 display:none 樣式 -->

    <!-- v-if 有較高的切換性能消耗 -->
    <!-- v-show 有較高的初始渲染消耗 -->

    <!-- 若是元素涉及到頻繁的切換,最好不要使用 v-if, 而是推薦使用 v-show -->
    <!-- 若是元素可能永遠也不會被顯示出來被用戶看到,則推薦使用 v-if -->
    <h3 v-if="flag">這是用v-if控制的元素</h3>
    <h3 v-show="flag">這是用v-show控制的元素</h3>

  </div>
<script>
    // 建立 Vue 實例,獲得 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        flag: false
      },
      methods: {
        /* toggle() {
          this.flag = !this.flag
        } */
      }
    });
  </script>
相關文章
相關標籤/搜索