Vue 基礎篇一

Vue框架介紹

以前你們學過HTML,CSS,JS,JQuery,Bootstrap,如今咱們要學一個新的框架Vue~html

Vue是一個構建數據驅動的web界面的漸進式框架。vue

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

可以構建複雜的單頁面應用。如今咱們開始認識一下Vue~npm

// HTML 頁面
<div id="app">
    <span>你的名字是{{name}}</span>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="../js/main.js"></script>

// main.js 頁面
var app = new Vue({
    el: '#app',
    data: {
        name: "Gao_Xin"
    }
});
Vue demo

Vue指令

Vue的指令directives很像咱們所說的自定義屬性,指令是Vue模板中最經常使用的功能,瀏覽器

它帶有v-前綴,功能是當表達式改變的時候,相應的行爲做用在DOM上。緩存

<template>
<div>
  <h2>head</h2>
  <p v-text="msg"></p>
  <p v-html="html"></p>
</div>
</template>

<script>
    export default {
        name: "head",
      data(){
          return {
            msg: "消息",
            html: `<h2>插入h2標題</h2>`

          }
      }

    }
</script>

<style scoped>

</style>
v-test v-html
// HTML頁面
<div id="app">
        <label><input type="checkbox" v-model="sex" value="male">
            //  <input type="radio" v-model="sex" value="male">
        </label>
        <label><input type="checkbox" v-model="sex" value="female">
        </label>
        {{sex}}
</div>  

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="../js/main.js"></script>  

// main.js 頁面

var app = new Vue({
    el: '#app',
    data: {
        // sex: "male",
        sex: [],
    }
});
v-model input
// HTML 頁面
<div id="app">
<div>
        <textarea v-model="article">
        </textarea>
    </div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="../js/main.js"></script>
// main.js 頁面
var app = new Vue({
    el: '#app',
    data: {
        // sex: "male",
        sex: [],
        article: "這是一段文本。。這是一段文本。。這是一段文本。。這是一段文本。。這是一段文本。。"
    }
});
v-model textarea
// HTML頁面
<div id="app">
        <!--<select v-model="from">-->
            <!--<option value="1">單選1</option>-->
            <!--<option value="2">單選2</option>-->
        <!--</select>-->
        <!--{{from}}-->
        <select v-model="where" multiple="">
            <option value="1">多選1</option>
            <option value="2">多選2</option>
            <option value="3">多選3</option>
        </select>
        {{where}}
 </div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="../js/main.js"></script>
// main.js 頁面
var app = new Vue({
    el: '#app',
    data: {
        from: null,
        where: [],
    }
});
v-model select
//  需求是展現一我的的全部愛好 以及喜歡吃的食物和價格
// HTML 頁面  
<div id="app">
<div> 
        <span>你的愛好是</span>
        <ul>
            <li v-for="hobby in hobby_list">{{hobby}}</li>
        </ul>
</div>
<div>
        <span>你喜歡的食物</span>
        <ul>
            <li v-for="food in food_list">{{food.name}}: 價格¥{{food.discount ? food.price*food.discount: food.price}}</li>
        </ul>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="../js/main.js"></script>
// main.js
var app = new Vue({
    el: '#app',
    data: {
        hobby_list: ["王者毒藥","LOL","吃雞"],
        food_list: [
            {
                name: "蔥",
                price: 5,
                discount: .8,
            },
            {
                name: "姜",
                price: 8,
                // discount: .5

            }
        ],
    }
});
v-for
// 咱們經常見到博客中評論回覆的時候 @某某某
// 咱們點擊這個用戶是可以跳轉的  那麼這個應該是個動態的
// 咱們就須要給標籤屬性進行動態綁定 v-bind
// HTML頁面
<style>
        .active {
            background: red;
        }
</style>
<div id="app">
   <div>
        <!--<a v-bind:href="my_link">點我</a>-->
        <a v-bind:href="my_link" :class="{active: isActive}">點我 
 </a>
    </div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="../js/main.js"></script>
// main.js
var app = new Vue({
    el: '#app',
    data: {
        my_link: "http://baidu.com",
        isActive: true,
    }
});
v-bind
// 那咱們之前的事件綁定在vue中是怎麼作到的呢
// HTML頁面
<div>
        <span>事件</span>
        <button v-on="{mouseenter: onMouseenter, mouseleave: onMouseleave}" v-on:click="onClick(1)">點我</button>
    </div>
    <div>
        <input type="text" v-on="{keyup: onKeyup}">
</div>
// main.js
var app = new Vue({
    el: '#app',
    data: {
        my_link: "http://baidu.com",
        isActive: true,
    },
    methods: {
        onClick: function (a) {
            alert(a)
        },
        onMouseenter: function () {
            console.log("mouse enter")
        },
        onMouseleave: function () {
            console.log("mouse leave")
        },
        onKeyup: function () {
            console.log("key up")
        }
    },
});
v-on
// 咱們以前寫過權限 咱們如今模擬一個簡單的權限
// HTML頁面
<div>
        <div v-if="role == 'admin' || 'super_admin'">管理員你好</div>
        <div v-else-if="role == 'hr'">待查看簡歷列表</div>
        <div v-else> 沒有權限</div>
</div>
// main.js 頁面
var app = new Vue({
    el: '#app',
    data: {
        role: 'admin',
       // role: 'hr',
    },
});
v-if v-else-if v-else
// 如今咱們要實現一個功能 點擊一個按鈕顯示文本 再點擊取消
// 這種顯示和隱藏的功能 vue也幫咱們進行了封裝
// HTML頁面
<div id="app">
    <button @click="on_click()">
        點我
    </button>
    <p v-show="show">提示文本</p>
</div>
// main.js 頁面
var app = new Vue({
    el: '#app',
    data: {
        show: false,
    },
    methods: {
        on_click: function () {
            this.show = !this.show
        }
    }

});
v-show
//  咱們如今要獲取用戶的註冊信息
//  用戶名以及手機號 用指令修飾符可以讓咱們更加便捷
// HTML 頁面
<div>
    用戶名: <input type="text" v-model.lazy.trim="username"><br>
    {{username}}
    手機號: <input type="text" v-model.number="phone"><br>
    {{phone}}
</div>
// main.js 頁面
var app = new Vue({
    el: '#app',
    data: {
        username: "",
        phone: "",
    },
});
指令修飾符
// 咱們如今有個需求 點擊元素 讓這個元素在瀏覽器窗口釘住
// 咱們只需自定義一個指令,只要給元素綁定指令就能夠
// HTML頁面
<style>
        .card {
            border: solid 3px red;
            width: 200px;
            height: 100px;
            background: #eeeeee;
            margin-bottom: 5px;
        }
</style>
<div id="app">
 <div class="card" v-pin:true.bottom.right="pinned">
        <button @click="pinned = !pinned">盯住/取消</button>
        這是一個盒子文本內容
    </div>
    <div class="card">
        這是一個盒子文本內容
    </div>
    <div class="card">
        這是一個盒子文本內容
    </div>
    <div class="card">
        這是一個盒子文本內容
    </div>
    <div class="card">
        這是一個盒子文本內容
    </div>
    <div class="card">
        這是一個盒子文本內容
    </div>
    <div class="card">
        這是一個盒子文本內容
    </div>
</div>
// main.js 頁面
Vue.directive('pin', function (el, binding) {
    var binded = binding.value;
    var position = binding.modifiers;
    var warning = binding.arg;
    console.log(position)
    if(binded){
        el.style.position = 'fixed';
        for(var key in position){
            if (position[key]){
                el.style[key] = '20px';
            }
        }
        if (warning === 'true'){
            el.style.background = '#666'
        }

    }
    else {
        el.style.position = 'static';
        el.style.background = "#eeeeee"
    }
});
new Vue({
    el: '#app',
    data: {
        pinned: false,
    }
});
自定義指令以及修飾符和參數

Vue獲取DOM元素

    <style>
        .box {
            width: 200px;
            height: 200px;
            border: solid 1px red;
        }
    </style>

</head>
<body>
<div id="app">
    <div  class="box" ref="my_box">
        這是一個盒子
    </div>
</div>

<script>
    const app = new Vue({
        el: "#app",
        mounted(){
            this.$refs.my_box.style.color = "red";
        }
    })
</script>

</body>
獲取DOM

Vue計算屬性

咱們的模板表達式很是的便利,可是邏輯複雜的時候,模板會難以維護,vue提供了計算屬性。app

咱們用方法也能達到效果,那麼咱們爲何要用計算屬性呢~框架

其實在vue中方法和計算屬性達到的效果是同樣的,可是計算屬性是基於依賴進行緩存的,ide

只有依賴的數據發生改變的時候,纔會從新執行計算屬性的函數,每次調用都會從緩存中拿以前算好的數據。函數

而方法是每調用一次,執行一次。

// 如今咱們有一個成績的表格 來計算總分和平均分
// HTML頁面
<div id="app">
    <table border="1">
        <thead>
            <th>學科</th>
            <th>分數</th>
        </thead>
        <tbody>
            <tr>
                <td>數學</td>
                <td><input type="text" v-model.number="math"></td>
            </tr>
            <tr>
                <td>物理</td>
                <td><input type="text" v-model.number="physics"></td>
            </tr>
            <tr>
                <td>英語</td>
               <td><input type="text" v-model.number="english"></td>
            </tr>
            <tr>
                <td>總分</td>
               <!--<td>{{math+physics+english}}</td>-->
                <td>{{sum}}</td>
            </tr>
            <tr>
                <td>平均分</td>
               <!--<td>{{Math.round((math+physics+english)/3)}}</td>-->
                <td>{{average}}</td>
            </tr>
        </tbody>
    </table>
</div>
// js 頁面
var app = new Vue({
    el: '#app',
    data: {
        math: 90,
        physics:88,
        english: 78,
    },
    computed: {
        sum: function () {
            var total = this.math + this.physics + this.english
            return total
        },
        average: function () {
            var average_num = Math.round(this.sum/3)
            return average_num
        }
    }
});
計算屬性 computed 

Vue過濾器

過濾器是在數據到達用戶的最後一步進行簡單的過濾處理,複雜的仍是要用計算屬性或者方法。

// 咱們兩個需求 一個是價格展現後面自動加「元」
//  單位 毫米和米的轉換
// HTML頁面
<div>
        <p>價格展現</p>
        <input type="text" v-model="price">
        {{price | currency('USD')}}
</div>
<div>
        <p>換算</p>
        <input type="text" v-model="meters">
        {{meters | meter}}
 </div>
// js 代碼
Vue.filter('currency', function (val, unit) {
    val = val || 0;
    var ret = val+ unit
    return ret
});

Vue.filter('meter', function (val) {
    val = val || 0;
    return (val/1000).toFixed(2) + "米"
});
new Vue({
    el: '#app',
    data: {
        price: 10,
        meters: 10,
    }
});
過濾器 filter
相關文章
相關標籤/搜索