1. 程式人生 > 其它 >Vue基礎知識學習1

Vue基礎知識學習1

本文基於B站尚矽谷的Vue學習教程,推薦大家去觀看。

一. Vue簡介

Vue是一套用於構建使用者介面的漸進式js框架,它的學習可以分為以下6個部分。

  1. Vue基礎
  2. vue-cli
  3. vue-router
  4. vuex
  5. element-ui
  6. vue3

Vue有三個主要的特點:

  • 採用元件化模式,提高程式碼複用率、且讓程式碼更好維護。

  • 宣告式編碼,讓編碼人員無需直接操作DOM,提高開發效率。

  • 使用虛擬DOM+優秀的Diff演算法,儘量複用DOM節點。

理解元件化的含義,元件字尾為.vue,包括html,css,和js程式碼

這裡推薦vue的官網,裡面有文件和很多學習資源。

學習Vue之前要掌握的JavaScript基礎知識包括ES6語法規範,ES6模組化,包管理器,原型、原型鏈,陣列常用方法,axios,promise等等。

二. 搭建Vue開發環境

簡單配置:

  1. 官網下載開發版本vue.js
  2. 瀏覽器安裝vue devtools(一般瀏覽器外掛庫裡可以搜到)
  3. 在html檔案對vue.js進行引用即可完成一些簡單的實驗。

三. vue的知識點

1. vue的入門常識

示例程式碼
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>vue模板語法</title>
    <script type="text/javascript" src="vue.js"></script>
</head>
<body>
<!--
初識Vue:
    1.想讓Vue工作,就必須建立一個Vue例項,且要傳入一個配置物件;
    2.root容器裡的程式碼依然符合html規範,只不過混入了一些特殊的Vue語法;
    3.root容器裡的程式碼被稱為Vue模板;
    4.Vue例項和容器是一一對應的;
    5.真實開發中只有一個Vue例項, 並且會配合著元件一起使用;
    6.{{xxx}}中的xxx要寫js表示式,且xx可以自動讀取到data中的所有屬性;
    7.且data中的資料發生改變,那麼模板中用到該資料的地方也會自動更新;
-->
<!-- 建立一個容器  為Vue提供模板,展示Vue的工作成果  -->
    <div id="root">
        <h2>hello {{name}} {{school.address}}</h2>  <!-- {{}}是分隔符(插值語法)  裡面需要是js表示式-->
    </div>
    <script type="text/javascript">
        //修改全域性配置
        Vue.config.productionTip=false;//阻止Vue在啟動時生成生產提示
        //建立Vue例項
        // const x=    Vue實際上是一個建構函式
        new Vue({
            el:'#root', //el用於指定當前Vue例項為哪個容器服務,值通常為css選擇器字串
            data:{ //data中用於儲存資料,資料供el所指定的容器去使用,值我們暫時先寫成一個物件
                name:'hhh',
                school:{
                    name:'法拉希',
                    address: '北京西路',
                }
            }
        });//只傳一個引數——配置物件
        //容器和例項是一一對應的關係
    </script>
</body>
</html>

2. 兩大類模板語法

示例程式碼
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>vue模板語法</title>
    <script type="text/javascript" src="vue.js"></script>
</head>
<body>
<!--
Vue模板語法有2大類:
    1.插值語法:
        功能:用於解析標籤體內容。
        寫法: {{xxx}}, xxx是js表示式,且可以直接讀收到data中的所有屬性。
    2.指令語法:
        功能:用於解析標籤(包括:標籤屬性、標籤體內容、繫結事件.....)。
        舉例: v-bind:href="xxx" 或簡寫為 :href="xxx", xxx同樣要寫js表示式,
        且可以直接讀取到data中的所有屬性。
    備註: Vue中有很多的指令,且形式都是: v-????,此處我們只是拿v-bind舉個例子。
-->
    <div id="root">
        <h1>插值語法</h1>
       <h2>hello {{name}} {{school.address}}</h2>  <!-- {{}}是分隔符(插值語法)  裡面需要是js表示式-->
        <h1>指令語法</h1>
        <a v-bind:href="url">百度</a>  <!--動態繫結  url就變成了js表示式-->
        <a :href="url.toUpperCase()">百度</a>
    </div>
    <script type="text/javascript">
        //修改全域性配置
        Vue.config.productionTip=false;
        //建立Vue例項
        // const x=    Vue實際上是一個建構函式
        new Vue({
            el:'#root', //el用於指定當前Vue例項為哪個容器服務,值通常為css選擇器字串
            data:{ //data中用於儲存資料,資料供el所指定的容器去使用,值我們暫時先寫成一個物件
                name:'hhh',
                url:'http://www.baidu.com',
                school:{
                    name:'法拉希',
                    address: '北京西路',
                }
            }
        });
    </script>
</body>
</html>

3. 資料繫結

示例程式碼
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-model="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>vue2資料繫結</title>
    <script type="text/javascript" src="vue.js"></script>
</head>
<body>
<!--
    Vue中有2種資料繫結的方式:
    1.單向繫結(v-bind):資料只能從data流向頁面。
    2.雙向繫結(v-model):資料不僅能從data流向頁面,還可以從頁面流向data。
    備註:
    1.雙向繫結都應用在表單類元素上(如: input、 select等)
    2.v-model:value可以簡寫為v-model,因為v-model 預設收集的就是value值。
-->
	<div id="root">
        單向資料繫結:<input type="text" v-bind:value="name"><br/>
        雙向資料繫結:<input type="text" v-model:value="address">
<!--    簡寫-->
        單向資料繫結:<input type="text" :value="name"><br/>
        雙向資料繫結:<input type="text" v-model="address">
<!--        v-model只能應運用在表單類元素上(輸入類元素),對value進行修改-->
    </div>
</body>
    <script type="text/javascript">
        Vue.config.productionTip=false;
        new Vue({
            el:'#root',
      	    data:{ 
                name:'hhh',
             	address:'French',
            }
        })
    </script>
</html>

4. el和data的兩種寫法

示例程式碼
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-model="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>vue2資料繫結</title>
    <script type="text/javascript" src="vue.js"></script>
</head>
<body>
<div id="root">
        單向資料繫結:<input type="text" v-bind:value="name"><br/>
        雙向資料繫結:<input type="text" v-model:value="name">
    </div>
</body>
<!--
data與e1的2種寫法
    1.e1有2種寫法
    (1).new Vue時候配置el屬性。
    (2).先建立Vue例項,隨後再通過vm.$mount('#root')指定e1的值。
    2. data有2種寫法
    (1).物件式
    (2).函式式
    如何選擇:目前哪種寫法都可以,以後學習到元件時,data必須使用函式式,否則會報錯
    3.一個重要的原則:
    由Vue管理的函式如data(),一定不要寫箭頭函式,一旦寫了箭頭函式,this就不再是Vue例項了。
-->
    <script type="text/javascript">
        Vue.config.productionTip=false;
        // el的兩種寫法
        const v=new Vue({
            // el:'#root',  //第一種方法
            data:{
                name:'併發地',
            }
        })
        //延時器    例項與容器相配的第二種方法   稱為掛載,會更加靈活一些
        setTimeout(()=>{
            v.$mount('#root'); //成功了,兩秒之後動態
        },2000);
        //data的兩種寫法
        new Vue({
            el:'#root',
            // 第一種方法  物件式
            /*data:{
                name:'併發地',
            }*/
            //第二種方法  函式式  寫成data()也可以
            data:function (){
                console.log('$$',this);
                return{
                    name:'啦啦啦'
                }
            }
        })
    </script>
</html>

5. MVVM模型

  • Model:對應data中的資料

  • View:模板,也就是使用者介面

  • ViewModel:檢視模型,也就是Vue例項物件,模型通過它可以將資料繫結到頁面上,檢視可以通過它將資料對映到模型上。

    MVVM的優點?

    1. 低耦合。檢視(View)可以獨立於Model變化和修改。
    2. 可重用性。你可以把一些檢視邏輯放在一個ViewModel裡面,讓很多view重用這段檢視邏輯。
    3. 前後端分離。開發人員可以專注於業務邏輯(ViewModel)和資料的開發,設計人員可以專注於頁面設計。

    視訊裡的圖示特別清晰明瞭

示例程式碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>MVVM模型</title>
    <script type="text/javascript" src="vue.js"></script>
</head>
<body>
<!--    vm(Vue例項物件)和Vue原型物件上所有的屬性和方法在模板中都能被識別到-->
    <div id="root">
        <h1>{{name}}</h1>
        <h1>{{address}}</h1>
        <h1>測試1{{1+1}}</h1>
        <h1>測試2{{$options}}</h1>
        <h1>測試3{{$emit}}</h1>
        <h1>測試4{{_c}}</h1>
    </div>
</body>
    <script type="text/javascript">
        Vue.config.productionTip=false;
        const vm=new Vue({
            el:'#root',
            data:{
                name:'rered',
                address: 'beijing',
                a:1
            }
        })
    </script>
</html>

6. Object.defineProperty

示例程式碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Object.defindProperty</title>
</head>
<body>
    <script>
        let number=18;
        let person={
            name:'張三',
            sex:'男',
        }
        //給相應物件新增相對屬性
        Object.defineProperty(person,'age',{
            value:18,
            enumerable:true,//控制屬性是否可列舉
            writable:true,//控制屬性是否可被修改,預設為false
            configurable:true,//控制屬性是否可被刪除
            //當讀取person的age屬性時,get函式(getter)就會被呼叫,且返回值就是age的值
            get:function (){
                return number;
            },
            //當修改person的age屬性時,setter就會被呼叫,且會收到修改的具體值
            set(value){
               console.log();
               number=value;
            }
            //雙向繫結的原理,面試常問,類似於java中的類的修改器和訪問器
        });
        console.log(Object.keys(person));
        console.log(person);
    </script>
</body>
</html>

7. 資料代理

示例程式碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>什麼是資料代理</title>
</head>
<body>
<!--
    資料代理:通過一個物件代理對另一個物件中屬性的操作(讀寫)
    比如這裡,obj2可以對obj中的屬性進行操作,即代理
-->
    <script type="text/javascript">
        let obj={x:100};
        let obj2={y:200};
        Object.defineProperty(obj2,'x',{
            get(){
                return obj.x;
            },
            set(value){
                obj.x=value;
            }
        })
    </script>
</body>
</html>
Vue中的資料代理
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue中的資料代理</title>
    <script type="text/javascript" src="vue.js"></script>
</head>
<body>
<!--
    1.Vue中的資料代理:
    通過vm物件來代理data物件中屬性的操作(讀/寫)
    2.Vue中資料代理的好處:
    更加方便的操作data中的資料
    3.基本原理:
    通過0bject.defineProperty()把data物件中所有屬性新增到vm上。
    為每個新增到vm上的屬性,都指定個getter/setter。
    在getter/setter內部去操作(讀/寫) data中對應的屬性。
-->
    <div id="root">
        <h1>{{name}}</h1>
        <h1>{{address}}</h1>
    </div>
</body>
    <script type="text/javascript">
        Vue.config.productionTip=false;
        const vm=new Vue({
            el:'#root',
            data:{
                name:'rered',
                address: 'beijing',
                a:1,
            }
        })
    </script>
</html>

如圖,本來應該寫成{{_data.name}}的形式,但由於有資料代理,於是上面的程式碼中可以直接寫成{{name}}去獲取屬性值,可以看到底下有data中各個屬性的get和set。

8. Vue中的事件

(1)事件處理

示例程式碼
<!DOCTYPE html>
<html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>事件處理</title>
    <script type="text/javascript" src="vue.js"></script>
</head>
<body>
<!--
    事件的基本使用:
    1.使用v-on:xXx或@xx繫結事件,其中xxx是事件名:
    2.事件的回撥需要配置在methods物件中,最終會在vm上;
    3. methods中配置的函式,不要用箭頭函式!否則this就不是vm了,就變成windows了;
    4. methods中配置的函式,都是被Vue所管理的函式,this的指向是vm或元件例項物件;
    5. @click=" demo"和@click= "demo($event)"效果一致, 但後者可以傳參;
    所有被Vue管理的函式儘量寫成普通函式,而不是箭頭函式。
    vm只會為data中的資料做代理,所以回撥函式不要寫到data中,那樣會給vue造成負擔。
-->
    <div id="root">
        <h1>啦啦啦你好!{{name}}</h1>
        <button v-on:click="showInfo1">提示資訊1(不傳參)</button>
        <button @click="showInfo2(66,$event)">提示資訊2(傳參)</button>
    </div>
</body>
    <script type="text/javascript">
        Vue.config.productionTip=false;
        const vm=new Vue({
            el:'#root',
            data:{
                name:'rered',
                address: 'beijing',
                a:1
            },
            //可以配置很多事件的回撥
            methods:{
                //傳了個事件物件
                showInfo1(event){
                    alert('tonxuenihao1');
                    console.log(event.target.innerText);
                    console.log(this);//就是Vue例項物件vm
                },
                showInfo2(number,event){
                    alert('tonxuenihao2');
                    // console.log(event.target.innerText);
                    // console.log(this);//就是Vue例項物件vm
                    console.log(number,event);
                }
            }
        })
    </script>
</html>

(2)事件修飾符

示例程式碼
<!DOCTYPE html>
<html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>事件修飾符</title>
    <script type="text/javascript" src="vue.js"></script>
    <style>
        *{
            margin-top: 20px;
        }
        .demo1{
            height: 50px;
            background-color: skyblue;
        }
        .box1{
            padding: 5px;
            background-color: skyblue;
        }
        .box2{
            padding: 5px;
            background-color: orange;
        }
        .list{
            width: 200px;
            height: 200px;
            background-color: peru;
            overflow: auto;
        }
        li{
            height: 100px;
        }
    </style>
</head>
<body>
<!--
    捕獲由外到內,冒泡由內到外,在冒泡階段處理事件
    Vue中的事件修飾符:
    1.prevent:阻止預設事件(常用) ;
    2.stop:阻止事件冒泡(常用) ;
    3.once: 事件只觸發一次(常用) ;
    4.capture:使用事件的捕獲模式;
    5.self:只有event.target是當前操作的元素時才觸發事件;
    6.passive:事件的預設行為立即執行,無需等待事件回撥執行完畢;
    主要記住前三個,後三個作為拓展
    修飾符可以連續寫,比如@click.prevent.stop
-->
    <div id="root">
        <h1>啦啦啦你好!{{name}}</h1>
<!--        //使用prevent就阻止了預設事件-->
        <a href="http://www.baidu.com" @click.prevent="showInfo">點我提示資訊</a>
<!--        阻止事件冒泡(常用)  stop-->
        <div class="demo1" @click="showInfo">
            <button @click.stop="showInfo">點我冒泡</button>
        </div>
<!--        once: 事件只觸發一次(常用)-->
            <button @click.once="showInfo">點我冒泡</button>
<!--        使用事件的捕獲模式-->
        <div class="box1" @click.capture="showMsg(1)">
            div1
            <div class="box2" @click="showMsg(2)">
                div2
            </div>
        </div>
<!--        只有event.target是當前操作的元素時才觸發事件-->
        <div class="demo1" @click.self="showInfo">
            <button @click="showInfo">點我呀呀呀</button>
        </div>
<!--        事件的預設行為立即執行,無需等待事件回撥執行完畢-->
<!--        滾動有兩個單詞  scroll(滾動條) and wheel(滾輪)-->
        <ul class="list" @wheel="demo">
            <li>1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
        </ul>
    </div>
</body>
    <script type="text/javascript">
        Vue.config.productionTip=false;
        const vm=new Vue({
            el:'#root',
            data:{
                name:'rered',
                address: 'beijing',
                a:1
            },
            methods:{
                showInfo(e){
                    // alert("同學你好!");
                    console.log(e.target);
                },
                showMsg(msg){
                    console.log(msg);
                },
                demo(){
                    console.log('@');
                }
            }
        })
    </script>
</html>

(3)鍵盤事件

示例程式碼
<!DOCTYPE html>
<html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>鍵盤事件</title>
    <script type="text/javascript" src="vue.js"></script>
</head>
<body>
<!--  記住常用的按鍵
    1.Vue中常用的按鍵別名:
        回車=> enter
        刪除
        => delete (捕獲“刪除”和“退格”鍵)
        退出=> esc
        空格=> space
        換行
        => tab   適合keydown
        上=>up
        下=>down
        左=> left
        右=> right
    2.Vue未提供別名的按鍵,可以使用按鍵原始的key值去繫結,但注意要轉為kebab-case(短橫線命名)
    3.系統修飾鍵(用法特殊) : ctrl、alt、 shift、 meta
    (1).配合keyup使用:按下修飾鍵的同時,再按下其他鍵,隨後釋放其他鍵,事件才被觸發。
    (2) .配合keydown使用:正常觸發事件。
    4.也可以使用keyCode去指定具體的按鍵(不推薦)
    5. Vue. config. keyCodes.自定義鍵名=鍵碼,可以去定製按鍵別名
-->
    <div id="root">
        <h1>啦啦啦你好!{{name}}</h1>
        <input type="text" placeholder="回車提示輸入" @keyup="showInfo">
    </div>
</body>
    <script type="text/javascript">
        Vue.config.productionTip=false;
        Vue.config.keyCodes.huiche=13;//相當於定義了回車的別名
        const vm=new Vue({
            el:'#root',
            data:{
                name:'rered',
                address: 'beijing',
                a:1
            },
            methods:{
                showInfo(e){
                    console.log(e.key,e.keyCode);
                    //可以加個判斷是否是回車按鍵再進行輸出,或者在前面@keyup.enter
                    if(e.keyCode!==13)
                        return ;
                    console.log(e.target.value);
                },
            }
        })
    </script>
</html>