前端之Vue.js庫的使用


 

vue.js簡介

Vue.js讀音 /vjuː/, 類似於 view

Vue.js是前端三大新框架:Angular.js、React.js、Vue.js之一,Vue.js目前的使用和關注程度在三大框架中稍微勝出,並且它的熱度還在遞增。

Vue.js可以作為一個js庫來使用,也可以用它全套的工具來構建系統界面,這些可以根據項目的需要靈活選擇,所以說,Vue.js是一套構建用戶界面的漸進式框架。

Vue的核心庫只關注視圖層,Vue的目標是通過盡可能簡單的 API 實現響應的數據綁定,在這一點上Vue.js類似於后台的模板語言。

Vue也可以將界面拆分成一個個的組件,通過組件來構建界面,然后用自動化工具來生成單頁面(SPA - single page application)系統。

Vue.js使用文檔及下載Vue.js

Vue.js使用文檔已經寫的很完備和詳細了,通過以下地址可以查看:https://cn.vuejs.org/v2/guide/
vue.js如果當成一個庫來使用,可以通過下面地址下載:https://cn.vuejs.org/v2/guide/installation.html

Vue.js基本概念

首先通過將vue.js作為一個js庫來使用,來學習vue的一些基本概念,我們下載了vue.js后,需要在頁面上通過script標簽引入vue.js,開發中可以使用開發版本vue.js,產品上線要換成vue.min.js。

<script type="text/javascript" src="js/vue.min.js"></script> 

Vue實例

每個 Vue 應用都是通過實例化一個新的 Vue對象開始的:

window.onload = function(){
    var vm = new Vue({
        el:'#app',
        data:{message:'hello world!'}
    });
}    
......

<div id="app">{{ message }}</div>

其中,el屬性對應一個標簽,當vue對象創建后,這個標簽內的區域就被vue對象接管,在這個區域內就可以使用vue對象中定義的屬性和方法。

數據與方法

當一個 Vue 實例被創建時,它向 Vue 的響應式系統中加入了其data對象中能找到的所有的屬性。當這些屬性的值發生改變時,視圖將會產生“響應”,即匹配更新為新的值。還可以在Vue實例中定義方法,通過方法來改變實例中data對象中的數據,數據改變了,視圖中的數據也改變。

window.onload = function(){
    var vm = new Vue({
        el:'#app',
        data:{message:'hello world!'},
        methods:{
            fnChangeMsg:function(){
                this.message = 'hello Vue.js!';
            }
        }
    });
}    
......

<div id="app">
    <p>{{ message }}</p>
    <button @click="fnChangeMsg">改變數據和視圖</button>
</div>

Vue.js模板語法

模板語法指的是如何將數據放入html中,Vue.js使用了基於 HTML的模板語法,允許開發者聲明式地將DOM綁定至底層 Vue 實例的數據。所有 Vue.js的模板都是合法的 HTML ,所以能被遵循規范的瀏覽器和 HTML 解析器解析。

插入值

數據綁定最常見的形式就是使用“Mustache”語法 (雙大括號) 的文本插值:

<span>Message: {{ msg }}</span>

如果是標簽的屬性要使用值,就不能使用“Mustache”語法,需要寫成使用v-bind指令:

<a v-bind:href="url" v-bind:title='tip'>百度網</a>

插入的值當中還可以寫表達式:

{{ number + 1 }}
{{ ok ? 'YES' : 'NO' }}
{{ message.split('').reverse().join('') }}
<a v-bind:href="url">鏈接文字</a>  

指令

指令 (Directives) 是帶有“v-”前綴的特殊屬性。指令屬性的值預期是單個JavaScript表達式,指令的職責是,當表達式的值改變時,將其產生的連帶影響,響應式地作用於DOM。常見的指令有v-bind、v-if、v-on。

<!-- 根據ok的布爾值來插入/移除 <p> 元素 -->
<p v-if="ok">是否顯示這一段</p>

<!-- 監聽按鈕的click事件來執行fnChangeMsg方法 -->
<button v-on:click="fnChangeMsg">按鈕</button>

縮寫

v-bind和v-on事件這兩個指令會經常用,所以有簡寫方式:

<!-- 完整語法 -->
<a v-bind:href="url">...</a>

<!-- 縮寫 -->
<a :href="url">...</a>


<!-- 完整語法 -->
<button v-on:click="fnChangeMsg">按鈕</button>

<!-- 縮寫 -->
<button @click="fnChangeMsg">按鈕</button> 

計算屬性和偵聽屬性

計算屬性

模板內的表達式非常便利,但是設計它們的初衷是用於簡單運算的。在模板中放入太多的邏輯會讓模板過重且難以維護。例如:

<div id="example">
  {{ message.split('').reverse().join('') }}
</div>

這個表達式的功能是將message字符串進行反轉,這種帶有復雜邏輯的表達式,我們可以使用計算屬性

<div id="example">
  <p>Original message: "{{ message }}"</p>
  <p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>

......

var vm = new Vue({
  el: '#example',
  data: {
    message: 'Hello'
  },
  computed: {
    // 計算屬性的 getter
    reversedMessage: function () {
      // `this` 指向 vm 實例
      return this.message.split('').reverse().join('')
    }
  }
}) 

偵聽屬性

偵聽屬性的作用是偵聽某屬性值的變化,從而做相應的操作,偵聽屬性是一個對象,它的鍵是要監聽的對象或者變量,值一般是函數,當你偵聽的元素發生變化時,需要執行的函數,這個函數有兩個形參,第一個是當前值,第二個是變化后的值。

indow.onload = function(){
    var vm = new Vue({
        el:'#app',
        data:{
            iNum:1
        },
        watch:{
            iNum:function(newval,oldval){
                console.log(newval + ' | ' + oldval) 
            }
        },
        methods:{
            fnAdd:function(){
                this.iNum += 1;
            }
        }
    });
}

  

Class 與 Style 綁定

使用v-bind指令來設置元素的class屬性或者sytle屬性,它們的屬性值可以是表達式,vue.js在這一塊做了增強,表達式結果除了是字符串之外,還可以是對象或者數組。

Class綁定

對象語法

可以給v-bind:class傳一個對象,以動態的切換class

<div class="static" v-bind:class="{active:isActive,'text-danger':hasError }"></div>

data屬性值如下:

data: {
  isActive: true,
  hasError: false
}

最終渲染的效果:

<div class="static active"></div>

也可以給v-bind:class傳一個對象引用

<div v-bind:class="classObject"></div>

data屬性值可以寫成:

data: {
  classObject: {
    active: true,
    'text-danger': false
  }
} 

數組語法

可以給v-bind:class傳一個數組,以應用一個 class 列表

<div v-bind:class="[activeClass, errorClass]"></div>
......

data: {
  activeClass: 'active',
  errorClass: 'text-danger'
}

最終渲染為:

<div class="active text-danger"></div>

如果你也想根據條件切換列表中的 class,可以用三元表達式:

<div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>

不過,當有多個條件class時這樣寫有些繁瑣。所以在數組語法中也可以使用對象語法:

<div v-bind:class="[{ active: isActive }, errorClass]"></div>

style綁定

對象語法

v-bind:style 的對象語法十分直觀——看着非常像 CSS,但其實是一個JavaScript 對象。CSS 屬性名可以用駝峰式 (camelCase) 來命名:

<div v-bind:style="{color: activeColor, fontSize: fontSize + 'px' }"></div>

data數據如下:

data: {
  activeColor: 'red',
  fontSize: 30
}

也可以給v-bind:style傳一個對象引用

<div v-bind:style="styleObject"></div>

data數據如下:

data: {
  styleObject: {
    color: 'red',
    fontSize: '13px'
  }
}

數組語法

v-bind:style 的數組語法可以將多個樣式對象應用到同一個元素上:

<div v-bind:style="[baseStyles, overridingStyles]"></div> 

條件渲染

通過條件指令可以控制元素的創建(顯示)或者銷毀(隱藏),常用的條件指令如下:

v-if

v-if可以控制元素的創建或者銷毀

<h1 v-if="ok">Yes</h1>

v-else

v-else指令來表示 v-if 的“else 塊”,v-else 元素必須緊跟在帶 v-if 或者 v-else-if 的元素的后面,否則它將不會被識別。

<div v-if="Math.random() > 0.5">
  Now you see me
</div>
<div v-else>
  Now you don't
</div>

v-else-if

v-else-if,顧名思義,充當 v-if 的“else-if 塊”,可以連續使用:

<div v-if="type === 'A'">
  A
</div>
<div v-else-if="type === 'B'">
  B
</div>
<div v-else-if="type === 'C'">
  C
</div>
<div v-else>
  Not A/B/C
</div> 

v-show

另一個用於根據條件展示元素的選項是 v-show 指令。用法和v-if大致一樣,但是它不支持v-else,它和v-if的區別是,它制作元素樣式的顯示和隱藏,元素一直是存在的:

<h1 v-show="ok">Hello!</h1>

列表渲染

通過v-for指令可以將一組數據渲染到頁面中,數據可以是數組或者對象,v-for 指令需要使用 item in items 形式的特殊語法,items 是源數據數組並且 item 是數組元素迭代的別名。

遍歷數組

<ul id="example-1">
  <li v-for="item in items">
    {{ item}}
  </li>
</ul>

vue對象創建如下:

var example1 = new Vue({
  el: '#example-1',
  data: {
    items: ['foo','bar']
  }
})

如果想加上索引值,可以加上第二個參數

<ul id="example-2">
  <li v-for="(item, index) in items">
    {{ index }} - {{ item.message }}
  </li>
</ul>

遍歷對象

也可以用 v-for 通過一個對象的屬性來迭代

<ul id="v-for-object">
  <li v-for="value in object">
    {{ value }}
  </li>
</ul>

如果想加上對象屬性名,可以加上第二個參數

<ul id="v-for-object">
  <li v-for="(value,key) in object">
    {{ key }}-{{ value }}
  </li>
</ul>

事件處理

事件綁定方法

可以用 v-on 指令監聽 DOM 事件,並在觸發時運行一些 JavaScript 代碼,事件的處理,簡單的邏輯可以寫在指令中,復雜的需要在vue對象的methods屬性中指定處理函數。

<div id="example-1">
  <!-- 在指令中寫處理邏輯 -->
  <button v-on:click="counter += 1">Add 1</button>
  <p>The button above has been clicked {{ counter }} times.</p>
</div>
......
var example1 = new Vue({
  el: '#example-1',
  data: {
    counter: 0
  }
})

methods屬性中指定處理函數:

<div id="example-2">
  <!-- greet 是在下面定義的方法名 -->
  <button v-on:click="greet">Greet</button>
</div>
......

var example2 = new Vue({
  el: '#example-2',
  data: {
    name: 'Vue.js'
  },
  // 在 `methods` 對象中定義方法
  methods: {
    greet: function () {
      // `this` 在方法里指向當前 Vue 實例
      alert('Hello ' + this.name + '!')
    }
  }
})

事件修飾符

實際開發中,事件綁定有時候牽涉到阻止事件冒泡以及阻止默認行為,在vue.js可以加上事件修飾符

<!-- 阻止單擊事件繼續傳播 -->
<a v-on:click.stop="doThis"></a>

<!-- 提交事件不再重載頁面 -->
<form v-on:submit.prevent="onSubmit"></form>

<!-- 修飾符可以串聯 -->
<a v-on:click.stop.prevent="doThat"></a>

<!-- 只有修飾符 -->
<form v-on:submit.prevent></form>

表單輸入綁定

可以用 v-model 指令在表單 <input> 及 <textarea> 元素上創建雙向數據綁定。它會根據控件類型自動選取正確的方法來更新元素

單行文本框

<input v-model="message" placeholder="edit me">
<p>Message is: {{ message }}</p>

多行文本框

<span>Multiline message is:</span>
<p>{{ message }}</p>
<textarea v-model="message" placeholder="add multiple lines"></textarea>

復選框

單個復選框,綁定到布爾值:

<input type="checkbox" id="checkbox" v-model="checked">
<label for="checkbox">{{ checked }}</label>

多個復選框,綁定到同一個數組:

<div id='example-3'>
  <input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
  <label for="jack">Jack</label>
  <input type="checkbox" id="john" value="John" v-model="checkedNames">
  <label for="john">John</label>
  <input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
  <label for="mike">Mike</label>
  <br>
  <span>Checked names: {{ checkedNames }}</span>
</div>

......

new Vue({
  el: '#example-3',
  data: {
    checkedNames: []
  }
})

單選框

<div id="example-4">
  <input type="radio" id="one" value="One" v-model="picked">
  <label for="one">One</label>
  <br>
  <input type="radio" id="two" value="Two" v-model="picked">
  <label for="two">Two</label>
  <br>
  <span>Picked: {{ picked }}</span>
</div>

......
new Vue({
  el: '#example-4',
  data: {
    picked: ''
  }
})

下拉框

<div id="example-5">
  <select v-model="selected">
    <option disabled value="">請選擇</option>
    <option>A</option>
    <option>B</option>
    <option>C</option>
  </select>
  <span>Selected: {{ selected }}</span>
</div>
......

new Vue({
  el: '...',
  data: {
    selected:''
  }
})

過濾器

Vue.js允許你自定義過濾器,可被用於一些常見的文本格式化。過濾器可以用在兩個地方:雙花括號插值和 v-bind 表達式

<!-- 在雙花括號中 -->
{{ prize | RMB }}

<!-- 在v-bind中 -->
<div v-bind:id="rawId | formatId"></div>

過濾器實際上是一個函數,可以在一個組件的選項中定義組件內部過濾器:

filters:{
  RMB:function(value){
    if(value=='')
    {
      return;
    }
    return '¥ '+value;
  }
}

或者在創建 Vue 實例之前全局定義過濾器:

Vue.filter('Yuan',function(value){
  if(value=='')
  {
    return;
  }
  return value+'元';
});

此時過濾器'RMB'只能在定義它的對象接管標簽內使用,而'Yuan'可以全局使用

自定義指令

指令是用來做dom操作的,如果vue現有的指令不能滿足開發要求,我們需要對普通DOM元素進行底層操作,這時候就會用到自定義指令。

定義一個全局指令,讓input框自動獲取焦點

Vue.directive('focus',{
  inserted:function(el,binding){
    el.focus();
    el.style.background = 'gold';
    console.log(binding.name);
  }     
})
......

<div id="app">    
  <input type="text" v-focus>
</div>

如果定義成vue對象局部的,可以用vue對象的directives屬性:

directives: {
  focus: {
    inserted: function (el,binding) {
      el.focus();
      el.style.background = 'gold';
      console.log(binding.name);
    }
  }
} 

實例生命周期

每個Vue實例在被創建時都要經過一系列的初始化過程——例如,需要設置數據監聽、編譯模板、將實例掛載到DOM並在數據變化時更新 DOM 等。同時在這個過程中會自動運行一些叫做生命周期鈎子的函數,我們可以使用這些函數,在實例的不同階段加上我們需要的代碼,實現特定的功能。

beforeCreate

在實例初始化之后,數據觀測 (data observer) 和 event/watcher 事件配置之前被調用。

created

在實例創建完成后被立即調用。在這一步,實例已完成以下的配置:數據觀測 (data observer),屬性和方法的運算,watch/event 事件回調。然而,掛載階段還沒開始

beforeMount

在掛載開始之前被調用:相關的 render 函數首次被調用。

mounted

實例掛載到dom之后被調用,可以當成是vue對象的ready方法來使用,一般用它來做dom的初始化操作。

beforeUpdate

數據發生變化前調用

updated

數據發生變化后調用

數據交互

vue.js沒有集成ajax功能,要使用ajax功能,可以使用vue官方推薦的axios.js庫來做ajax的交互。 axios庫的下載地址:https://github.com/axios/axios/releases

axios完整寫法:

axios({
  method: 'post',
  url: '/user/12345',
  data: {
    firstName: 'Fred',
    lastName: 'Flintstone'
  }
});

axios請求的寫法也可寫成get方式或post方式。

執行get請求

// 為給定 ID 的 user 創建請求
// then是請求成功時的響應,catch是請求失敗時的響應

axios.get('/user?ID=12345')
.then(function (response) {
  console.log(response);
})
.catch(function (error) {
  console.log(error);
});


// 可選地,上面的請求可以這樣做
axios.get('/user', {
  params: {
    ID: 12345
  }
})
.then(function (response) {
  console.log(response);
})
.catch(function (error) {
  console.log(error);
});  

執行post請求

axios.post('/user', {
  firstName: 'Fred',
  lastName: 'Flintstone'
})
.then(function (response) {
  console.log(response);
})
.catch(function (error) {
  console.log(error);
}); 

ES6語法

ES6是JavaScript語言的新版本,它也可以叫做ES2015,之前學習的JavaScript屬於ES5,ES6在它的基礎上增加了一些語法,ES6是未來JavaScript的趨勢,而且vue組件開發中會使用很多的ES6的語法,所以掌握這些常用的ES6語法是必須的。

變量聲明let和const

let和const是新增的聲明變量的開頭的關鍵字,在這之前,變量聲明是用var關鍵字,這兩個關鍵字和var的區別是,它們聲明的變量沒有預解析,let和const的區別是,let聲明的是一般變量,const申明的常量,不可修改。

alert(iNum01) // 彈出undefined
// alert(iNum02); 報錯,let關鍵字定義變量沒有變量預解析
// alert(iNum03); 報錯,const關鍵字定義變量沒有變量預解析

var iNum01 = 6;
// 使用let關鍵字定義變量
let iNum02 = 12;
// 使用const關鍵字定義變量
const iNum03 = 24;

alert(iNum01); // 彈出6
alert(iNum02); // 彈出12
alert(iNum03); // 彈出24

iNum01 = 7;
iNum02 = 13;
//iNum03 = 25; // 報錯,const定義的變量不可修改,const定義的變量是常量

alert(iNum01)
alert(iNum02); 
alert(iNum03); 

箭頭函數

可以把箭頭函數理解成匿名函數的第二種寫法,箭頭函數的作用是可以在對象中綁定this,解決了JavaScript中this指定混亂的問題。

// 定義函數的一般方式
/*
function fnRs(a,b){
    var rs = a + b;
    alert(rs);
}
fnRs(1,2);        
*/

// 通過匿名函數賦值來定義函數
/*
var fnRs = function(a,b){
    var rs = a + b;
    alert(rs);
}
fnRs(1,2);
*/

// 通過箭頭函數的寫法定義
var fnRs = (a,b)=>{
    var rs = a + b;
    alert(rs);
}        
// fnRs(1,2);

// 一個參數可以省略小括號
var fnRs2 = a =>{
    alert(a);
}
fnRs2('haha!');


// 箭頭函數的作用,可以綁定對象中的this
var person = {
    name:'tom',
    age:18,
    showName:function(){
        setTimeout(()=>{
            alert(this.name);
        },1000)            
    }
}
person.showName(); 

模塊導入import和導出export

javascript之前是沒有模塊的功能的,之前做js模塊化開發,是用的一些js庫來模擬實現的,在ES6中加入了模塊的功能,和python語言一樣,python中一個文件就是一個模塊,ES6中,一個js文件就是一個模塊,不同的是,js文件中需要先導出(export)后,才能被其他js文件導入(import)

// model.js文件中導出
var person = {name:'tom',age:18}
export default {person}

// index.js文件夾中導入
import person from 'js/model.js'

// index.js中使用模塊
person.name
person.age

/*
上面導出時使用了default關鍵字,如果不使用這個關鍵字,導入時需要加大括號:
import {person} from 'js/model.js'
*/ 

目前ES6的模塊功能需要在服務器環境下才可以運行。

對象的簡寫

javascript對象在ES6中可以做一些簡寫形式,了解這些簡寫形式,才能方便我們讀懂一些在javascript代碼中簡寫的對象。

let name = '李思';
let age = 18;

/*
var person = {
    name:name,
    age:age,
    showname:function(){
        alert(this.name);
    },
    showage:function(){
        alert(this.age);
    }
}
*/

// 簡寫成下面的形式
var person = {
    name,
    age,
    showname(){
      alert(this.name);
    },
    showage(){
      alert(this.age);
    }
}

person.showname();
person.showage();

vue組件

組件(Component)是Vue.js最強大的功能之一。組件可以擴展 HTML 元素,封裝可重用的代碼。所有的 Vue 組件同時也都是 Vue 的實例,所以可接受相同的選項對象 (除了一些根級特有的選項) 並提供相同的生命周期鈎子。

注冊及使用組件

// 注冊一個組件:
Vue.component('my-component', {
  template: '<div>A custom component!</div>'
})

//使用組件
<div id="example">
  <my-component></my-component>
</div>
......

new Vue({
  el: '#example'
})  

data 必須是函數

組件就是vue的實例,所有vue實例中屬性和方法,組件中也可以用,但是data屬性必須是一個函數,因為組件會重復使用在多個地方,為了使用在多個地方的組件數據相對獨立,data屬性需要用一個函數來返回值。

// 定義組件
Vue.component('simple-counter', {
  template: '<button v-on:click="counter += 1">{{ counter }}</button>',
  data: function () {
        return {
        counter: 0
      }
  }
})

// 使用組件
<div id="example-2">
  <simple-counter></simple-counter>
  <simple-counter></simple-counter>
  <simple-counter></simple-counter>
</div>
......
new Vue({
  el: '#example-2'
})  

props傳遞數據

如果想給組件中傳遞參數,組件要顯式地用 props 選項聲明它預期的數據:

<!-- 樣式 -->
<style>
    .breadcrumb{width:90%;line-height:50px;
    border-bottom:1px solid #ddd;margin:0px auto;}
    .breadcrumb .hot{font-weight:bold;color:red;letter-spacing:2px;}
</style>

......
<div id="app">
    <bread-crumb pos="首頁>圖片列表"></bread-crumb>
</div>

<script>
    Vue.component('bread-crumb',{
        props:['pos'],
        template:'<div class="breadcrumb" @click="fnLight">當前位置:<span :class="{hot:isHot}">{{pos}}</span></div>',
        data:function(){
            return {
                isHot:false
            }
        },
        methods:{
            fnLight:function(){
                this.isHot = !this.isHot;
            }
        }
    })
    let vm = new Vue({
        el:'#app'
    })
</script>  

單文件組件

將一個組件相關的html結構,css樣式,以及交互的JavaScript代碼從html文件中剝離出來,合成一個文件,這種文件就是單文件組件,相當於一個組件具有了結構、表現和行為的完整功能,方便組件之間隨意組合以及組件的重用,這種文件的擴展名為“.vue”,比如:"menu.vue"。

單文件組件代碼結構

// 使用template標簽來定義html部分
<template>
<div class="breadcrumb" @click="fnLight">
  當前位置:<span :class="{hot:isHot}">{{pos}}</span>
</div>
</template>

// javascript要寫成模塊導出的形式:
<script>
export default{
  props:['pos'],
  name:'breadcrumb',
  data:function(){
      return {
          isHot:false
      }
  },
  methods:{
      fnLight:function(){
          this.isHot = !this.isHot;
      }
  }
}
</script>

// 樣式中如果有scope關鍵字,表示這些樣式是組件局部的,不會影響其他元素
<style scoped>
.breadcrumb{
    width:90%;
    line-height:50px;
    border-bottom:1px solid #ddd;
    margin:0px auto;
}
.breadcrumb .hot{
    font-weight:bold;
    color:red;
    letter-spacing:2px;
}
</style>  

Vue組件開發自動化工具

windows終端操作

1、打開終端
在window開始的搜索框,輸入cmd,回車;或者在開始上點右鍵,選擇運行,輸入cmd回車;或者在window窗口的地址欄上輸入cmd,回車。

2、常用終端命令

// 查看文件夾內容
dir +回車

// 進入某個文件夾
cd 文件夾名 +回車

// 進入上一級文件夾
cd .. +回車 

// 切換到e盤
e: +回車

// 清除屏幕
cls +回車  

Node.js

Node.js是一個新的后端(后台)語言,它的語法和JavaScript類似,所以可以說它是屬於前端的后端語言,后端語言和前端語言的區別:

  • 運行環境:后端語言一般運行在服務器端,前端語言運行在客戶端的瀏覽器上
  • 功能:后端語言可以操作文件,可以讀寫數據庫,前端語言不能操作文件,不能讀寫數據庫。

Node.js如果安裝成功,可以查看Node.js的版本,在終端輸入如下命令:

node -v 

npm

npm是node.js的包管理器,安裝了node.js同時會自動安裝這個包管理器,可以npm命令來安裝node.js的包。這個工具相當於python的pip管理器。

安裝vue的自動化工具

vue開發生態區提供了用node.js開發的自動化開發工具包,這個工具包可以幫我們編譯單文件組件。

// 全局安裝 vue-cli
npm install --global vue-cli 

生成Vue單頁面應用項目目錄

單頁應用(SPA)

單頁Web應用(single page web application,SPA),就是將系統所有的操作交互限定在一個web頁面中。單頁應用程序 (SPA) 是加載單個HTML頁面,系統的不同功能通過加載不同功能組件的形式來切換,不同功能組件全部封裝到了js文件中,這些文件在應用開始訪問時就一起加載完,所以整個系統在切換不同功能時,頁面的地址是不變的,系統切換可以做到局部刷新,也可以叫做無刷新,這么做的目的是為了給用戶提供更加流暢的用戶體驗。

生成項目目錄

使用vue自動化工具可以快速搭建單頁應用項目目錄。該工具為現代化的前端開發工作流提供了開箱即用的構建配置。只需幾分鍾即可創建並啟動一個帶熱重載、保存時靜態檢查以及可用於生產環境的構建配置的項目:

// 生成一個基於 webpack 模板的新項目
$ vue init webpack my-project

// 啟動開發服務器 ctrl+c 停止服務
cd my-project
npm run dev 

項目目錄結構說明

需要關注的是上面標注的三個目錄:

  • 文件夾1(src),主開發目錄,要開發的單文件組件全部在這個目錄下
  • 文件夾2(static),靜態資源目錄,所有的css,js文件放在這個文件夾
  • 文件夾3(dist),項目打包發布文件夾,最后要上線單文件項目文件都在這個文件夾中

還有node_modules目錄是node的包目錄,config是配置目錄,build是項目打包時依賴的目錄。

頁面結構說明

 

整個項目是一個主文件index.html,index.html中會引入src文件夾中的main.js,main.js中會導入頂級單文件組件App.vue,App.vue中會通過組件嵌套或者路由來引用components文件夾中的其他單文件組件。

組件嵌套

將單文件組件組合在一起有兩種方式,一種是嵌套方式,一種用路由的方式。嵌套的方式代碼如下:

下圖示中,假設組件A中要嵌入組件B

<template>

    // 在A組件中使用B組件
    <B_zujian></B_zujian>
</template>


<script>
// 先導入B組件,其中'@'表示src目錄,組件后的vue擴展名可以省略
import B_zujian from '@/components/B_zjian'

export default{
    name:'A_zujian',
    data:function(){
        return {
            iNum:0
        }
    },
    // 接着在components屬性選項中注冊
    components:{
        B_zujian
    }
}


</script> 

路由

可以通過路由的方式在一個組件中加載其他組件,要使用路由功能,需要在main.js中先導入路由的包,然后在組件對象中還需要包含它。

import router from './router'

new Vue({
    .....
    router
})

組件中通過路由標簽來加載其他的路由

<!-- 路由標簽 -->
<router-view></router-view>

<!-- 簡寫成下面一個標簽的形式: -->
<router-view/>

路由標簽里面加載哪個組件呢?在router文件中的index.js文件中設置

import Vue from 'vue'
import Router from 'vue-router'

// 導入對應組件 '@' 表示src文件夾
import MainList from '@/components/MainList'
import UserList from '@/components/UserList'
import UpDate from '@/components/UpDate'

// 使用路由模塊的固定寫法
Vue.use(Router)

// path為'/'表示路由默認加載的組件
// 這些路由默認設置的是App.vue中的路由標簽加載的組件
export default new Router({
  routes: [
    {
      path: '/',
      name: 'MainList',
      component: MainList
    },
    {
      path: '/user',
      name: 'UserList',
      component: UserList
    },
    {
      path: '/update',
      name: 'UpDate',
      component: UpDate
    }
  ]
})

通過鏈接可以切換路由標簽里面對應的組件,鏈接的地址是上面index.js文件中定義的path值,不過鏈接標簽是"router-link",鏈接地址用'to'來定義:

<router-link to="/">股票信息</router-link>
<router-link to="/user">個人中心</router-link>

鏈接地址中可以傳遞參數,格式如下:

// name對應的是路由中定義的一個path對應的name屬性
<router-link :to='{name:"UpDate",params:{code:item.code}}'>

有時候需要在組件的js中跳轉頁面,也就是改變路由,改變路由有下面這些方式:

// 當前頁面重新加載
this.$router.go('/user');

// 跳轉到另外一個路由
this.$router.push({path:'/user'});

// 獲取當前的路由地址
var sPath = this.$route.path;  

數據請求及跨域

數據請求

數據請求使用的是ajax,在vue中使用的axios.js,這個文件可以在index.html文件中引入,也可以作為模塊導入,在main.js中導入這個模塊,然后將它綁定在Vue類的原型上。

import axios from 'axios'
Vue.prototype.axios = axios

在組件的js代碼中使用axios:

this.axios({......}) 

跨域請求

vue的自動化工具提供了開發的服務器,我們在這個服務器環境下開發,改動代碼可以馬上更新顯示,錯誤了還有代碼提示,非常方便,但是,如果我們組件中需要數據,而且數據在另一個服務器環境下運行,我們就需要跨域請求數據,vue工具中可以使用代理來跨域請求,設置的方法是:在項目的config文件夾中,打開index.js,在proxyTable一項中設置:

// 'http://localhost:7890' 表示的是要跨域請求的地址
// 如果請求的地址是:'http://localhost:7890/index_data'
// 在請求時就可以寫成: '/apis/index_data'

'/apis': {
    target: 'http://localhost:7890', 
    changeOrigin: true,
    pathRewrite: {
        '^/apis': ''
    }              
} 

打包上線

項目開發完成后,需要把請求數據的代理地址改成和提供數據的服務器在同一個域的地址,因為最終會把前端代碼放在和數據在同一個域的服務器下面運行。

// 將下面的請求地址
'/apis/index_data'

// 改成
'/index_data'

改完請求地址后,就可以將代碼打包,生成最終可以上線的單文件結構:

// 打開終端,ctrl+c停掉開發服務器,執行下面的命令

npm run build 

自動化程序會將打包的文件自動生成到項目的dist文件夾中。

將這些文件拷貝到提供數據服務的服務器的靜態目錄文件夾中,完成最終的上線!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM