vuejs

簡介

Vue.js(讀音 /vjuː/, 相似於 view) 是一套構建用戶界面的 漸進式框架。與其餘重量級框架不一樣的是,Vue 採用自底向上增量開發的設計。Vue 的核心庫只關注視圖層,而且很是容易學習,很是容易與其它庫或已有項目整合。另外一方面,Vue 徹底有能力驅動採用單文件組件和 Vue 生態系統支持的庫開發的複雜單頁應用。javascript

Vue.js 的目標是經過儘量簡單的 API 實現響應的數據綁定和組合的視圖組件。css

Vue.js 自身不是一個全能框架——它只聚焦於視圖層。所以它很是容易學習,很是容易與其它庫或已有項目整合。另外一方面,在與相關工具和支持庫一塊兒使用時,Vue.js 也能完美地驅動複雜的單頁應用。html

vue是法語中視圖的意思,Vue.js是一個輕巧、高性能、可組件化的MVVM庫。前端

引用做者的話:vue

2013年底,我還在Google Creative Lab工做。當時在項目中使用了一段時間的Angular,在感嘆數據綁定帶來生產力提高的同時,我也感到Angular的API設計過於繁瑣,使得學習曲線頗爲陡峭。出於對Angular數據綁定原理的好奇,我開始 「造輪子」,本身實現了一個很是粗糙的、基於依賴收集的數據綁定庫。這就是Vue.js的前身。同時在實際開發中,我發現用戶界面徹底能夠用嵌套的組件樹來描述,而一個組件偏偏能夠對應MVVM中的ViewModel。因而我決定將個人數據綁定實驗改進成一個真正的開源項目,其核心思想即是 「數據驅動的組件系統」。

詳細請閱讀:http://www.csdn.net/article/1970-01-01/2825439java

vue的特色

(1) 簡潔 (2) 輕量 (3)快速 (4) 數據驅動 (5) 模塊友好 (6) 組件化node

爲何說vue是以數據驅動的呢?

可查看:https://segmentfault.com/q/1010000004351894/a-1020000004352845webpack

直接拋開手動操做DOM的思惟了。經過一些特殊的HTML語法,將DOM和數據綁定起來。一旦你建立了綁定,DOM將和數據保持同步,每當變動了數據,DOM也會相應地更新。web

什麼是MVVM(Model-View-ViewModel)?

http://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.htmlchrome

在Vue.js中ViewModel是和View以及Model進行交互以下:

ViewModel是Vue.js的核心,它是一個Vue實例。Vue實例是做用於某一個HTML元素上的,這個元素能夠是HTML的body元素,也能夠是指定了id的某個元素。

當建立了ViewModel後,雙向綁定是如何達成的呢?

首先,咱們將上圖中的DOM Listeners和Data Bindings看做兩個工具,它們是實現雙向綁定的關鍵。
從View側看,ViewModel中的DOM Listeners工具會幫咱們監測頁面上DOM元素的變化,若是有變化,則更改Model中的數據;
從Model側看,當咱們更新Model中的數據時,Data Bindings工具會幫咱們更新頁面中的DOM元素。

示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script type="text/javascript" src="vue.js"></script>

</head>
<body>
    <!-- view -->
    <div id="app">
      <p>{{ message }}</p>
    </div>

    <script type="text/javascript">
        // Model
        var expData = {
            message:"Hello Vue!"
        }
        // 建立一個 Vue 實例或 "ViewModel"
        // 它鏈接 View 與 Model
        var app = new Vue({
          el: '#app',
          data:expData
        })
    </script>
<!--注意:這代碼要最後引入,由於要先有id爲app的div,vue才能獲取相應的元素。不然會報錯: [Vue warn]: Cannot find element: #app-->
</body> 
</html>

使用Vue的過程就是定義MVVM各個組成部分的過程的過程。

  1. 定義View
  2. 定義Model
  3. 建立一個Vue實例或"ViewModel",它用於鏈接View和Model

在建立Vue實例時,須要傳入一個選項對象,選項對象能夠包含數據、掛載元素、方法、模生命週期鉤子等等。

在這個示例中,選項對象el屬性指向View,el: '#app'表示該Vue實例將掛載到<div id="app">...</div>這個元素;data屬性指向Model,data: expData表示咱們的Model是expData對象。
Vue.js有多種數據綁定的語法,最基礎的形式是文本插值,使用一對大括號語法,在運行時{{ message }}會被數據對象的message屬性替換,因此頁面上會輸出"Hello Vue!"。

雙向綁定:就是頁面輸入框內容的改變會綁定到js裏面,js裏面message的改變也會體如今頁面上。可以使用v-model實現

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script type="text/javascript" src="vue.js"></script>

</head>
<body>
    <div id="app">
      <p>{{ message }}</p>
      <input v-model = "message"></input>
    </div>

    <script type="text/javascript">
        var expData = {
            message:"Hello Vue!"
        }
        var app = new Vue({
          el: '#app',
          data:expData
        })
    </script>

</body>
</html>

將message綁定到文本框,當更改文本框的值時,<p>{{ message }}</p> 中的內容也會被更新;

反過來,若是改變message的值,文本框的值也會被更新,咱們能夠在Chrome控制檯進行嘗試。

Vue.js的經常使用指令

Vue.js的指令是以v-開頭的,它們做用於HTML元素,指令提供了一些特殊的特性,將指令綁定在元素上時,指令會爲綁定的目標元素添加一些特殊的行爲,咱們能夠將指令看做特殊的HTML特性(attribute)

Vue.js提供了一些經常使用的內置指令:

v-if指令
v-show指令
v-else指令
v-for指令
v-bind指令
v-on指令

由於vue.js具備較好的拓展性,能夠開發自定義的指令。

v-if指令

v-if是條件渲染指令,它根據表達式的真假來刪除和插入元素,它的基本語法以下:
v-if="expression"
expression是一個返回bool值的表達式,表達式能夠是一個bool屬性,也能夠是一個返回bool的運算式。例如:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div id="app">
            <h1>Hello, Vue.js!</h1>
            <h1 v-if="yes">Yes!</h1>
            <h1 v-if="no">No!</h1>
            <h1 v-if="age >= 25">Age: {{ age }}</h1>
            <h1 v-if="name.indexOf('jack') >= 0">Name: {{ name }}</h1>
        </div>
    </body>
    <script src="vue.js"></script>
    <script>
        
        var vm = new Vue({
            el: '#app',
            data: {
                yes: true,
                no: false,
                age: 28,
                name: 'keepfool'
            }
        })
    </script>
</html>

注意:v-if指令是根據條件表達式的值來執行元素的插入或者刪除行爲。

這一點能夠從渲染的HTML源代碼看出來,面上只渲染了3個<h1>元素,v-if值爲false的<h1>元素沒有渲染到HTML。

在chrome控制檯修改age的屬性:

小於25,頁面將元素刪除。

age是定義在選項對象的data屬性中的,爲何Vue實例能夠直接訪問它呢?

這是由於每一個Vue實例都會代理其選項對象裏的data屬性。

v-show指令

v-show也是條件渲染指令,和v-if指令不一樣的是,使用v-show指令的元素始終會被渲染到HTML,它只是簡單地爲元素設置CSS的style屬性。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div id="app">
            <h1>Hello, Vue.js!</h1>
            <h1 v-show="yes">Yes!</h1>
            <h1 v-show="no">No!</h1>
            <h1 v-show="age >= 25">Age: {{ age }}</h1>
            <h1 v-show="name.indexOf('jack') >= 0">Name: {{ name }}</h1>
        </div>
    </body>
    <script src="vue.js"></script>
    <script>
        
        var vm = new Vue({
            el: '#app',
            data: {
                yes: true,
                no: false,
                age: 28,
                name: 'keepfool'
            }
        })
    </script>
</html>

查看元素:

元素會被渲染到HTML,可是不符合條件的話就設置display:none.

注意 v-show 不支持 <template> 語法。

v-else指令

能夠用v-else指令爲v-if添加一個「else塊」。v-else元素必須當即跟在v-if元素的後面——不然它不能被識別。

注:限制: 前一兄弟元素必須有 v-if 或 v-else-if

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div id="app">
            <h1 v-if="age >= 25">Age: {{ age }}</h1>
            <h1 v-else>Name: {{ name }}</h1>
        </div>
    </body>
    <script src="vue.js"></script>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                age: 28,
                name: 'keepfool',
                sex: 'Male'
            }
        })
    </script>
</html>

這段代碼中v-if爲true,後面的v-else不會渲染到HTML;

v-for指令

v-for指令基於一個數組渲染一個列表,它和JavaScript的遍歷語法類似:

v-for="item in items"

items是一個數組,item是當前被遍歷的數組元素。item 是數組元素迭代的別名。

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div id="app">
            <ul>
                 <li v-for="item in items">
                    {{ item.message }}
                 </li>
            </ul>
        </div>
    </body>
    <script src="vue.js"></script>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                items: [
                      {message: 'Foo' },
                      {message: 'Bar' }
                    ]
            }
        })
    </script>
</html>

在 v-for 塊中,咱們擁有對父做用域屬性的徹底訪問權限。 v-for 還支持一個可選的第二個參數爲當前項的索引。

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div id="app">
            <ul>
                 <li v-for="(item,index) in items">
                    {{parentMessage}}-{{index}}-{{ item.message }}
                 </li>
            </ul>
        </div>
    </body>
    <script src="vue.js"></script>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                parentMessage:"parent",
                items: [
                      {message: 'Foo' },
                      {message: 'Bar' }
                    ]
            }
        })
    </script>
</html>

v-bind指令

v-bind指令能夠在其名稱後面帶一個參數,中間放一個冒號隔開,這個參數一般是HTML元素的特性(attribute),例如:v-bind:class

v-bind:argument="expression"
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            .box{
                border:1px dashed #f0f;
            }
            .textColor{
                color:#f00;
                background-color:#eef;
            }
            .textSize{
                font-size:30px;
                font-weight:bold;
            }
        </style>
    </head>
    <body>
        <div id="app">
            <ul class="box" v-bind:class="{'textColor':isColor, 'textSize':isSize}">
                <li>學習Vue</li>
                <li>學習Node</li>
                <li>學習React</li>
            </ul>
        </div>
    </body>
    <script src="vue.js"></script>
    <script>
        var vm= new Vue({
            el:"#app",
            data:{
                isColor:true,
                isSize:true
            }
        })
    </script>
</html>

v-on指令

v-on指令用於給監聽DOM事件,它的用語法和v-bind是相似的,例如監聽<a>元素的點擊事件:

<a v-on:click="doSomething">
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div id="app">
            <p><input type="text" v-model="message"></p>
            <p>
                <!--click事件直接綁定一個方法-->
                <button v-on:click="greet">Greet</button>
            </p>
            <p>
                <!--click事件使用內聯語句-->
                <button v-on:click="say('Hi')">Hi</button>
            </p>
        </div>
    </body>
    <script src="vue.js"></script>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                message: 'Hello, Vue.js!'
            },
            // 在 `methods` 對象中定義方法
            methods: {
                greet: function() {
                    // // 方法內 `this` 指向 vm
                    alert(this.message)
                },
                say: function(msg) {
                    alert(msg)
                }
            }
        })
    </script>
</html>

修飾符:

.stop - 調用 event.stopPropagation()。
.prevent - 調用 event.preventDefault()。
.capture - 添加事件偵聽器時使用 capture 模式。
.self - 只當事件是從偵聽器綁定的元素自己觸發時才觸發回調。
.{keyCode | keyAlias} - 只當事件是從偵聽器綁定的元素自己觸發時才觸發回調。
.native - 監聽組件根元素的原生事件。

v-bind和v-on的縮寫

Vue.js爲最經常使用的兩個指令v-bindv-on提供了縮寫方式。v-bind指令能夠縮寫爲一個冒號,v-on指令能夠縮寫爲@符號。

<!--完整語法-->
<a href="javascripit:void(0)" v-bind:class="activeNumber === n + 1 ? 'active' : ''">{{ n + 1 }}</a>
<!--縮寫語法-->
<a href="javascripit:void(0)" :class="activeNumber=== n + 1 ? 'active' : ''">{{ n + 1 }}</a>

<!--完整語法-->
<button v-on:click="greet">Greet</button>
<!--縮寫語法-->
<button @click="greet">Greet</button>

 

vue的一個組件:

就是把HTML、JavaScript、CSS文件添加到後綴名爲.vue的文件裏面。

app.vue的文件:<template>裏寫html;<style>裏寫css;<script>裏寫js文件

開發環境的搭建:

npm命令徹底無反應,不是加載的那種狀態,而是下標不停地在哪裏閃...
以後找解決方案,說要刪除npmrc文件。
強調:不是nodejs安裝目錄npm模塊下的那個npmrc文件,而是在C:\Users\{帳戶}\下的.npmrc文件....

把npm設置爲淘寶鏡像:

$ npm install -g cnpm --registry=https://registry.npm.taobao.org

全局安裝 vue-cli:

Vue-cli是vue官方提供的一個命令行工具(vue-cli),可用於快速搭建大型單頁應用。該工具提供開箱即用的構建工具配置,帶來現代化的前端開發流程。只需一分鐘便可啓動帶熱重載、保存時靜態檢查以及可用於生產環境的構建配置的項目。

$ cnpm install -g vue-cli

建立一個基於 webpack 模板的新項目:

$ vue init webpack my-project

而後進行一系列的配置就能夠搭建一個項目了:

搭建好以後,要想用瀏覽器看到項目還得安轉依賴。開發時的依賴都存在package.json裏面

$ cd my-project
$ cnpm install

比剛剛多了一個node_modules:

讓項目跑起來:

$ cnpm run dev

而後打開:http://localhost:8080/  便可:

 

接下來就能夠在src進行具體的項目開發。

整理有一個熱更新,就是修改以後頁面會自動更新

 

從.vue到頁面

學習vue主要就是如下三個部分:

 

vue.js組件的重要選項 

Vue.js組件的重要選項-- data

 

Vue的數據都放在data裏面,Vue 實例的數據對象。Vue 將會遞歸將 data 的屬性轉換爲 getter/setter,從而讓 data 的屬性可以響應數據變化。

Vue.js組件的重要選項-- methods

methods 將被混入到 Vue 實例中。能夠直接經過  實例訪問這些方法,或者在指令表達式中使用。方法中的 this自動綁定爲 Vue 實例。

 

Vue.js組件的重要選項--watch

一個對象,鍵是須要觀察的表達式,值是對應回調函數。值也能夠是方法名,或者包含選項的對象。

 

Vue對象有這麼多東西,那它跟頁面和頁面展現究竟有什麼聯繫?

模板指令 - htmlvue對象的粘合劑(是寫在html裏面的):

數據渲染:v-text 、v-html 、{{}}

 

控制模板隱藏:v-if 、v-show

 

渲染循環列表:v-for

 

事件綁定:v-on

 

屬性綁定:v-bind

 

上面的變量哪些是字符串哪些是布爾值呢?

 小結

  new一個vue對象的時候能夠設置它的屬性,其中最重要的包括三個,分別是data、methods、watch;

  其中data表明對象的數據、methods表明vue對象的方法、watch設置了對象監聽的方法;

  vue對象裏的設置經過html指令進行關聯;

  重要的指令包括:v-text渲染數據;v-if控制顯示;v-on綁定事件;v-for循環渲染等。

 

vuejs-學習基礎框架代碼

Index.html:項目的入口

  

app.vue

<hello>是一個註冊了的組件。

這裏面用了不少ES6的語法。

 

 

http://www.jianshu.com/p/78c9e5342990

相關文章
相關標籤/搜索