1. 程式人生 > >vue初學:基礎概念

vue初學:基礎概念

一、vue使用步驟:
  1.引包vue.js
  2.html中寫要操作的DOM節點
  3.建立vue物件:new Vue({options});
  4.配置options:el:(要操作的物件,用選擇器,同jquery),
        emplate:(模板,指定要插入的內容:{{插值表示式}},注:必須只有一個根節點),
        data(function(){return key:emplate中要操作的資料}),
        methods:{函式名:function(){函式體,(this.xxx呼叫data中定義的資料)(this.xxxMethods呼叫methods中的方法)}}
        components:{'在emplate中要使用的標籤名':要宣告的子元件名}

二、vue基礎概念:


  1.插值表示式可以是:data中定義的資料;{{ '字串' }};三元表示式;布林值;物件{{ {key:value} }}
  2.指令:形如"v-xxx",用於更簡便的操作頁面和資料。

三、 常用vue指令:
  1.v-text
  2.v-html
  3.v-if
  4.v-else-if
  5.v-else
  6.v-show
  7.v-bind 給屬性繫結值,語法:v-bind:屬性名="常量||變數名"(常量要寫引號),簡寫 :屬性名="常量||變數名"
  8.v-on 繫結事件 語法:v-on:事件名="函式名||表示式",簡寫 @事件名="函式名||表示式"
  9.v-if和v-show的區別:
    v-if和v-show都是用來控制元素的渲染。v-if判斷是否載入,可以減輕伺服器的壓力,在需要時載入,但有更高的切換開銷;v-show調整DOM元素的CSS的dispaly屬性,可以使客戶端操作更加流暢,但有更高的初始渲染開銷。如果需要非常頻繁地切換,則使用 v-show 較好;如果在執行時條件很少改變,則使用 v-if 較好。
  10.v-bind和v-model區別:
    v-bind可設定所有屬性的屬性值,但只能單向讀取vue中的資料;
    v-model只可設定value屬性值,屬於雙向資料流
  11.v-for 遍歷陣列或物件,語法:v-for="item in arr/obj"
    擴充套件知識點:
    陣列:v-for="(item,index) in arr"
    物件:v-for="(value,key,index) in obj"

  附demo:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>vue第一個頁面</title>
        <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
        <style>
            .a{
                background-color
: #ccc; } .b{ background-color: pink; } </style> </head> <body> <div id="zl"></div> <script type="text/javascript"> new Vue({ el : "#zl", template : `<div> <div v-text="myText"></div> <hr/> <div v-html="myHtml"></div> <h4 v-if="isExit">v-if控制是否存在</h4> <h4 v-show="isShow">v-show控制是否顯示</h4> <!-- 以下三個指令,需結合使用 --> <button v-if="num == 1" >測試v-if</button> <button v-else-if="num == 2" >測試v-else-if</button> <button v-else >測試v-else</button> <input type="text" v-bind:value="myBind" :file=" 'XXX' "></input> <button v-on:click="myBind='aaa'">用v-on修改vue中資料</button> <button @click="myBind='bbb'">用v-on簡寫修改vue中資料</button> <!-- 雙向繫結 --> <hr/> <i>當用戶輸入“同意”時顯示按鈕:</i> <input type="text" v-model="myModel"/> <button type="submit" v-show="myModel=='同意' ">提交</button> <!-- v-for --> <hr/> <ul> <li v-for="item in stud" :class="item.class">{{item.name}}</li> </ul> <!-- methods --> <button v-on:click="toggleCont">{{name}}</button> <!-- 可縮寫為@:click --> </div>`, data : function(){ return { name : "點我!", myText : "<h1>我是myText的內容</h1>", myHtml : "<h1>我是myHtml的內容</h1>", isExit : true, isShow : true, num : 4, myBind : "v-bind測試", myModel : "v-model測試", stud : [{name:'張三',class:'a'},{name:'李四',class:'b'},{name:'王五',class:'a'}] } }, methods : { toggleCont : function(){ this.name = "聽話" } } }); </script> </body> </html>

 


四、元件化:
  1.區域性元件使用步驟:1.建立子---2.宣告子---3.使用子
    建立子元件:var 子元件名稱(首字母大寫)={
            template:'子模板'.....跟new Vue(){}中的內容一樣
          }
    父元件components中宣告子元件:components:{'在emplate中要使用的標籤名':要宣告的子元件名}
    父元件template中使用子元件:template:'<標籤名></標籤名>'
  2.註冊全域性元件步驟:Vue.component('元件名',{.....})

五、 父元件向子元件傳遞資料:
  步驟:1.父傳資料(屬性)---2.宣告資料---3.使用資料
    父元件template中,用v-bind將要傳遞的資料繫結到子元件標籤屬性中;
    子元件中props:['屬性名']宣告此資料;
    子元件template中{{屬性名}}使用此資料

附demo:(用的Hbuild對es6的支援不是特別好,字串拼接,忍。。。)

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>vue元件練習</title>
        <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <div id="app"></div>
        <script type="text/javascript">
            //註冊全域性元件
            Vue.component('my-btn',{
                template : '<button style="background-color:red;color:#fff;">紅色的按鈕</button>'
            })
            //區域性子元件
            var Mytop = {
                data : function(){
                    return {
                        myText : '<i>測試v-text</i>',
                        myHtml : '<i>測試v-html</i>',
                        myValue : '單/雙向資料流...',
                        stud : {
                            name : 'jack',
                            sex : '',
                            age : '26'    
                        },
                        studs : ['張三','李四','王五']
                    }
                },
                props : ['myTest'],
                template : '<div><h5>我是頭部</h5>'+'<p v-text="myText"></p>'+
                        '<p v-html="myHtml"></p>'+'<p v-if=""></p><hr/>'+
                        '單向v-bind:<input type="text" :value="myValue"/>'+
                        '雙向v-model:<input type="text" v-model="myValue">'+
                        '<p>這裡輸出v-model中雙向繫結的資料:{{myValue}}</p><hr/>'+
                        'v-for迴圈物件:<ul><li v-for="(val,key,i) in stud">{{key}}:{{val}}:{{i}}</li></ul>'+
                        'v-for迴圈陣列:<ul><li v-for="item in studs">{{item}}</li></ul><hr/>'+
                        '<b>接收到父元件的資料為:{{myTest}}</b><hr/>'+
                        '<my-btn/></div>'
                        
            }
            var Mybody = {
                data : function(){
                    return {
                        isShow : true,
                        isExit : true
                    }
                },
                template : '<div><p v-show="isShow">我是中部v-show測試</p>'+
                        '<p v-if="isExit">v-if測試</p>'+
                        '<button @click="myToggle">點我顯示或隱藏</button>'+
                        '<my-btn/></div>',
                methods : {
                    myToggle : function(){
                        this.isShow = !this.isShow;
                        this.isExit = !this.isExit;
                    }
                }
            }
            //入口元件
            var App = {
                components : {
                    'mytop' : Mytop,
                    'mybody' : Mybody,
                    
                },
                data : function(){
                    return {
                        'myTest' : '我是父向子傳遞的資料'
                    }
                },
                template : '<div><h3>我是入口</h3>'+'<mytop :myTest="myTest"></mytop>'+'<mybody/>'+
                        '<my-btn/></div>',
            }
            new Vue({
                el : "#app",
                components : {
                    'app' : App
                },
                template : '<app/>'
            })
        </script>
    </body>
</html>

 


六、 過濾器filter||filters:
  作用:用於A資料到B資料的產出
  區域性過濾器filters:
    1.在區域性元件中定義filters:{'過濾器名',function(原資料形參,引數1){....return...}}
    2.使用:template中資料輸出:{{原資料實參(指明針對誰進行操作) | 過濾器名(實參1)}}
  全域性過濾器filter:
    1.Vue.filter('過濾器名',function(引數){...})
    2.使用與區域性過濾器相同

附demo:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>過濾器filter || filters</title>
        <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <div id="app">
            
        </div>
        <script type="text/javascript">
            Vue.filter('myTest',function(data){
                return '我是全域性過濾器的內容,'+data;
            })
            var App = {
                template :'<div><h5>請輸入內容,檢視內容是否被反轉:</h5>'+
                    '<input type="text" v-model="myText"/><p>{{myText | reverse("英文版")}}</p><hr/>'+
                    '<h5>全域性過濾器:</h5><p>{{mydata | myTest}}</p></div>',
                data : function(){
                    return {
                        myText : '',
                        mydata : '123'
                    }
                },
                filters : {
                    reverse : function(str,lang){
                        return lang + ":" + str.split('').reverse().join('');
                    }
                }
            }
            new Vue({
                el : "#app",
                components : {
                    'app' : App
                },
                template : '<app/>'
            })
        </script>
    </body>
</html>

 


七、watch監視器:
  基本資料型別簡單監視,複雜資料型別(obj/arr)深度監視
  用法:watch : {
      要監視的data資料 : function(newV,oldV){...},
      要監視的obj/arr資料 : {
        deep : true,
        handler : function(newV,oldV){...}
      }
    }

附demo:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>監視watch</title>
        <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <div id="app">
            
        </div>
        <script type="text/javascript">
            var App = {
                data : function(){
                    return {
                        myText : '111',
                        stus : [{name : 'jack'}]
                    }
                },
                template : '<div><input type="text" v-model="myText" />'+
                            '<button @click="stus[0].name= \'rose\' ">深度監視stus[0].name</button></div>',
                watch : {
                    myText : function(newV,oldV){
                        if(newV == 'I love you'){
                            alert(oldV + ' too');
                        }
                    },
                    stus : {
                        deep : true,//深度監視
                        handler : function(newV,oldV){
                            console.log('監控成功');
                        }
                    }    
                }
            }
            new Vue({
                el : '#app',
                components : {
                    'app' : App
                },
                template : '<app/>'
            })
        </script>
    </body>
</html>

 


八、computed群體監視器:
  用法:computed : {
      監視器名稱 : function(){//(監視器名稱接收此函式return出去的資料)
        return this.xxx;//(this.xxx為本元件中data定義的資料)
      }
    }

附demo:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8" />
 5         <meta name="viewport" content="width=device-width, initial-scale=1">
 6         <title>computed群體監視</title>
 7         <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
 8     </head>
 9     <body>
10         <div id="app">
11             
12         </div>
13         <script type="text/javascript">
14             var App = {
15                 data : function(){
16                     return {
17                         value01 : 0,
18                         value02 : 0,
19                         rate : 0
20                     }
21                 },
22                 template : '<div><p>計算(a+b)*c的值:</p>a:<input type="text" v-model="value01"/>'+
23                 'b:<input type="text" v-model="value02"/><br/>c:<input type="text" v-model="rate"/>'+
24                 '<p>{{result}}</p></div>',
25                 computed : {
26                     result : function(){
27                         return (parseFloat(this.value01)+parseFloat(this.value02))*parseFloat(this.rate);
28                     }
29                 }
30             }
31             new Vue({
32                 el : '#app',
33                 components : {
34                     'app' : App
35                 },
36                 template : '<app/>'
37                 
38             })
39         </script>
40     </body>
41 </html>

 


九、 watch和v-model的區別
  v-model : 只用於對資料的雙向繫結及展示。是對單個數據的監視
  watch : 可用於對資料的雙向繫結、展示,以及一些複雜的行為。也是對單個數據的監視
  computed : 用於群體監視

十、內建元件slot:

  父元件傳遞的DOM結構 

附demo:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8" />
 5         <meta name="viewport" content="width=device-width, initial-scale=1">
 6         <title>slot內建元件</title>
 7         <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
 8         <style type="text/css">
 9             li {
10                 list-style: none;
11                 float: left;
12                 width: 33%;
13                 height: 50px;
14                 background-color: aqua;
15                 border: 1px solid black;
16             }
17         </style>
18     </head>
19     <body>
20         <div id="app"></div>
21         <script type="text/javascript">
22             Vue.component('myLi',{
23                 template : '<li><slot></slot></li>'
24             })
25             var App = {
26                 template : '<div><ul><myLi><h4>111</h4></myLi>'+
27                     '<myLi><button>222</button><b>222</b></myLi>'+
28                     '<myLi><input type="text" value="333"/></myLi>'+
29                     '<myLi>444</myLi><myLi>555</myLi><myLi>666</myLi>'+
30                     '<myLi>777</myLi><myLi>888</myLi><myLi>999</myLi></ul></div>'
31             }
32             new Vue({
33                 el : '#app',
34                 components : {
35                     'app' : App
36                 },
37                 template : '<app/>'
38             })
39         </script>
40     </body>
41 </html>

 

十一、元件生命週期:
  beforeCreate : 元件建立之前(不可獲取到元件中的資料)
  created : 元件建立之後
  beforeMount : vue啟動前的DOM
  mounted : vue啟動後的DOM
  //beforeUpdate/updated在DOM發生更新時才會被觸發
  beforeUpdate : 更新前DOM
  updated : 更新後DOM
  beforeDestory : 本元件銷燬之前
  destroyed : 本元件銷燬之後
  //對於元件的頻繁建立和銷燬是不對的,內建元件<keep-alive></keep-alive>包裹後的v-if表示啟用或停用該元件
  alivated : 元件被啟用
  dealivated : 元件被停用
附demo:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>元件生命週期</title>
        <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
        <script src="js/元件生命週期.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <div id="app">
            
        </div>
    </body>
</html>
 1 window.onload = function(){
 2     var MyTest = {
 3         data : function(){
 4             return {
 5                 myText : '111'
 6             }
 7         },
 8         template : '<h3>{{myText}}</h3>'
 9     }
10     var App = {
11         data : function(){
12             return {
13                 myText : 'aaa',
14                 isExit : true
15             }
16         },
17         components : {
18             'myTest' : MyTest
19         },
20         template : '<div><h5>{{myText}}</h5><button @click="myText+=1 ">更改DOM資料</button>'+
21             '<hr/><myTest v-if="isExit"></myTest><button @click="isExit = !isExit">建立及銷燬MyTest子元件</button></div>',
22         beforeCreate : function(){
23             //元件建立之前
24             console.log(this.myText);
25         },
26         created : function(){
27             //元件建立之後
28             console.log(this.myText);
29         },
30         beforeMount : function(){
31             //vue啟動前的DOM
32             console.log(document.body.innerHTML);
33         },
34         mounted : function(){
35             //vue啟動後的DOM
36             console.log(document.body.innerHTML);
37         },
38         //beforeUpdate/updated在DOM發生更新時才會被觸發
39         beforeUpdate : function(){
40             //更新前DOM
41             console.log(document.body.innerHTML);
42         },
43         updated : function(){
44             //更新後DOM
45             console.log(document.body.innerHTML);
46         }
47     }
48     new Vue({
49         el : '#app',
50         components : {
51             'app' : App
52         },
53         template : '<app/>'
54     })
55 }