1. 程式人生 > 其它 >第6章:vue-router,vue-cli和單檔案元件

第6章:vue-router,vue-cli和單檔案元件

  四,vue-router路由

  1.簡介

  使用Vue.js開發SPA(Single Page Application)單頁面應用

  根據不同url地址,顯示不同的內容,但顯示在同一個頁面中,稱為單頁面應用

  參考官網:https://router.vuejs.org/zh/

  下載

  使用cnpm下載

cnpm install [email protected] -S

  下載後的js檔案在當前目錄下

node_modules/vue-router/dist

  2.基本用法

  html

<div id='itany'>
        <div>
            <!-- 使用router-link元件來定義導航,to屬性指定連結url  -->
            <!-- <router-link> 預設會被渲染成一個 `<a>` 標籤 -->
            <router-link to="/home">主頁</router-link>
			<router-link to="/news">新聞</router-link>
        </div>
        <div>
            <!-- router-view用來顯示路由的內容 -->
            <!-- 路由出口 -->
            <!-- 路由匹配到的元件將渲染在這裡 -->
            <router-view></router-view>
        </div>
    </div>

  JavaScripts

<script>
        // 1.定義元件
        var Home={
            template:'<h3>我是主頁</h3>'
        }
        var News={
            template:'<h3>我是新聞</h3>'
        }
        // 2.配置路由
        const routes=[
            {path:'/home',component:Home},
            {path:'/news',component:News},
        ]
        // 3.建立路由例項
        const router=new VueRouter({
            // routes //簡寫相當於routes:routes
            routes,
            // mode:'history'
        });
        // 4.建立跟例項並將路由掛載到Vue例項上
        new Vue({
            el:'#itany',
            router  // 注入路由
        });
    </script>

  完整程式碼如下day03/09.html

  注意:引入vue.js需要在vue-router.js之前,否則控制檯報錯,原因不明

Unknown custom element: <router-link>

  

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>路由基本用法</title>
    <style>
        .router-link-active{
            font-size: 20px;
            color:#ff7300;
            text-decoration: none;
        }
    </style>
    <script src='js/vue.js'></script>
    <script src='js/vue-router.js'></script>
  
</head>
<body>
    <div id='itany'>
        <div>
            <!-- 使用router-link元件來定義導航,to屬性指定連結url  -->
            <!-- <router-link> 預設會被渲染成一個 `<a>` 標籤 -->
            <router-link to="/home">主頁</router-link>
			<router-link to="/news">新聞</router-link>
        </div>
        <div>
            <!-- router-view用來顯示路由的內容 -->
            <!-- 路由出口 -->
            <!-- 路由匹配到的元件將渲染在這裡 -->
            <router-view></router-view>
        </div>
    </div>
    <script>
        // 1.定義元件
        var Home={
            template:'<h3>我是主頁</h3>'
        }
        var News={
            template:'<h3>我是新聞</h3>'
        }
        // 2.配置路由
        const routes=[
            {path:'/home',component:Home},
            {path:'/news',component:News},
        ]
        // 3.建立路由例項
        const router=new VueRouter({
            // routes //簡寫相當於routes:routes
            routes,
            // mode:'history'
        });
        // 4.建立跟例項並將路由掛載到Vue例項上
        new Vue({
            el:'#itany',
            router  // 注入路由
        });
    </script>
</body>
</html>

  頁面顯示,點選主頁顯示我是主頁,新聞顯示我是新聞

  注意到點選連結會自動加#,如果不想看到這個#修改路由例項模式mode預設為hash修改為history

 const router=new VueRouter({
            // routes //簡寫相當於routes:routes
            routes,
            mode:'history'
        });

  頁面顯示

  點選主頁或者新聞也是有預設樣式的,可以通過控制檯檢視到  

  修改樣式,在<head>標籤內增加以下程式碼

<style>
        .router-link-active{
            font-size: 20px;
            color:#ff7300;
            text-decoration: none;
        }
</style>

  頁面顯示

  如果覺得這個樣式名稱太複雜也可以修改樣式名

 // 3.建立路由例項
        const router=new VueRouter({
            // routes //簡寫相當於routes:routes
            routes,
            // mode:'history'
            linkActiveClass:'active' //更新活動連結的class類名
 });

  同時樣式定義的時候也修改對應的名稱

<style>
        /* .router-link-active{
            font-size: 20px;
            color:#ff7300;
            text-decoration: none;
        } */
          .active{
            font-size: 20px;
            color:#ff7300;
            text-decoration: none;
        }
    </style>

  預設開啟頁面是不顯示主頁或者新聞的需要點選才顯示,可以通過路由重定向,例如開啟首頁顯示Home或者在沒有找到路由的情況下跳轉至Home

  修改配置路由程式碼

 // 2.配置路由
    const routes=[
        {path:'/home',component:Home},
        {path:'/news',component:News},
       {path:'*',redirect:'/home'} //重定向
     ]

  頁面顯示,預設顯示Home,如果隨意寫一個沒有的路由也會跳到Home

  3.路由巢狀和引數的傳遞

  路由巢狀:路由對應的連結下還有連結

  把上面設定的路由新聞處改成使用者,使用者下面又有兩個連結分別為使用者登入和使用者註冊

  day03/10.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>路由巢狀和引數的傳遞</title>
    <style>
          .active{
            font-size: 20px;
            color:#ff7300;
            text-decoration: none;
        }
    </style>
    <script src='js/vue.js'></script>
    <script src='js/vue-router.js'></script>
    <!-- <script src='js/vue.js'></script> -->
  
</head>
<body>
    <div id='itany'>
        <div>
            <!-- 使用router-link元件來定義導航,to屬性指定連結url  -->
            <!-- <router-link> 預設會被渲染成一個 `<a>` 標籤 -->
            <router-link to="/home">主頁</router-link>
			<router-link to="/user">使用者</router-link>
        </div>
        <div>
            <!-- router-view用來顯示路由的內容 -->
            <!-- 路由出口 -->
            <!-- 路由匹配到的元件將渲染在這裡 -->
            <router-view></router-view>
        </div>
    </div>
    <template id='user'>
        <div>
            <h3>使用者資訊</h3>
            <ul>
                <li><router-link to="/user/login">使用者登入</router-link></li>
                <li><router-link to="/user/regist">使用者註冊</router-link></li>
            </ul>
             <!-- 路由匹配到的元件將渲染在這裡,需要設定否則不渲染,點選無顯示 -->
            <router-view></router-view>
        </div>
    </template>
    <script>
        // 1.定義元件
        var Home={
            template:'<h3>我是主頁</h3>'
        }
        var User={
            template:'#user'
        }
        var Login={
            template:'<h4>使用者登入...</h4>'
        }
        var Regist={
            template:'<h4>使用者註冊...</h4>'
        }
        // 2.配置路由
        const routes=[
            {
                path:'/home',
                component:Home
            },
            
            {
                path:'/user',
                component:User,
                children:[
                    {
                        path:'login',
                        component: Login
                    },
                    {
                        path:'regist',
                        component: Regist
                    },
                ]
            },
            {
                path:'*',
                redirect:'/home'
            } //重定向
        ]
            // 3.建立路由例項
            const router=new VueRouter({
                // routes //簡寫相當於routes:routes
                routes,
                // mode:'history'
                linkActiveClass:'active' //更新活動連結的class類名
            });
        // 4.建立跟例項並將路由掛載到Vue例項上
        new Vue({
            el:'#itany',
            router  // 注入路由
        });
    </script>
</body>
</html>

  解析:在設定路由下新加關鍵字children對應巢狀的路由,寫法是一致的

  頁面顯示

  上面寫法是把標籤<router-link>寫入到標籤<li>內,也可以直接寫<router-link>標籤通過關鍵字tag來指定包含的標籤型別為<li>,以下為簡化寫法,效果是一樣的

                <!-- <li><router-link to="/user/login">使用者登入</router-link></li>
                <li><router-link to="/user/regist">使用者註冊</router-link></li> -->
                <router-link to="/user/login" tag='li'>使用者登入</router-link>
                <router-link to="/user/regist" tag='li'>使用者註冊</router-link>

  傳遞引數的兩種形式

  a.查詢字串:login?name=tom&pwd=123

    {{$route.query}}

  b.rest風格url:regist/alice/456

    {{$route.params}}

  傳遞引數獲取示例,修改程式碼,演示兩種傳遞引數及如何獲取傳遞的引數

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>路由巢狀和引數的傳遞</title>
    <style>
          .active{
            font-size: 20px;
            color:#ff7300;
            text-decoration: none;
        }
    </style>
    <script src='js/vue.js'></script>
    <script src='js/vue-router.js'></script>
    <!-- <script src='js/vue.js'></script> -->
  
</head>
<body>
    <div id='itany'>
        <div>
            <!-- 使用router-link元件來定義導航,to屬性指定連結url  -->
            <!-- <router-link> 預設會被渲染成一個 `<a>` 標籤 -->
            <router-link to="/home">主頁</router-link>
			<router-link to="/user">使用者</router-link>
        </div>
        <div>
            <!-- router-view用來顯示路由的內容 -->
            <!-- 路由出口 -->
            <!-- 路由匹配到的元件將渲染在這裡 -->
            <router-view></router-view>
        </div>
    </div>
    <template id='user'>
        <div>
            <h3>使用者資訊</h3>
            <ul>
                <!-- <li><router-link to="/user/login">使用者登入</router-link></li>
                <li><router-link to="/user/regist">使用者註冊</router-link></li> -->
                <router-link to="/user/login?name=tom&pwd=123" tag='li'>使用者登入</router-link>
                <router-link to="/user/regist/alice/456" tag='li'>使用者註冊</router-link>
            </ul>
             <!-- 路由匹配到的元件將渲染在這裡,需要設定否則不渲染,點選無顯示 -->
            <router-view></router-view>
        </div>
    </template>
    <script>
        // 1.定義元件
        var Home={
            template:'<h3>我是主頁</h3>'
        }
        var User={
            template:'#user'
        }
        var Login={
            template:'<h4>使用者登入...獲取引數:{{$route.query}}</h4>'
        }
        var Regist={
            template:'<h4>使用者註冊...獲取引數: {{$route.params}}</h4>'
        }
        // 2.配置路由
        const routes=[
            {
                path:'/home',
                component:Home
            },
            
            {
                path:'/user',
                component:User,
                children:[
                    {
                        path:'login',
                        component: Login
                    },
                    {
                        path:'regist/:username/:password',
                        component: Regist
                    },
                ]
            },
            {
                path:'*',
                redirect:'/home'
            } //重定向
        ]
            // 3.建立路由例項
            const router=new VueRouter({
                // routes //簡寫相當於routes:routes
                routes,
                // mode:'history'
                linkActiveClass:'active' //更新活動連結的class類名
            });
        // 4.建立跟例項並將路由掛載到Vue例項上
        new Vue({
            el:'#itany',
            router  // 注入路由
        });
    </script>
</body>
</html>

  解析

  注意:使用方式1直接傳遞即可,使用方式2為了不讓瀏覽器認為傳遞的引數是路由需要定義,傳遞引數的方式,如下

  頁面顯示

  4.路由例項的方法

  router.push()新增路由,功能上與<route-link>相同

  router.replace()替換路由,不產生歷史記錄

  示例 day03/10.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>路由巢狀和引數的傳遞</title>
    <style>
          .active{
            font-size: 20px;
            color:#ff7300;
            text-decoration: none;
        }
    </style>
    <script src='js/vue.js'></script>
    <script src='js/vue-router.js'></script>
    <!-- <script src='js/vue.js'></script> -->
  
</head>
<body>
    <div id='itany'>
        <div>
            <!-- 使用router-link元件來定義導航,to屬性指定連結url  -->
            <!-- <router-link> 預設會被渲染成一個 `<a>` 標籤 -->
            <router-link to="/home">主頁</router-link>
			<router-link to="/user">使用者</router-link>
        </div>
        <div>
            <!-- router-view用來顯示路由的內容 -->
            <!-- 路由出口 -->
            <!-- 路由匹配到的元件將渲染在這裡 -->
            <router-view></router-view>
        </div>
        <button @click='push'>新增路由</button>
        <button @click='replace'>替換路由</button>
    </div>
    <template id='user'>
        <div>
            <h3>使用者資訊</h3>
            <ul>
                <!-- <li><router-link to="/user/login">使用者登入</router-link></li>
                <li><router-link to="/user/regist">使用者註冊</router-link></li> -->
                <router-link to="/user/login?name=tom&pwd=123" tag='li'>使用者登入</router-link>
                <router-link to="/user/regist/alice/456" tag='li'>使用者註冊</router-link>
            </ul>
             <!-- 路由匹配到的元件將渲染在這裡,需要設定否則不渲染,點選無顯示 -->
             <div>
                <router-view></router-view>
             </div>
            <hr>
            
        </div>
    </template>
    <script>
        // 1.定義元件
        var Home={
            template:'<h3>我是主頁</h3>'
        }
        var User={
            template:'#user'
        }
        var Login={
            template:'<h4>使用者登入...獲取引數:{{$route.query}}</h4>'
        }
        var Regist={
            template:'<h4>使用者註冊...獲取引數: {{$route.params}}</h4>'
        }
        // 2.配置路由
        const routes=[
            {
                path:'/home',
                component:Home
            },
            
            {
                path:'/user',
                component:User,
                children:[
                    {
                        path:'login',
                        component: Login
                    },
                    {
                        path:'regist/:username/:password',
                        component: Regist
                    },
                ]
            },
            {
                path:'*',
                redirect:'/home'
            } //重定向
        ]
            // 3.建立路由例項
            const router=new VueRouter({
                // routes //簡寫相當於routes:routes
                routes,
                // mode:'history'
                linkActiveClass:'active' //更新活動連結的class類名
            });
        // 4.建立跟例項並將路由掛載到Vue例項上
        new Vue({
            el:'#itany',
            router,  // 注入路由
            methods:{
                push(){
                    router.push({path:'home'}); // 新增路由,切換路由
                },
                replace(){
                    router.replace({path:'user'}); // 替換路由,沒有歷史記錄
                },
            }
        });
    </script>
</body>
</html>

  解析

  增加兩個按鈕分別呼叫新增路由和替換路由的方法

  方法如下,分別把路由指向home和user

  頁面顯示

  兩者的區別在於替換路由是沒有歷史記錄的即替換路由的上一頁

  5.路由結合動畫

  利用之前學的animate.css可以給路由結合動畫,只需要給<router-view></router-view>標籤套在<transition>標籤內即可

  day03/10.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="css/animate.css">
    <title>路由巢狀和引數的傳遞</title>
    <style>
          .active{
            font-size: 20px;
            color:#ff7300;
            text-decoration: none;
        }
    </style>
    <script src='js/vue.js'></script>
    <script src='js/vue-router.js'></script>
    <!-- <script src='js/vue.js'></script> -->
  
</head>
<body>
    <div id='itany'>
        <div>
            <!-- 使用router-link元件來定義導航,to屬性指定連結url  -->
            <!-- <router-link> 預設會被渲染成一個 `<a>` 標籤 -->
            <router-link to="/home">主頁</router-link>
			<router-link to="/user">使用者</router-link>
        </div>
        <div>
            <!-- router-view用來顯示路由的內容 -->
            <!-- 路由出口 -->
            <!-- 路由匹配到的元件將渲染在這裡 -->
            <transition enter-active-class="animated bounceInLeft" leave-active-class="animated bounceOutRight">
                <router-view></router-view>
            </transition>   
        </div>
        <button @click='push'>新增路由</button>
        <button @click='replace'>替換路由</button>
    </div>
    <template id='user'>
        <div>
            <h3>使用者資訊</h3>
            <ul>
                <!-- <li><router-link to="/user/login">使用者登入</router-link></li>
                <li><router-link to="/user/regist">使用者註冊</router-link></li> -->
                <router-link to="/user/login?name=tom&pwd=123" tag='li'>使用者登入</router-link>
                <router-link to="/user/regist/alice/456" tag='li'>使用者註冊</router-link>
            </ul>
             <!-- 路由匹配到的元件將渲染在這裡,需要設定否則不渲染,點選無顯示 -->
             <div>
               
                    <router-view></router-view>
               
             </div>
            <hr>
            
        </div>
    </template>
    <script>
        // 1.定義元件
        var Home={
            template:'<h3>我是主頁</h3>'
        }
        var User={
            template:'#user'
        }
        var Login={
            template:'<h4>使用者登入...獲取引數:{{$route.query}}</h4>'
        }
        var Regist={
            template:'<h4>使用者註冊...獲取引數: {{$route.params}}</h4>'
        }
        // 2.配置路由
        const routes=[
            {
                path:'/home',
                component:Home
            },
            
            {
                path:'/user',
                component:User,
                children:[
                    {
                        path:'login',
                        component: Login
                    },
                    {
                        path:'regist/:username/:password',
                        component: Regist
                    },
                ]
            },
            {
                path:'*',
                redirect:'/home'
            } //重定向
        ]
            // 3.建立路由例項
            const router=new VueRouter({
                // routes //簡寫相當於routes:routes
                routes,
                // mode:'history'
                linkActiveClass:'active' //更新活動連結的class類名
            });
        // 4.建立跟例項並將路由掛載到Vue例項上
        new Vue({
            el:'#itany',
            router,  // 注入路由
            methods:{
                push(){
                    router.push({path:'home'}); // 新增路由,切換路由
                },
                replace(){
                    router.replace({path:'user'}); // 替換路由,沒有歷史記錄
                },
            }
        });
    </script>
</body>
</html>

  解析

  新增動態進入出去動畫

  五,單檔案元件

  1. .vue檔案

  .vue檔案,稱為單檔案元件,是Vue.js自定義的一種檔案格式,一個.vue檔案就是一個單獨的元件,在檔案內封裝了元件相關的程式碼:html,css,js

  .vue檔案由三部分組成<template> <style><script>

<template>
    html
</template>

  

<style>
    css
</style>

  

<script>
    js
</script>

  2.vue-loader

  瀏覽器本身並不認識.vue結尾的檔案,所以必須對.vue檔案載入和解析,此時需要vue-loader

  類似的loader還有許多,如:html-loader ,css-loader,style-loader,babel-loader等

  需要注意的是vue-loader是基於webpack的

  3.webpack

  webpack是一個前端資源模組化載入器和打包工具,它能夠把各種資源都作為模組來使用和處理

  實際上,webpack是通過不同的loader將這些資源載入後進行打包,然後輸出打包後的檔案

  簡單來說,webpack就是一個模組載入器,所有的資源都可以作為模組來載入,最後打包輸出。

  webpack官網:https://webpack.github.io/

  webpack版本:v1.x v2.x

  webpack有一個核心配置檔案:webpack.config.js,必須放在專案的根目錄下

  4.示例,步驟

  4.1 建立專案,目錄結構如下:

  webpack-demo

|­index.html
|­main.js 入口檔案
|­App.vue vue檔案
|­package.json 工程檔案
|­webpack.config.js webpack配置檔案
|­.babelrc Babel配置檔案

  其他檔案手動建立,­package.json可以通過目錄建立初始檔案

cnpm init --yes

  

  4.2編寫App.vue

  每個部分都有一個簡單的內容

<template>
	<div id="itany">
		<h1>welcome to itany</h1>
	
	</div>
</template>

<script>

	console.log(111);

</script>

<style>
	body{
		background-color:#ccc;
	}
</style>
  4.3安裝相關模組
cnpm install vue -S

  -S為生產依賴,-D為開發依賴

cnpm init --yes
cnpm install -D webpack webpack-dev-server vue-loader vue-html-loader css-loader vue-style-loader file-loader babel-loader babel-core babel-preset-env vue-template-compiler webpack-cli

  注意:複製貼上安裝可能會出現字元編碼問題無法安裝,可以手動輸入安裝,安裝後會更新package.json檔案

  以下程式碼初始化package.json檔案

cnpm init --yes

  執行完畢以後package.json檔案

{
  "name": "webpack-demo",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "dev": "webpack-dev-server  --hot --port 8800 --host 0.0.0.0"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "vue": "^2.3.4"
  },
  "devDependencies": {
    "babel-core": "^6.25.0",
    "babel-loader": "^7.1.1",
    "babel-preset-env": "^1.5.2",
    "css-loader": "^0.28.4",
    "file-loader": "^0.11.2",
    "vue-html-loader": "^1.2.4",
    "vue-loader": "^13.0.0",
    "vue-style-loader": "^3.0.1",
    "vue-template-compiler": "^2.3.4",
    "webpack": "^3.0.0",
    "webpack-cli": "^4.9.1",
    "webpack-dev-server": "^2.5.0"
  }
}

  修改了預設的scripts語句,下面語句的意思是環境dev啟動本機的8800埠 允許所有主機訪問,注意需要--host 0.0.0.0否則只能是本機訪問

 "dev": "webpack-dev-server  --hot --port 8800 --host 0.0.0.0"

  

  如果安裝失敗可以使用以下方法重新安裝

rm -rf node_modules
rm -rf package-lock.json
npm cache clear --force
npm install
  4.5編寫main.js

  main.js

/**
 * 使用ES6語法引入模板
 */
import Vue from 'vue'
import App from './App.vue'

new Vue({
        el:'#app',
        render:function(h){ //使用render函式渲染元件
                return h(App);
        }
});

  解析

import Vue from 'vue'

  會從當前目錄node_modules 查詢模組

  4.5 編寫webpack.config.js

  webpack.config.js

module.exports={
        //配置入口檔案
        entry:'./main.js',
        //配置入口檔案輸出位置
        output:{
                path:__dirname, //專案根路徑
                filename:'build.js'
        },
        //配置模組載入器
        module:{
                rules:[
                        {
                                test:/\.vue$/, //所有以.vue結尾的檔案都由vue-loader載入
                                loader:'vue-loader'
                        },
                        {
                                test:/\.js$/, //所有以.js結尾的檔案都由babel-loader載入,除了node_modules以外
                                loader:'babel-loader',
                                exclude:/node_modules/
                        }
                ]
        }
}
  4.6 編寫.babelrc

  .babelrc

{
        "presets":[
                ["env",{"module":false}]
        ]
}
~
  4.7 編寫package.json
{
  "name": "webpack-demo",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "dev": "webpack-dev-server  --hot --port 8800 --host 0.0.0.0"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "vue": "^2.3.4"
  },
  "devDependencies": {
    "babel-core": "^6.25.0",
    "babel-loader": "^7.1.1",
    "babel-preset-env": "^1.5.2",
    "css-loader": "^0.28.4",
    "file-loader": "^0.11.2",
    "vue-html-loader": "^1.2.4",
    "vue-loader": "^13.0.0",
    "vue-style-loader": "^3.0.1",
    "vue-template-compiler": "^2.3.4",
    "webpack": "^3.0.0",
    "webpack-cli": "^4.9.1",
    "webpack-dev-server": "^2.5.0"
  }
}
  4.8 執行測試
 cnpm run dev

  實際就相當於執行以下命令

webpack-dev-server  --hot --port 8800 --host 0.0.0.0

  啟動8800埠

  頁面訪問

  修改App.vue可以實現熱載入,例如修改以下內容

  不需要重啟,頁面顯示

  修改使點選tom修改name屬性

<template>
        <div id="itany">
                <h1>welcome</h1>
                <h2 @click="change">{{name}}</h2>

        <!--    <User></User> -->
        </div>
</template>

<script>

        //匯入模組
        // import User from './components/User.vue'

        // console.log(111);
        export default {
                data(){
                        return {
                                name:'tom'
                        }
                },
                methods:{
                        change(){
                                this.name='湯姆';
                        }
                },
                //components:{
                //      User
                // }
         }
</script>

<style>
        body{
                background-color:#ccc;
        }
</style>

  頁面顯示

  開發元件展示一個使用者的資訊

 cat components/User.vue
<template>
        <div class="user">
                <h2>使用者列表</h2>
                <ul>
                        <li v-for="value in users">{{value}}</li>
                </ul>
        </div>
</template>

<script>
        export default {
                data(){
                        return {
                                users:['tom','jack','mike','alice']
                        }
                }
        }
</script>

<style scoped> /* scoped表示該樣式只在當前元件中有效 */
        h2{
                color:red;
        }

  修改App.vue

# cat App.vue
<template>
        <div id="itany">
                <h1>welcome</h1>
                <h2 @click="change">{{name}}</h2>

        <User></User>
        </div>
</template>

<script>

        //匯入模組
        import User from './components/User.vue'

        // console.log(111);
        export default {
                data(){
                        return {
                                name:'tom'
                        }
                },
                methods:{
                        change(){
                                this.name='湯姆';
                        }
                },
                components:{
                        User
                 }
         }
</script>

<style>
        body{
                background-color:#ccc;
        }
</style>

  頁面顯示

  六,vue-cli腳手架

  1.簡介

  vue-cli是一個vue腳手架,可以快速搭建專案結構

  vue-cli本身集成了多種專案模板:

simple 很少使用簡單
webpack 包含ESLint程式碼規範的檢查unit單元測試
webpack-simple 沒有程式碼規範檢查和單元測試
browserify 使用的也比較多
browserify­-simple

  2.示例

  2.1 安裝vue­cli,配置vue命令環境

  全域性安裝

cnpm install vue-cli -g

  檢視版本

D:\vue.js\code\day03\webpack-demo>vue --version
2.9.6

  列出可用的模板

  2.2 初始化專案,生成專案模板
語法:vue init 模板名 專案名

  

D:\vue.js\code\day03>vue init webpack-simple vue-cli-demo
  2.3 進入生成的專案目錄,安裝模組包
cd vue-cli-demo
cnpm install
cnpm run dev

  在windows下自動開啟瀏覽器

  生產中將專案打包

cnpm run build // 將專案打包輸出dist目錄,專案上線的話要講dist目錄拷貝到伺服器上

  

   3. 使用webpack模板

vue init webpack vue-­cli-­demo2

  ESLint是用來統一程式碼規範和風格的工具,如縮排、空格、符號等,要求比較嚴格

  eslint規則官網:https://eslint.org/

cnpm install
cnpm run dev 
cnpm run build

  訪問首頁是一樣的

  

  模組化開發

  初始化

  在新建的day04執行

D:\vue.js\code\day04>vue init webpack-simple vue-cli-demo
  1.vue-router模組化

  安裝vue-router,生產依賴

cnpm install vue-router -S
  2.編輯main.js 

  引用vue-router

  src/main.js

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

// 使用vue-router
Vue.use(VueRouter);


new Vue({
  el: '#app',
  render: h => h(App)
})

  修改App.vue

<template>
  <div id="app">
    {{msg}}
  </div>
</template>

<script>
export default {
  name: 'app',
  data () {
    return {
      msg: 'Welcome to itany'
    }
  }
}
</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;
}

h1, h2 {
  font-weight: normal;
}

ul {
  list-style-type: none;
  padding: 0;
}

li {
  display: inline-block;
  margin: 0 10px;
}

a {
  color: #42b983;
}
</style>

  執行 

cd vue-cli-demo
cnpm install
cnpm run dev

  頁面顯示

  

  繼續編輯App.vue增加主頁和新聞連結

<template>
  <div id="app">
    {{msg}}
    <h3>
      <router-link to="/home">主頁</router-link>
      <router-link to="/news">新聞</router-link>
    </h3>
    <div> 
      <keep-alive>
        <!-- 渲染顯示 -->
        <router-view> </router-view>
      </keep-alive>
    </div>
  </div>
  
</template>

<script>
export default {
  name: 'app',
  data () {
    return {
      msg: 'Welcome to itany'
    }
  }
}
</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;
}

h1, h2 {
  font-weight: normal;
}

ul {
  list-style-type: none;
  padding: 0;
}

li {
  display: inline-block;
  margin: 0 10px;
}

a {
  color: #42b983;
}
</style>

  在目錄src下新建資料夾components新增Home.vue和News.vue

  Home.vue

<template>
    <div id="home">
        <h3>這是主頁</h3>
    </div>
</template>

  News.vue

<template>
    <div id="news">
        <h3>這是新聞</h3>
    </div>
</template>

  在src下新增路由配置檔案

  router.config.js

import Home from './components/Home.vue'
import News from './components/News.vue'

export default{
    routes:[
        {
            path:'/home',
            component:Home
        },
        {
            path:'/news',
            component:News
        },
    ]
}

  在main.js引入注入路由

import Vue from 'vue'
import VueRouter from 'vue-router'
import App from './App.vue'
import routerConfig from './router.config.js'
// 使用vue-router
Vue.use(VueRouter);

// 建立路由例項
const router=new VueRouter(routerConfig);

new Vue({
  el: '#app',
  render: h => h(App),
  // 注入路由
  router
})

  啟動專案

cnpm run dev

  頁面顯示

  列印路由資訊以及監視路由的變化,在App.vue增加以下程式碼

mounted(){
    console.log(this.$route)
  },
  watch:{
    $route:function(newValue,oldValue) {
      console.log('路由傳送變化,跳轉到:'+newValue.path)
    }
  }

  列印路由物件以及監視路由如果發生了變化則列印新路由資訊

  頁面顯示

  2. axios模組化

  安裝    

cnpm install axios -S

  使用axios的兩種方式

    方式1:在每個元件中引入axios

    方式2:在入口檔案main.js全域性引入並新增到Vue的原型中

  方式1示例

  App.vue

<template>
  <div id="app">
    {{msg}}
    <h3>
      <router-link to="/home">主頁</router-link>
      <router-link to="/news">新聞</router-link>
    </h3>
    <div> 
      <keep-alive>
        <!-- 渲染顯示 -->
        <router-view> </router-view>
      </keep-alive>
    </div>
    <hr>
    <button @click='send'>傳送AJAX請求</button>
  </div>
  
</template>

<script>
import axios from 'axios'

export default {
  name: 'app',
  data () {
    return {
      msg: 'Welcome to itany'
    }
  },
  mounted(){
    console.log(this.$route)
  },
  watch:{
    $route:function(newValue,oldValue) {
      console.log('路由傳送變化,跳轉到:'+newValue.path)
    }
  },
  methods:{
    send(){
      axios.get('https://api.github.com/users/tangyang8942')
      .then(resp=>{
        console.log(resp.data);
      }).catch(err=>{
        console.log(err);
      });
    }
  }
}
</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;
}

h1, h2 {
  font-weight: normal;
}

ul {
  list-style-type: none;
  padding: 0;
}

li {
  display: inline-block;
  margin: 0 10px;
}

a {
  color: #42b983;
}
</style>

  頁面顯示

  

  如果需要在Home元件中引用則需要在Home.vue引入這樣使用不方便

  使用方式2示例

  修改入口檔案main.js

import Vue from 'vue'
import VueRouter from 'vue-router'
import App from './App.vue'
import routerConfig from './router.config.js'
import axios from 'axios'
// 使用vue-router
Vue.use(VueRouter);

// 建立路由例項
const router=new VueRouter(routerConfig);

// 加入Vue原型,其他元件可以直接引用
Vue.prototype.$http=axios
new Vue({
  el: '#app',
  render: h => h(App),
  // 注入路由
  router
})

  需要使用axios的地方直接使用this.$http使用,修改App.vue

  效果是一樣的

  3.為自定義元件新增事件

  src/compoents自定義元件 MyButton.vue

<template>
    <button>自定義按鈕</button>
</template>

<style>
    button{
        width:100px;
        height: 30px;
        background-color:#ccc;
        color:red;
    }
</style>

  在App.vue引入元件並繫結事件send

<template>
  <div id="app">
    {{msg}}
    <h3>
      <router-link to="/home">主頁</router-link>
      <router-link to="/news">新聞</router-link>
    </h3>
    <div> 
      <keep-alive>
        <!-- 渲染顯示 -->
        <router-view> </router-view>
      </keep-alive>
    </div>
    <hr>
    <button @click='send'>傳送AJAX請求</button>
    <MyButton @click.native='send'></MyButton>
  </div>
  
</template>

<script>
// import axios from 'axios'
import MyButton from './components/MyButton.vue'

export default {
  name: 'app',
  data () {
    return {
      msg: 'Welcome to itany'
    }
  },
  mounted(){
    console.log(this.$route)
  },
  watch:{
    $route:function(newValue,oldValue) {
      console.log('路由傳送變化,跳轉到:'+newValue.path)
    }
  },
  methods:{
    send(){
      this.$http.get('https://api.github.com/users/tangyang8942')
      .then(resp=>{
        console.log(resp.data);
      }).catch(err=>{
        console.log(err);
      });
    }
  },
  components:{
    MyButton
  }
}
</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;
}

h1, h2 {
  font-weight: normal;
}

ul {
  list-style-type: none;
  padding: 0;
}

li {
  display: inline-block;
  margin: 0 10px;
}

a {
  color: #42b983;
}
</style>

  解析

  注意自定義需要需要加修飾符native監聽元件根元素的原生事件,否則不生效

  點選按鈕呼叫send方法,和上面例子效果是一樣的