1. 程式人生 > 實用技巧 >Vue快速入門

Vue快速入門

Vue官網地址:https://cn.vuejs.org/
中文網:https://doc.vue-js.com/
js:https://cdnjs.cloudflare.com/ajax/libs/vue/2.2.2/vue.min.js


1. MVVM模式
Model:模型層
View:檢視層
ViewModel:連線模型檢視的中介軟體



2. IDEA整合Vue無法建立專案解決問題
如圖:下載外掛 -> 配置模板




3. 第一個Vue程式
所有東西都是響應式的,可以在控制檯操作物件屬性,介面實時更新

<body>
    <div id="app">
      {{message}}   <!--拿到message裡面的資料-->
    </div>

        <script>
            var vm = new Vue({      /*建立一個Vue物件*/
                el:"#app",          /*繫結元素*/
                data:{message:"hello,Vue"}  /*資料,鍵值對*/
            });
        </script>
</body>




4. 語法

  • V-bind --繫結元素特性
<body>
    <div id="app" v-bind:title="message">
      指標懸停幾秒檢視動態繫結提示資訊!
    </div>

        <script>
            var vm = new Vue({      /*建立一個Vue物件*/
                el:"#app",          /*繫結元素*/
                data:{message:"hello,Vue"}  /*資料,鍵值對*/

            });
        </script>
</body>

v-bind被稱為指令,指令是帶有 v- 的字首,以表示是Vue提供的特殊屬性,這裡的這個指令意思是該節點上面的title屬性與Vue實列的message屬性保持一致

  • v-if
<body>
<div id="app">
    <h1 v-if="ok==='A'">A</h1>
    <h1 v-else-if="ok==='B'">B</h1>
    <h1 v-else>C</h1>
</div>
    <script>
        var mv = new Vue({
            el:"#app",
            data:{ok: 'A'}
        });
    </script>
</body>
  • v-for
<body>
<div id="app">
    <li v-for="(arr,index) in array">
        {{arr.s}}--{{index}}
    </li>
</div>
    <script>
        var mv = new Vue({
            el:"#app",
            data: {
                array:[{s:"a"}, {s:"b"}, {s:"c"}]
            }
        });
    </script>
</body>

index下標是v-for自帶的引數,都是一些基本的流程控制




5. Vue的事件繫結

<body>
    <div id="app">
        <button v-on:click="f">按鈕</button>
    </div>
    <script>
        var mv = new Vue ({
           el:"#app",
           methods:{ /*想定義一個被Vue管理的事件,必須定義在methods這個屬性內,定義方式還是鍵值對*/
               f: function (){alert("hello,word");}
           }
        });
    </script>
</body>

v-on: 是事件繫結,後面一般是要繫結的事件型別和具體事件




6. 資料的雙向繫結

<body>
<div id="app">
    <select v-model="mag">
        <option value="" disabled>--請選擇--</option>
        <option>A</option>
        <option>B</option>
        <option>C</option>
    </select>
    {{mag}}
</div>
<script>
    var mv = new Vue({
       el:"#app",
       data:{
           mag:""
       }
    });
</script>
</body>

v-model:是資料的雙向繫結,元件裡面的屬性和Vue裡面的屬性繫結到了一起,雙方的屬性是互相影響的,繫結之後會始終以Vue實列裡面的資料作為資料來源,會自動忽略value之類的預設值




7. 什麼是元件
元件是可複用的Vue實列,也就是一組可以重複利用的模板

<body>
<div id="app">
                            <!--繫結String接收遍歷出來的每一個值-->
    <liu v-for="m in msg" v-bind:String="m"></liu>
</div>

<script>
    Vue.component("liu",{   /*元件要通過Vue物件的component建立*/
        props:["String"],   /*接收引數*/
        template:'<li>{{String}}</li>' /*模板*/
    });

    var mv = new Vue({
       el:"#app",
       data:{
           msg:["a","b","c"]
       }
    });
</script>
</body>




8. Axios非同步通訊

<body>
<div id="app">  <!--拿到info裡面的屬性值-->
    <div>{{info.user.name}}</div>
    <div>{{info.name}}</div>
    <a v-bind:href="info.url">點</a>
    <div v-for="l  in info.list ">{{l.name}}</div>
</div>
<script>
    var mv = new Vue({
       el:"#app",

        data(){
           return {
               info:{}
           }
        },
        mounted(){ /*鉤子函式,鏈式程式設計,ES6新特性*/
            axios.get("../data.json").then( response => (this.info = response.data) );
        }
    });
</script>
</body>




9. 什麼是計算屬性
這是能將計算結果快取起來的屬性,可以想象為快取

<body>
<div id="app">
    <p>{{tiem()}}</p>
    <p>{{tiem1}}</p>
</div>

<script>
    var mv = new Vue({
        el:"#app",
        data:{ msg:"A" },
        methods:{
            tiem:function (){return Date.now()}
        },
        computed:{ /*計算屬性,methods和computed裡面的方法不建議重名*/
          tiem1:function () { this.mag; return Date.now() }
        }
    });
</script>
</body>

在呼叫方法時,每次都需要計算,必定產生系統開銷,如果這個結果不是經常需要變化的,就可以用計算屬性快取起來,以節約我們的系統開銷,如果方法裡面的值發生變化,則快取就會重新重新整理。




10. 插槽
在Vue中可以使用元素作為承載分發內容的出口,可以應用在組合元件場景中

<body>

<div id="app">
    <doto>          <!--通過slot進行插槽繫結,bind拿到mv裡面的屬性值-->
        <doto-title slot="doto-title" v-bind:title="name"></doto-title>
        <doto-items slot="doto-items" v-for="time in todoitems" v-bind:title="time" ></doto-items>
    </doto>
</div>

<script>
    Vue.component("doto",{
        template: ' <div>\n' +
            '        <slot name="doto-title" ></slot>\n' + /*定義插槽模板通過name屬性繫結*/
            '        <ul>\n' +
            '            <slot name="doto-items"></slot>\n' +
            '        </ul>\n' +
            '    </div>'
    });

    Vue.component("doto-title", {
        props:["title"],
        template: '<li>{{title}}</li>'
    });

    Vue.component("doto-items",{
        props:["title"],
        template: '<li>{{title}}</li>',
    });

    var mv = new Vue({
        el:"#app",
        data:{
            name:"劉",
            todoitems:[1,2,3]
        },
    });
</script>

</body>

如果這節有疑問建議先看了解什麼是元件




11. 自定義事件
假如上面的程式碼需要刪除mv例項中的資料呢?此時就涉及到引數的傳遞和事件分發,Vue為我們提供很好的自定義事件用來解決這個問題,使用this.$emit("自定義事件名",引數),如圖下:

<body>
<div id="app">
    <doto>
        <doto-title slot="doto-title" v-bind:title="name"></doto-title>
        <doto-items slot="doto-items" v-for="(time,index) in todoitems"
                    v-bind:title="time" v-bind:index="index"  v-on:diya="remove(index)" >
                                                            <!--自定義一個事件繫結mv裡面的函式-->
        </doto-items>
    </doto>
</div>

<script>
    Vue.component("doto",{
       template: ' <div>\n' +
           '        <slot name="doto-title" ></slot>\n' +
           '        <ul>\n' +
           '            <slot name="doto-items"></slot>\n' +
           '        </ul>\n' +
           '    </div>'
    });

    Vue.component("doto-title", {
        props:["title"],
        template: '<li>{{title}}</li>'
    });

    Vue.component("doto-items",{
        props:["title","index"],                        /*只能繫結該元件中的函式*/
        template: '<li>{{title}}--------{{index}}<button @click="diy">刪除</button></li>',
        methods:{
           diy:function (index){
                this.$emit("diya",index); /*呼叫自定義事件,傳遞引數*/
               /* mv.remove(index);*/ /*也可以直接呼叫mv裡面的函式傳參這是簡便方式*/
           }
        }
    });

    var mv = new Vue({
       el:"#app",
       data:{
           name:"劉",
           todoitems:[1,2,3]
       },
       methods:{
           remove:function (index){
               this.todoitems.splice(index,1); /*刪除一個元素*/
           }
       }

    });
</script>
</body>




12. 第一個Vue-cli

  • 安裝node.js
    中文網:http://nodejs.cn/
    測試安裝成功:
    node -v,打印出對應版本號即可
    npm -v,打印出對應版本號即可
    如圖下:

  • 安裝淘寶加速器
    命令列輸入:npm install -g cnpm --registry=https://registry.npm.taobao.org,等待安裝

  • 安裝Vue-cli手腳架
    命令列輸入:cnpm install -g vue-cli,等待安裝

命令列輸入:vue-list,如圖下:

安裝成功,建議所有命令用管理員身份執行

  • 建立專案
    可以在指定的檔案路徑下使用:vue init webpack my-project(自定義專案名稱)命令來建立一個vue-cli專案這裡有一些配置預設回車即可,進入建立的專案路徑用命令列輸入:cnpm install安裝依賴,安裝完成之後,測試環境是否搭建成功在當前專案路徑啟動命令列輸入:npm run dev來執行專案,使用瀏覽器訪問:http://localhost:8080

13. webpack
命令列輸入:
cnpm install webpack -g
cnpm install webpack-cli -g,等待安裝
測試安裝成功,命令列輸入:
webpack -v
webpack-cli -v,列印對應版本號,如圖下:

  • 建立webpack.config.js檔案,並配置
/*檔名*/
module.exports = {
    entry:"./module/main.js",   /*入口*/
    output:{
        filename:"./js/bundle.js"   /*打包檔案存放路徑*/
    }
}

配置之後可以使用webpack命令進行打包,會在同級目錄生成一個js資料夾裡面會生成一個bundle.js檔案




14. vue-router路由選擇
在當前專案使用命令:cnpm install vue-router --save-dev 安裝外掛

  • 配置檔案
import Vue from 'vue'
import VueRouter from 'vue-router' /*匯入路由外掛*/

import components from "../components/components";
import Main from "../components/Main";

Vue.use(VueRouter)  /*安裝路由*/

/*配置匯出路由*/
export default new VueRouter({
  routes:[
    {
      path:'/components', /*跳轉路徑*/
      name:'content',
      component:components  /*跳轉元件*/
    },
    {
      path:'/Main',
      name:'content',
      component:Main
    }
  ]
});
  • 引入資源
import Vue from 'vue'
import App from './App'
import router from './router/inde'/*匯入路由*/

Vue.config.productionTip = false

new Vue({
  el: '#app',
  router, /*配置路由*/
  components: { App },
  template: '<App/>'
})
  • 開始使用
<template>
  <div id="app">
    <router-link to="/Main">首頁</router-link>  <!--請求指定路徑-->
    <router-link to="/components">內容</router-link>
    <router-view></router-view> <!--展示模板,資料-->
  </div>
</template>