Vue.js基礎(chǔ)手冊

Vue.js是什么

Vue.js(讀音 /vju?/, 類似于 view) 是一套構(gòu)建用戶界面的 漸進式框架。與其他重量級框架不同的是悴势,Vue 采用自底向上增量開發(fā)的設(shè)計辛萍。

Vue 的核心庫只關(guān)注視圖層,并且非常容易學(xué)習(xí)民晒,非常容易與其它庫或已有項目整合芙贫。另一方面搂鲫,Vue 完全有能力驅(qū)動采用單文件組件Vue生態(tài)系統(tǒng)支持的庫開發(fā)的復(fù)雜單頁應(yīng)用。

Vue.js 的目標是通過盡可能簡單的 API 實現(xiàn)響應(yīng)的數(shù)據(jù)綁定組合的視圖組件屹培。

Vue.js安裝

1、獨立版本

我們可以在 Vue.js 的官網(wǎng)上直接下載 vue.min.js 并用 <script> 標簽引入怔檩。

下載地址: https://vuejs.org/js/vue.min.js

2褪秀、使用CDN方法

以下推薦國外比較穩(wěn)定的兩個 CDN,國內(nèi)還沒發(fā)現(xiàn)哪一家比較好薛训,目前還是建議下載到本地媒吗。

(1)在桌面建立一個 Vue.html文件, 并添加HTML頁面的架構(gòu)乙埃,然后引入 vue.js的CDN地址
<script src="https://unpkg.com/vue/dist/vue.js"></script>
(2)在Vue.html文件中插入一個id為firstVue的div標簽
<div id="firstVue"></div>
(3)在Vue.html文件中插入如下js代碼
<script>
    new Vue({
        el: "#firstVue",
    })
</script>

完整代碼如下:

<!DOCTYPE html>
<html>
    <head>
        <title>Vue Demo</title>
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="firstVue"></div>
    <body>
    <script>
        new Vue({
            el: "#firstVue",
        })
    </script>
</html>

new Vue({})就是Vue創(chuàng)建的一個對象闸英,可以理解成把<div id="firstVue></div>和這個標簽里面包含的所有DOM都實例化成了一個JS對象 锯岖。

el是Vue的保留字,用來指定實例化的DOM的id號, #firstVue這句話就是id選擇器甫何,告訴Vue要實例化id="firstVue"的這個標簽出吹。

(4)在創(chuàng)建 vue實例的代碼中加入下面數(shù)據(jù)聲明:
data: {
    my_data: "hello world"
}
(5)在標簽中通過{{}}來引用變量值:
<div id="firstVue">{{my_data}}</div>

雙大括號的語法叫做mustache 語法,大括號里面的是作為變量形式出現(xiàn)的辙喂。

完整代碼如下:

<!DOCTYPE html>
<html>
    <head>
        <title>Vue Demo</title>
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="firstVue">{{my_data}}</div>
    <body>
    <script>
        new Vue({
            el: "#firstVue",
            data: {
                my_data: "hello world"
            }
        })
    </script>
</html>

data參數(shù)用來綁定VUE實例的數(shù)據(jù)變量捶牢,每個不同變量之間用逗號分隔,上面我們綁定了自定義變量my_data巍耗,并賦初值"hello world"秋麸。

完成數(shù)據(jù)綁定工作,<div>標簽里的 {{myData}} 數(shù)據(jù)會隨著myVue實例里的my_Data數(shù)據(jù)的變動而變動炬太,瀏覽器查看當前頁面,會出現(xiàn)"hello world"字符串灸蟆,說明數(shù)據(jù)綁定成功。

VUE這個框架的數(shù)據(jù)流向是單向的亲族,數(shù)據(jù)綁定后的數(shù)據(jù)流向是從vue實例——>DOM文檔炒考。

3、NPM方法

(1)國內(nèi)使用npm速度較慢孽水,使用淘寶定制的cnpm(gzip壓縮支持)命令行工具代替默認的npm:
$ npm install -g cnpm --registry=https://registry.npm.taobao.org
$ npm config set registry https://registry.npm.taobao.org
(2)npm 版本需要大于 3.0票腰,如果低于此版本需要升級它:
# 查看版本
$ npm -v
5.6.0

#升級 npm
$ cnpm install npm -g
(3)在用 Vue.js 構(gòu)建大型應(yīng)用時推薦使用 NPM 安裝:
# 最新穩(wěn)定版
$ cnpm install vue
(4)創(chuàng)建項目并安裝運行

Vue.js 提供一個官方命令行工具,可用于快速搭建大型單頁應(yīng)用女气。

# 全局安裝 vue-cli
$ cnpm install --global vue-cli

# 創(chuàng)建一個基于 webpack 模板的新項目
$ vue init webpack my-project

# 這里需要進行一些配置杏慰,默認回車即可
? Project name  my-project
? Project description  A Vue.js project
? Author  thd
? Vue build (Use arrow keys)
? Vue build   standalone
? Install vue-router?   Yes
? Use ESLint to lint your code?   Yes
? Pick an ESLint preset   Standard
? Set up unit tests   Yes
? Pick a test runner   jest
? Setup e2e tests with Nightwatch?   Yes

   vue-cli · Generated "my-project".
   
To get started:
  cd my-project
  npm run dev
 
#進入項目,安裝并運行
  $ cd my-project
  $ cnpm run dev
  

成功執(zhí)行以上命令后訪問 http://localhost:8080/炼鞠,輸出結(jié)果如下所示:

第一個Vue項目.png

Vue.js 目錄結(jié)構(gòu)

1缘滥、項目目錄

項目目錄結(jié)構(gòu).png
  • build:項目構(gòu)建(webpack)相關(guān)代碼 ,用來保存文本pack的初始化配置谒主。
  • config:配置目錄朝扼,保存項目初始化配置,包括端口號等霎肯。我們初學(xué)可以使用默認的 擎颖。
  • node_modules:npm 加載的項目依賴模塊
  • src: 這里是我們要開發(fā)的目錄,基本上要做的事情都在這個目錄里观游。
    • assets:放置一些圖片搂捧,如logo等。
    • components:放置組件文件懂缕,可以不用允跑。
    • router:前端路由配置
    • App.vue:項目入口文件,可以直接將組件寫這里,而不使用 components 目錄聋丝。
    • main.js:項目的核心文件索烹。
  • static:靜態(tài)資源目錄,如圖片弱睦、字體等百姓。
  • test: 初始測試目錄,可刪除
  • index.html:首頁入口文件每篷,可以添加一些 meta 之類的信息瓣戚。
  • package.json:項目配置文件
  • README.md:項目的說明文檔,Markdown格式焦读。

2子库、相關(guān)文件

(1)index.html

項目的入口頁面,可以像普通的html文件一樣引入文件和書寫基本信息矗晃,添加meta標簽等仑嗅。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>my-project</title>
  </head>
  <body>
    <div id="app"></div>
  </body>
</html>

(2)main.js

項目的入口文件,可以引入一些插件或靜態(tài)資源张症,當然引入之前要先安裝了該插件仓技,在package.json文件中有記錄。

import Vue from 'vue'
import App from './App'
import router from './router'

//設(shè)置為 false 表示阻止啟動生產(chǎn)消息俗他,常用作指令脖捻。
Vue.config.productionTip = false

new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})
/*
el: '#app' ---表示將所有的組件都放在id為app的元素中
router---配置路由,路由允許我們通過不同的 URL 訪問不同的內(nèi)容
components: { App }---表示引入的文件兆衅,此處就是App.vue這個文件地沮,也就是組件
template: '<App/>'---模板將會替換掛載的元素。掛載元素的內(nèi)容都將被忽略羡亩,template的值表示要使用的組件名稱摩疑,并將這個組件顯示在html頁面中,在組件中通過export default中的name來聲明組件名稱
*/
(3)App.vue

這是一個標準的vue組件畏铆,包含三個部分雷袋,一個是模板,一個是script辞居,一個是樣式楷怒。

<!-- 模板 -->
<template>
  <div id="app">
    <img src="./assets/logo.png">
    <router-view/>
  </div>
</template>

<!-- script -->
<script>
    export default {
      name: 'App'
    }
</script>

<!-- style -->
<style>
    #app {
      font-family: 'Avenir', Helvetica, Arial, sans-serif;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      text-align: center;
      color: #2c3e50;
      margin-top: 60px;
    }
</style>

(4)修改第一個項目中顯示的內(nèi)容
  • 在components目錄下定義一個Hello.vue組件文件,代碼如下:
<template>
    <div>
        <h1>{{ msg }}</h1>
    </div>
</template>
<script>
    export default {
      name: 'hello',
      data () {
        return {
          msg: '歡迎來到Vue'
        }
      }
    }
</script>
  • 打開 APP.vue 文件瓦灶,在模板template中添加一個Vue組件鸠删,并在script中將該組件導(dǎo)入,如下:
<template>
  <div id="app">
    <img src="./assets/logo.png">
    <!--添加的Vue組件-->
    <hello></hello>
  </div>
</template>

<script>
// 導(dǎo)入組件
import Hello from './components/Hello'
export default {
  name: 'App',
  components: {
    Hello
  }
}
</script>

<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

啟動項目倚搬,重新打開 http://localhost:8080/ 冶共,顯示效果如下:

第一個Vue項目1.png

Vue.js 構(gòu)造器

每個 Vue 應(yīng)用都需要通過實例化 Vue 來實現(xiàn)(創(chuàng)建Vue對象 new Vue({ }))乾蛤,而實例化時就要使用構(gòu)造器每界。構(gòu)造器格式如下:

var vm = new Vue({
  // 選項
})

構(gòu)造器中可以有以下選項:

  • el:用來表示DOM元素的id
  • data:用于定義屬性
  • methods:用于定義函數(shù)捅僵,可以通過return來返回函數(shù)值

在DOM元素中可以使用 {{ }} 來輸出對象屬性和函數(shù)返回值

示例:

<!DOCTYPE html>
<html>
    <head>
        <title>Vue Demo</title>
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
    </head>
    
    <body>
        <div id="myDiv">
            <h2>site: {{site}}</h2>
            <h2>url: {{url}}</h2>
            <h2>{{details()}}</h2>
        </div>
    <body>
    
    <script>
        new Vue({
            el: "#myDiv",
            data: {
                site: "百度一下,你就知道",
                url: "http://www.baidu.com",
                desc: "全球最大的中文搜索引擎眨层、致力于讓網(wǎng)民更便捷地獲取信息庙楚,找到所求。百度超過千億的中文網(wǎng)頁數(shù)據(jù)庫趴樱,可以瞬間找到相關(guān)的搜索結(jié)果馒闷。"
            },
            methods: {
                details: function() {
                    return this.site + "--" + this.desc;
                }
            }
        })
    </script>
</html>

Vue.js 模板語法

Vue.js 使用了基于 HTML 的模版語法,允許開發(fā)者聲明式地將 DOM 綁定至底層 Vue 實例的數(shù)據(jù)叁征。

Vue.js 的核心是一個允許你采用簡潔的模板語法來聲明式的將數(shù)據(jù)渲染進 DOM 的系統(tǒng)纳账。

結(jié)合響應(yīng)系統(tǒng),在應(yīng)用狀態(tài)改變時捺疼, Vue 能夠智能地計算出重新渲染組件的最小代價并應(yīng)用到 DOM 操作上疏虫。

1、插值

(1)文本

文本通常是作為數(shù)據(jù)綁定的值啤呼,數(shù)據(jù)綁定采用{{ }}

  • 文本插值
<div id="app">
  <p>{{ message }}</p>
</div>

<script>
    new Vue({
        el: '#app',
        data: {
            message: '數(shù)據(jù)'
        }
    })
</script>
  • v-html指令:讀取HTML標簽
<div id="app">
    <div v-html="message"></div>
</div>    
<script>
    new Vue({
      el: '#app',
      data: {
         message: '<h1>我的青春我做主</h1>'
      }
    }) 
</script>
(2)屬性

HTML 屬性中的值應(yīng)使用 v-bind 指令卧秘,該指令用于雙向數(shù)據(jù)綁定

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Vue 屬性</title>
        <script src="https://cdn.bootcss.com/vue/2.2.2/vue.min.js"></script>
    </head>
    <body>
        <div id="app">
            修改顏色:<input type="checkbox" v-model="change"><br><br>
            <div v-bind:class="{'newClass': change}">v-bind:class</div>
        </div>

    </body>
    <script>
        new Vue({
            el: '#app',
            data:{
                change: false    //false表示沒有勾選官扣,true表示勾選上
            }
        });
    </script>
    <style>
        .newClass{
            background: #444;
            color: #eee;
        }
    </style>
</html>
(3)表達式

Vue.js 都提供了完全的 JavaScript 表達式支持翅敌。

<div id="app">
    {{5+5}}<br>
    {{ ok ? 'YES' : 'NO' }}<br>
    {{ message.split('').reverse().join('') }}
</div>

<script>
    new Vue({
      el: '#app',
      data: {
        ok: true,
        message: 'HELLO',
      }
    })
</script>

2、指令

指令是帶有 v- 前綴的特殊屬性惕蹄。 指令用于在表達式的值改變時蚯涮,將某些行為應(yīng)用到 DOM 上 。

(1)v-if

條件渲染指令焊唬,根據(jù)其后表達式的bool值進行判斷是否渲染該元素恋昼。v-if指令只渲染其后表達式值為true的元素 。

<div id="app">
    <p v-if='seen'>看到我了</p>
</div>

<script type="text/javascript">
    new Vue({
        el: '#app', 
        data: {
            seen: true
        }
    })
</script>
(2)v-show

v-show指令是根據(jù)表達式的值來顯示或者隱藏HTML元素赶促。當v-show賦值為false時液肌,元素被隱藏。

<div id="app">
    <p v-show='seen'>看到我了</p>
</div>

<script type="text/javascript">
    new Vue({
        el: '#app', 
        data: {
            seen: true
        }
    })
</script>

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

一般來說嗦哆,v-if有更高的切換消耗,而v-show有更高的初始渲染消耗婿滓。因此老速,如果需要頻繁的切換,則使用v-show較好凸主;如果在運行時條件不大可能改變橘券,則使用v-if較好。

(3)v-else

v-else就是JavaScript中的else的意思,它必須跟著v-if或者v-show使用旁舰。

<div id="app">
    <P v-if="ok">我是對的</P>
    <p v-else="ok">我是錯的</p>
</div>
<script type="text/javascript">
    var exampleVM2 = new Vue({
        el: '#app',
        data: {
            ok: false
        }
    })
</script>
(4)v-else-if

v-else-if 在 2.1.0 新增锋华,顧名思義,用作 v-if 的 else-if 塊箭窜,可以鏈式的多次使用

<div id="app">
    <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>
</div>

<script>
    new Vue({
        el: '#app',
        data: {
            type: 'C'
        }
    })
</script>
(5)v-bind

v-bind指令用于響應(yīng)更新HTML特性毯焕,將一個或者多個attribute,或者一個組件prop動態(tài)綁定到表達式

<div id="app">
    <a v-bind:href="url">百度一下</a>
</div>

<script type="text/javascript">
    new Vue({
        el: '#app', 
        data: {
            url: 'https://www.baidu.com'
        }
    })  
</script>
  • v-bind縮寫
<!-- 完整語法 -->
<a v-bind:href="url"></a>
<!-- 縮寫 -->
<a :href="url"></a>
  • 給元素綁定href時可以也綁一個target磺樱,新窗口打開頁面纳猫。
<script>
    new Vue({
      el: '#app',
      data: {
        url: 'http://www.runoob.com',
        target:'_blank'
      }
    })
</script>
  • 在綁定class或者style時,支持其他類型的值竹捉,如數(shù)組或?qū)ο蟆?/li>
<div id="app">
    <div v-bind:class="[classA,{classB:isB,classC:isC}]">hahaha</div>
</div>

<script type="text/javascript">
    new Vue({
        el: '#app',
        data: {
            classA: 'A',
            isB: false,
            isC: true
        }
    })
</script>

<style type="text/css">
    .A {
        color: red;
    }
    .classC {
        font-size: 50px;
    }
</style>
(6)v-model

v-model指令用來在input芜辕、select、text块差、checkbox物遇、radio等表單控件元素上創(chuàng)建雙向數(shù)據(jù)綁定的。根據(jù)控件類型v-model自動選取正確的方法更新元素 憾儒。

<div id="app">
    <input type="text" v-model='msg' />
    <p>{{msg}}</p>
</div>

<script type="text/javascript">
    new Vue({
    el: '#app',
        data: {
            msg: 'hello'
        }
    })
</script>
(7)v-on

v-on指令用于綁定事件監(jiān)聽器询兴。事件類型由參數(shù)指定。

<div id="app">
    <button v-on:click='reverse'>點擊按鈕</button><br />
    <p>{{msg}}</p>
</div>

    
<script type="text/javascript">
    new Vue({
        el: '#app', 
        data: {
            msg: 'hello'
        },
        methods: {
            reverse: function() {
                this.msg = this.msg.split('').reverse().join('')
            }
        }       
    })  
</script>
  • v-on縮寫
<!-- 完整語法 -->
<a v-on:click="doSomething"></a>
<!-- 縮寫 -->
<a @click="doSomething"></a>
(8)v-for

v-for指令用于循環(huán)遍歷顯示一個數(shù)組或者對象 起趾。用法形如 v-for="item in items", items為數(shù)組或?qū)ο?/strong>诗舰,item為數(shù)組中的每一項元素

  • v-for遍歷整數(shù)
<div id="app">
  <ul>
    <li v-for="n in 10">
        {{ n }}
    </li>
  </ul>
</div>

<script>
    new Vue({
      el: '#app'
    })
</script>       
  • v-for遍歷數(shù)組
<div id="app">
    <ol>
        <li v-for='site in sites'>
            {{site.name}}
        </li>
    </ol>
</div>

<script>
    new Vue({
        el: '#app',
        data: {
            sites: [
                {name: 'baidu'},
                {name: 'sina'},
                {name: 'qq'}
            ]
        }
    })
</script>

/*注意:數(shù)組也可以定義在v-for的屬性值中*/
<ul>
    <li v-for='n in [1,3,5,7]'>
        {{ n }}
    </li>
</ul>
  • v-for遍歷數(shù)組帶索引
<div>
    <ul>
        <li v-for='(site, index) in sites'>
            {{index}} : {{site.name}}
        </li>
    </ul>
</div>
<script>
    new Vue({
        el: '#app',
        data: {
            sites: [
                {name: 'baidu'},
                {name: 'sina'},
                {name: 'qq'}
            ]
        }
    })
</script>
  • v-for遍歷對象
<div id='#app'>
    <ul>
        <li v-for='value in website'>
            {{value}}
        </li>
    </ul>
</div>

<script>
    new Vue({
        el: '#app',
        data: {
            website: {
                name: '百度一下',
                url: 'http://www.baidu.com',
                desc: '全球最大的中文搜索引擎训裆、致力于讓網(wǎng)民更便捷地獲取信息眶根,找到所求。百度超過千億的                      中文網(wǎng)頁數(shù)據(jù)庫边琉,可以瞬間找到相關(guān)的搜索結(jié)果属百。'
            }
        }
    })
</script>
  • v-for遍歷對象key-value
<div>
    <ul>
        <li v-for='(value, key) in website'>
            {{key}} : {{value}}
        </li>
    </ul>
</div>
<script>
    new Vue({
        el: '#app',
        data: {
            website: {
                name: '百度一下',
                url: 'http://www.baidu.com',
                desc: '全球最大的中文搜索引擎、致力于讓網(wǎng)民更便捷地獲取信息变姨,找到所求族扰。百度超過千億的                      中文網(wǎng)頁數(shù)據(jù)庫,可以瞬間找到相關(guān)的搜索結(jié)果定欧。'
            }
        }
    })
</script>
  • v-for遍歷對象key-value 帶索引
<div>
    <ul>
        <li v-for='(value, key, index) in website'>
            {{index}} : {{key}} : {{value}} 
        </li>
    </ul>
</div>
<script>
    new Vue({
        el: '#app',
        data: {
            website: {
                name: '百度一下',
                url: 'http://www.baidu.com',
                desc: '全球最大的中文搜索引擎渔呵、致力于讓網(wǎng)民更便捷地獲取信息,找到所求砍鸠。百度超過千億的                      中文網(wǎng)頁數(shù)據(jù)庫扩氢,可以瞬間找到相關(guān)的搜索結(jié)果。'
            }
        }
    })
</script>

Vue.js構(gòu)造器(2)

構(gòu)造器的格式如下:

<script>
    var vm = new Vue({
        el: '#id',
        data: {
            //數(shù)據(jù)
        },
        methods: {
            //函數(shù)
        },
        computed: {
            //計算屬性
        },
        watch: {
            //監(jiān)聽屬性
        }
    })
</script>

1爷辱、計算屬性

計算屬性關(guān)鍵詞: computed录豺。計算屬性在處理一些復(fù)雜邏輯時是很有用的朦肘。

(1) computed getter

<div id="app">
  <p>原始字符串: {{ msg }}</p>
  <p>計算后反轉(zhuǎn)字符串: {{ reversedMsg }}</p>
</div>
<script>
    new Vue({
        el: '#app',
        data: {
            msg: 'Hello!'
        },
        computed: {
            reversedMsg: function () {
                return this.msg.split('').reverse().join('')
            }
        }
    })
</script>

我們可以使用 methods 來替代 computed,效果上兩個都是一樣的双饥,但是 computed 是基于它的依賴緩存厚骗,只有相關(guān)依賴發(fā)生改變時才會重新取值。而使用 methods 兢哭,在重新渲染的時候,函數(shù)總會重新調(diào)用執(zhí)行夫嗓。

可以說使用 computed 性能會更好迟螺,但是如果你不希望緩存,你可以使用 methods 屬性舍咖。

(2)computed setter

<script>
    var vm = new Vue({
        el: '#app',
        data: {
            name: '百度',
            url: 'http://www.baidu.com'
        },
        computed: {
            site: {
                // getter
                get: function () {
                    return this.name + ' ' + this.url
                },
                // setter
                set: function (newValue) {
                    var names = newValue.split(' ')
                    this.name = names[0]
                    this.url = names[names.length - 1]
                }
            }
        }   
    })
    // 調(diào)用setter矩父, vm.name 和 vm.url 也會被對應(yīng)更新
    vm.site = '新浪新聞 http://www.sina.com';
    document.write('name: ' + vm.name);
    document.write('<br>');
    document.write('url: ' + vm.url);
</script>

2、監(jiān)聽屬性

監(jiān)聽屬性關(guān)鍵字:watch排霉,可以通過 watch 來響應(yīng)數(shù)據(jù)的變化

<div id="computed_props">
    分 : <input type="text" v-model="minutes"> 
    秒 : <input type="text" v-model="seconds">
</div>

<script type="text/javascript">
    var vm = new Vue({
        el: '#computed_props',
        data: {
            minutes: 0,
            seconds: 0
        },
        methods: {},
        computed: {},
        watch: {
            minutes: function(val) {
                this.minutes = val;
                this.seconds = val * 60;
            },
            seconds: function(val) {
                this.minutes = val / 60;
                this.seconds = val;
            }
        }
    });
</script>

Vue.js 樣式綁定

class 與 style 是 HTML 元素的屬性窍株,用于設(shè)置元素的樣式,我們可以用 v-bind 來設(shè)置樣式屬性攻柠。

Vue.js v-bind 在處理 class 和 style 時球订, 專門增強了它。表達式的結(jié)果類型除了字符串之外瑰钮,還可以是對象或數(shù)組冒滩。

1、綁定內(nèi)聯(lián)樣式style

  • 可以通過 v-bind:style 直接設(shè)置樣式
<div id="app">
    <div v-bind:style='{ background: mycolor, fontSize: mysize + "px"}'>我是一個div</div>
</div>

<script type="text/javascript">
    new Vue({
        el: '#app',
        data: {
            mycolor: 'pink',
            mysize: 30              
        }
    })
</script>
  • 也可以直接綁定到一個樣式對象浪谴,讓模板更清晰
<div id="app">
    <div v-bind:style='mystyle'>我是一個div</div>
</div>

<script type="text/javascript">
    new Vue({
        el: '#app',
        data: {
            mystyle: {
                background: 'pink',
                fontSize: '30px'    
            }
        }
    })
</script>
  • 可以使用數(shù)組將多個樣式對象應(yīng)用到一個元素上
<div id="app">
    <div v-bind:style='[back, font]'>我是一個div</div>
</div>

<script type="text/javascript">
    new Vue({
        el: '#app',
        data: {
            back: {
                background: 'pink',
                color: 'blue'   
            },
            font: {
                fontSize: '30px',
                fontWeight: 'bold'  
            }
        }
    })
</script>

2开睡、綁定屬性class

  • 可以通過v-bind:class設(shè)置樣式
<div id="app">
    <div v-bind:class="{classA: isA }"></div>
</div>
<script>
    new Vue({
      el: '#app',
      data: {
        isA: true
      }
    })
</script>
<style>
    .classA {
        width: 100px;
        height: 100px;
        background: green;
    }
</style>
  • 可以傳入多個屬性來改變樣式
<div class="static"
     v-bind:class="{ classA: isA, classB: isB }">
</div>
<script>
    new Vue({
      el: '#app',
      data: {
        isA: true,
        isB: true
      }
    })
</script>
<style>
    .classA {
        width: 100px;
        height: 100px;
        background: green;
    }
    .classB {
        background: red;
    }
</style>
  • 可以直接綁定數(shù)據(jù)里的一個對象
<div class="static"
     v-bind:class="object">
</div>
<script>
    new Vue({
      el: '#app',
      data: {
          object: {
              classA: true,
              classB: true
          }
      }
    })
</script>
<style>
    .classA {
        width: 100px;
        height: 100px;
        background: green;
    }
    .classB {
        background: red;
    }
</style>
  • 可以使用數(shù)組綁定多個樣式
<div id="app">
    <div v-bind:class="[classA, classB]"></div>
</div>
<script>
new Vue({
  el: '#app',
  data: {
    classA: 'A',
    classB: 'B'
  }
})
</script>
<style>
.A {
    width: 100px;
    height: 100px;
    background: green;
}
.B {
    background: red;
}
  • 可以使用三元表達式來切換列表中的 class
<div id="app">
    <div v-bind:class="[isA ? aClass : bClass]"></div>
</div>
<script>
    new Vue({
        el: '#app',
        data: {
            isA: true,
            aClass: 'A',
            bClass: 'B'
        }
    })
</script>
<style>
.A {
    width: 100px;
    height: 100px;
    background: red;
}
.B {
    width: 100px;
    height: 100px;
    background: green;
}
</style>

Vue.js 表單

可以使用 v-model 指令在表單控件元素上創(chuàng)建雙向數(shù)據(jù)綁定。 v-model 會根據(jù)控件類型自動選取正確的方法來更新元素苟耻。

v-model.png
  • v-model會忽略所有表單元素的 value篇恒、checked、selected 特性的初始值而總是將 Vue 實例(new Vue({}))的數(shù)據(jù)(data)作為數(shù)據(jù)來源凶杖。你應(yīng)該通過 JavaScript 在組件的 data選項中聲明初始值胁艰。

  • 對于需要使用輸入法 (如中文、日文智蝠、韓文等) 的語言蝗茁,你會發(fā)現(xiàn) v-model不會在輸入法組合文字過程中得到更新。如果你也想處理這個過程寻咒,請使用 input 事件哮翘。

1、input

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

2毛秘、textarea

在文本區(qū)域插值 (<textarea></textarea>) 并不會生效饭寺,應(yīng)用 v-model 來代替阻课。

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

3、checkbox

  • 單個復(fù)選框艰匙,綁定到布爾值:
<input type="checkbox" id="checkbox" v-model="checked">
<label for="checkbox">{{ checked }}</label>
  • 多個復(fù)選框限煞,綁定到同一個數(shù)組:
<div id='app'>
  <input type="checkbox" id="zhang3" value="張三" v-model="checkedNames">
  <label for="zhang3">張三</label>
  <input type="checkbox" id="li4" value="李四" v-model="checkedNames">
  <label for="li4">李四</label>
  <input type="checkbox" id="wang5" value="王五" v-model="checkedNames">
  <label for="wang5">王五</label>
  <br>
  <span>Checked names: {{ checkedNames }}</span>
</div>

<script>
    new Vue({
      el: '#app',
      data: {
        checkedNames: []
      }
    })
</script>

4、radio

<div id="app">
    <label> <input type='radio' name="single" value="H5" v-model='choice' /> H5 </label>
    <label> <input type='radio' name="single" value="嵌入式" v-model='choice' /> 嵌入式 </label>
    <label> <input type='radio' name="single" value="java" v-model='choice' /> java </label><br />
    <span>{{choice}}</span>
</div>
<script>
    new Vue({
        el: '#app',
        data: {
            choice: []
        }
    })
</script>

5员凝、select

  • 單選時
<div id="app">
  <select v-model="selected">
    <option disabled value="">請選擇</option>
    <option>A</option>
    <option>B</option>
    <option>C</option>
  </select>
  <span>Selected: {{ selected }}</span>
</div>
<script>
    new Vue({
      el: '#app',
      data: {
        selected: ''
      }
    })
</script>
  • 多選時(綁定到一個數(shù)組)
<div id="app">
  <select v-model="selected" multiple style="width: 50px;">
    <option>A</option>
    <option>B</option>
    <option>C</option>
  </select>
  <br>
  <span>Selected: {{ selected }}</span>
</div>
<script>
    new Vue({
      el: '#app',
      data: {
        selected: []
      }
    })
</script>
  • 用v-for渲染的動態(tài)選項
<div id='app'>
    <select v-model="selected">
        <option v-for="option in options" v-bind:value="option.value">
            {{ option.text }}
        </option>
    </select>
    <span>Selected: {{ selected }}</span>
</div>

<script>
     new Vue({
      el: '#app',
      data: {
        selected: 'A',
        options: [
          { text: 'One', value: 'A' },
          { text: 'Two', value: 'B' },
          { text: 'Three', value: 'C' }
        ]
      }
    })   
</script>

6署驻、修飾符

(1).lazy:在默認情況下,v-model在每次 input事件觸發(fā)后將輸入框的值與數(shù)據(jù)進行同步 健霹。你可以添加 lazy 修飾符旺上,從而轉(zhuǎn)變?yōu)槭褂?change事件進行同步:

<div id="app">
    <input type="text" v-model.lazy='msg'/><br />
    <p>{{msg}}</p>
</div>
<script type="text/javascript">
    new Vue({
        el: "#app",
        data: {
            msg: '你好'
        }
    })
</script>

(2).number:如果想自動將用戶的輸入值轉(zhuǎn)為數(shù)值類型,可以給 v-model 添加 number修飾符 糖埋。這通常很有用宣吱,因為即使在 type="number" 時,HTML 輸入元素的值也總會返回字符串瞳别。

<div id="app">
    <input type="text" v-model.number="message">
    <p>{{message}}</p>
    <input @click="assay" type="button" value="獲取"> 
</div>
<script>
new Vue({
    el: '#app',
    data: {
        message: ""
    },
    methods: {
        assay () {
            console.log(typeof this.message);
        }
    }
})
</script>

需要注意的是:number修飾符并不是限制用戶的輸入,而是將用戶輸入的數(shù)據(jù)嘗試綁定為 js 中的 number類型 征候。如果用戶輸入的是數(shù)字,那么會得到一個number類型的值祟敛,而如果用戶輸入的不是數(shù)字疤坝,這個指令并不會產(chǎn)生任何效果。

(3).trim:如果要自動過濾用戶輸入的首尾空格馆铁,可以添加 trim 修飾符到 v-model 上過濾輸入

<div id="app">
    <input type="text" v-model.trim="message">
    <p>{{message}}</p>
    <input @click="assay" type="button" value="獲取"> 
</div>
<script>
new Vue({
    el: '#app',
    data: {
        message: ""
    },
    methods: {
        assay () {
            console.log(this.message);
        }
    }
})
</script>

Vue.js 組件

組件(Component)是 Vue.js 最強大的功能之一卒煞。

組件可以擴展 HTML 元素,封裝可重用的代碼叼架。

組件相當于新建一個屬于自己的標簽畔裕。但是這個標簽的功能很強大,可以有很多特殊的功能乖订。

組件系統(tǒng)讓我們可以用獨立可復(fù)用的小組件來構(gòu)建大型應(yīng)用扮饶,幾乎任意類型的應(yīng)用的界面都可以抽象為一個組件樹:

components.png

1、全局組件

全局注冊的組件可以用在任何新創(chuàng)建的 Vue 根實例 (new Vue) 的模板中 乍构,需要注意的是:全局組件必須寫在Vue實例創(chuàng)建之前甜无,才在該根元素下面生效

(1)注冊全局組件語法格式 如下:定義在script中,new Vue({ })之前

<script>
    Vue.component(tagName, options)

    參數(shù)說明:
    tagName:組件名稱
    options:配置選項
</script>

(2)調(diào)用組件

<tagName></tagName>

示例:

<div id="app">
    <!-- 3哥遮、使用組件 -->
    <my-component></my-component>
</div>
 
<script>
    // 2岂丘、注冊全局組件
    Vue.component('my-component', {
      template: '<h1>自定義組件!</h1>'
    })
    // 1、創(chuàng)建根實例
    new Vue({
      el: '#app'
    })
</script>

2眠饮、局部組件

如果不需要全局注冊奥帘,或者是讓組件使用在其它組件內(nèi),可以用選項對象的components屬性實現(xiàn)局部注冊仪召。

<div id="app">
    <!-- 3寨蹋、my-componen只能在#app下使用 -->
    <my-component></my-component>
</div>
 
<script>
    //1松蒜、創(chuàng)建局部組件
    var Child = {
      template: '<h1>自定義組件!</h1>'
    }

    // 創(chuàng)建根實例
    new Vue({   
      el: '#app',
      components: {
          //2、在根實例中注冊局部組件
         'my-component': Child
      }
    })
</script>

3已旧、組件中的屬性

關(guān)于組件中的其他屬性秸苗,可以和實例中的一樣,但是data屬性必須是一個函數(shù)运褪。

(1)全局組件

<div id="app">
  <my-component></my-component>
</div>
<script>
    Vue.component("my-component",{
        template:"<button @click='add'>全局組件:{{m}}</button>",
        data:function(){
            return {
                m:10
            }
        },
        methods:{
            add:function(){
                this.m++
            }
        }
     });
     new Vue({
        el:"#app"
     })
</script>

(2)局部組件

<div id="app">
  <child-component></child-component>
</div>
<script>
  var child={
    template:"<button @click='add'>我是局部組件:{{m}}</button>",
    data:function(){
        return {
            m:1
        }
    },
    methods:{
      add:function(){
        this.m++
      }
    }
  };
  new Vue({
    el: "#app",
    components:{
      "child-component":child
    }
  })
</script>

4惊楼、prop

prop 是父組件用來傳遞數(shù)據(jù)的一個自定義屬性。

父組件的數(shù)據(jù)需要通過 props 把數(shù)據(jù)傳給子組件秸讹,子組件需要顯式地用 props 選項聲明 "prop"

<div id="app">
    <child message="hello!"></child>
</div>
 
<script>
    // 注冊全局組件
    Vue.component('child', {
      // 聲明 props
      props: ['message'],
      template: '<span>{{ message }}</span>'
    })
    // 創(chuàng)建根實例
    new Vue({
      el: '#app'
    })
</script>

Vue.js 路由

有時候檀咙,我們在用vue的時候會有這樣的需求,比如一個管理系統(tǒng)嗦枢,點了左邊的菜單欄,右邊跳轉(zhuǎn)到一個新的頁面中屯断,而且刷新的時候還會停留在原來打開的頁面文虏。

又或者,一個頁面中幾個不同的畫面來回點擊切換殖演,這兩種情況都可以用vue router路由來解決

<!-- 導(dǎo)入js文件 -->
<script src="https://cdn.bootcss.com/vue-router/2.4.0/vue-router.js"></script>

<div id="app">
    <div>
    <!--
        使用router-link組件來導(dǎo)航氧秘,
        通過 to屬性就是指向某個具體的鏈接,鏈接的內(nèi)容會被渲染到router-view標簽中
        router-link會被渲染成a標簽趴久,
        例如第一個會變成<a href="#/first">第一個頁面</a>,前面加了個#
    -->
        <router-link to="/first">第1個頁面</router-link>
        <router-link to="/second">第2個頁面</router-link>
        <router-link to="/third">第3個頁面</router-link>
    </div>
            
    <!-- 路由匹配到的組件將渲染在這里 -->
    <router-view></router-view>
</div>

<script type="text/javascript">
    //1丸相、申明三個模板(定義路由組件)
    var first = { template: '<p>this is first page</p>' };
    var second = { template: '<p>this is second page</p>' };
    var third = { template: '<p>this is third page</p>' };
        
    //2、定義路由彼棍,每個路由應(yīng)該映射一個組件
    //其中灭忠,component屬性是通過 Vue.extend()創(chuàng)建的組件構(gòu)造器,
    //或者座硕,只是一個組件配置對象弛作。
    var routes = [
        { path: '/first', component: first },
        { path: '/second', component: second },
        { path: '/third', component: third }
    ];
        
    //3、創(chuàng)建VueRouter實例
    var router = new VueRouter({
        routes  //(縮寫)相當于routes: routes
    });
        
    /*4华匾、創(chuàng)建和掛載根實例
     * 通過router配置參數(shù)注入路由映琳,給vue對象綁定路由
     * .$mount("#app")手動掛載,用來延遲掛載蜘拉,跟
     *  const app = new Vue({
     *   el:"#app"
     *   router
     *  });
     * 效果是一樣的
     */
    const app = new Vue({
        router
    }).$mount("#app");
</script>

運行步驟:

  1. 當router-link對應(yīng)的標簽被點擊時萨西,比如此時點擊第二個,to的值是/second,那么實際的地址就是當前頁面地址+#/second旭旭。
  2. Vue會找到當前vue實例的路由里的routes里面path為/second的路由谎脯。
  3. 會將找到的這一行記錄的模板component渲染到router-view里面。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末持寄,一起剝皮案震驚了整個濱河市穿肄,隨后出現(xiàn)的幾起案子年局,更是在濱河造成了極大的恐慌,老刑警劉巖咸产,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矢否,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機停撞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門衔峰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人验庙,你說我怎么就攤上這事∩缟” “怎么了粪薛?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長搏恤。 經(jīng)常有香客問我违寿,道長,這世上最難降的妖魔是什么熟空? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任藤巢,我火速辦了婚禮,結(jié)果婚禮上息罗,老公的妹妹穿的比我還像新娘掂咒。我一直安慰自己,他們只是感情好迈喉,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布绍刮。 她就那樣靜靜地躺著,像睡著了一般挨摸。 火紅的嫁衣襯著肌膚如雪录淡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天油坝,我揣著相機與錄音嫉戚,去河邊找鬼。 笑死澈圈,一個胖子當著我的面吹牛彬檀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瞬女,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼窍帝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了诽偷?” 一聲冷哼從身側(cè)響起坤学,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤疯坤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后深浮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體压怠,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年飞苇,在試婚紗的時候發(fā)現(xiàn)自己被綠了菌瘫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡布卡,死狀恐怖雨让,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忿等,我是刑警寧澤栖忠,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站贸街,受9級特大地震影響庵寞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匾浪,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一皇帮、第九天 我趴在偏房一處隱蔽的房頂上張望卷哩。 院中可真熱鬧蛋辈,春花似錦、人聲如沸将谊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尊浓。三九已至逞频,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間栋齿,已是汗流浹背苗胀。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瓦堵,地道東北人基协。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像菇用,于是被迫代替她去往敵國和親澜驮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1.安裝 可以簡單地在頁面引入Vue.js作為獨立版本惋鸥,Vue即被注冊為全局變量杂穷,可以在頁面使用了悍缠。 如果希望搭建...
    Awey閱讀 10,995評論 4 129
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對于 Vue 1.0 印象不深的內(nèi)容耐量。關(guān)于...
    云之外閱讀 5,045評論 0 29
  • Vue 實例 屬性和方法 每個 Vue 實例都會代理其 data 對象里所有的屬性:var data = { a:...
    云之外閱讀 2,202評論 0 6
  • 阿斗沈尽: 像豬一樣地活著 就會像豬一樣地死去 君子終日乾乾 要夕惕若歷 其實 多數(shù)人像豬一樣的活著 小心 ...
    王天神閱讀 353評論 0 4
  • 10/31武麗娟感恩日志 感恩葉老師信任,我的堅持終于得到認可拴鸵,謝謝自己的堅持玷坠! 感恩承諾老師精彩點評,雖然是點評...
    花布魚閱讀 144評論 0 0