Vue 基礎(二)

一.Vue實例

  • vue項目就是很多個小組件組成的,也可以說是很多vue實例組成的
  • 每個組件就是一個vue實例,實例有很多屬性和方法
<body>
       <div id="app">
           {{content}}
       </div>

       <script>
           var vm = new Vue({
               el:"#app",
               data:{
                   content:"hello vue"
               }
           })
       </script>
</body>
  • 實例屬性
    在這裏插入圖片描述
  • 實例方法
    在這裏插入圖片描述

二.Vue生命週期鉤子

  • 生命週期函數就是vue實例在某一時間點會自動執行的函數
    在這裏插入圖片描述
 	   <div id="app">
           {{content}}
       </div>

       <script>
           var vm = new Vue({
               el:"#app",
               data:{
                   content:"hello vue"
               },
               beforeCreate:function () {
                   console.log("beforeCreate")
               },
               created:function () {
                   console.log("created")
               },
               beforeMount:function () {
                   console.log("beforeMount")
               },
               mounted:function () {
                   console.log("mounted")
               },
               beforeUpdate:function () {
                   console.log("beforeUpdate")
               },
               updated:function () {
                   console.log("updated")
               },
               beforeDestroy:function () {
                   console.log("beforeDestroy")
               },
               destroyed:function () {
                   console.log("destroyed")
               }

           })
       </script>

在這裏插入圖片描述

  • 初始化事件和相關生命週期內容 調用beforeCreate
  • 初始化注入或者相關綁定 調用Created
  • 是否有el 是否有template屬性
  • 如果沒有template 把el外層的html當做模板
  • 有就渲染模板
    在這裏插入圖片描述
  • 模板數據相結合 掛載頁面一瞬間之前執行調用beforeMount
  • 掛載頁面上 hello world顯示在頁面上,mounted函數執行
  • 簡單來說就是beforeMount執行頁面還沒渲染 而mounted執行時頁面已經渲染完成了
 <div id="app">
       </div>

       <script>
           var vm = new Vue({
               el:"#app",
               template:"<div>hello vue</div>",
               data:{
                   content:"hello vue"
               },
               beforeCreate:function () {
                   console.log("beforeCreate")
               },
               created:function () {
                   console.log("created")
               },
               beforeMount:function () {
                   console.log(this.$el)
                   console.log("beforeMount")
               },
               mounted:function () {
                   console.log(this.$el)
                   console.log("mounted")
               },
               beforeUpdate:function () {
                   console.log("beforeUpdate")
               },
               updated:function () {
                   console.log("updated")
               },
               beforeDestroy:function () {
                   console.log("beforeDestroy")
               },
               destroyed:function () {
                   console.log("destroyed")
               }

           })
       </script>

  • 數據改變才執行(beforeUpdate、Updated)
  • 數據改變沒重新渲染執行beforeUpdate,重新渲染執行Updated
 <div id="app">
           {{content}}
       </div>

       <script>
           var vm = new Vue({
               el:"#app",
               data:{
                   content:"hello vue"
               },
               beforeCreate:function () {
                   console.log("beforeCreate")
               },
               created:function () {
                   console.log("created")
               },
               beforeMount:function () {
                   console.log(this.$el)
                   console.log("beforeMount")
               },
               mounted:function () {
                   console.log(this.$el)
                   console.log("mounted")
               },
               beforeUpdate:function () {
                   console.log("beforeUpdate")
               },
               updated:function () {
                   console.log("updated")
               },
               beforeDestroy:function () {
                   console.log("beforeDestroy")
               },
               destroyed:function () {
                   console.log("destroyed")
               }

           })
       </script>

在這裏插入圖片描述

  • 銷燬組件纔會調用最後兩個方法
  • 組件即將要被銷燬執行beforeDestroy 完全銷燬了執行destroyed
    在這裏插入圖片描述
    一共11個生命週期函數 還有3個以後再說了
    在這裏插入圖片描述

三.Vue模板語法

1.插值表達式

<div id="app">
           {{content}}
       </div>

       <script>
           var vm = new Vue({
               el:"#app",
               data:{
                   content:"hello vue"
               }
           })
       </script>

2.v-text

  • 將div中的innerText 變成name數據的內容
<div id="app">
            <div>{{content}}</div>
           <div v-text="name"></div>
       </div>

       <script>
           var vm = new Vue({
               el:"#app",
               data:{
                   content:"hello vue",
                   name:"shang"
               }
           })
       </script>

3.v-html

  • 將div中的innerHtml和name數據做綁定
 <div id="app">
            <div>{{content}}</div>
           <div v-text="name"></div>
           <div v-html="name"></div>
       </div>

       <script>
           var vm = new Vue({
               el:"#app",
               data:{
                   content:"hello vue",
                   name:"shang"
               }
           })
       </script>

4.插值表達式、v-text、v-html區別

  • 插值表達式和v-text做了轉義,而v-html沒有
    <div id="app">
            <div>{{content}}</div>
           <div v-text="name"></div>
           <div v-html="name"></div>
       </div>

       <script>
           var vm = new Vue({
               el:"#app",
               data:{
                   content:"<h1>hello vue</h1>",
                   name:"<h1>shang</h1>"
               }
           })
       </script>

在這裏插入圖片描述

5.使用JavaScript表達式

  • 實際上,對於所有的數據綁定,vue都提供了完全的 JavaScript 表達式支持
 <div id="app">
            <div>{{content + ' vue'}}</div>
           <div v-text="name + ' qian'"></div>
           <div v-html="name + ' qian'"></div>
           <div>{{ok?'Yes':'No'}}</div>
       </div>

       <script>
           var vm = new Vue({
               el:"#app",
               data:{
                   content:"hello",
                   name:"shang",
                   ok:true
               }
           })
       </script>

在這裏插入圖片描述

四.計算屬性,方法和偵聽器(***)

  • 拼接兩個字符串 可以用以下方法顯示
  • 但是代碼上就有了邏輯 不想在html中出現邏輯怎麼辦?
 <div id="app">
            <div>{{firstName+' '+lastName}}</div>
       </div>

       <script>
           var vm = new Vue({
               el:"#app",
               data:{
                   firstName:"shangqian",
                   lastName:"zhushang"
               }
           })
       </script>

1.計算屬性

  • fullName這個屬性是通過計算得來的
   <div id="app">
            <div>{{fullName}}</div>
       </div>

       <script>
           var vm = new Vue({
               el:"#app",
               data:{
                   firstName:"shangqian",
                   lastName:"zhushang"
               },
               //計算屬性
               computed:{
                   fullName:function(){
                       return this.firstName + " " + this.lastName
                   }
               }
           })
       </script>
  • 計算屬性內置緩存
  • 當依賴變量(firstName+lastName)沒有發生改變時 計算屬性不會在重新計算
<div id="app">
            <div>{{fullName}}</div>
           <div>{{age}}</div>
       </div>

       <script>
           var vm = new Vue({
               el:"#app",
               data:{
                   firstName:"shangqian",
                   lastName:"zhushang",
                   age:28
               },
               computed:{
                   fullName:function(){
                       console.log("計算了一次")
                       return this.firstName + " " + this.lastName
                   }
               }
           })
       </script>

在這裏插入圖片描述

2.方法

  • 方法形式也可以實現同樣功能 不如計算屬性有效 沒有緩存
<div id="app">
            <div>{{fullName()}}</div>
           <div>{{age}}</div>
       </div>

       <script>
           var vm = new Vue({
               el:"#app",
               data:{
                   firstName:"shangqian",
                   lastName:"zhushang",
                   age:28
               },
               computed:{
                   fullName:function(){
                       console.log("計算了一次")
                       return this.firstName + " " + this.lastName
                   }
               },
               methods:{
                   fullName:function(){
                       console.log("計算了一次")
                       return this.firstName + " " + this.lastName
                   }
               }
           })
       </script>

在這裏插入圖片描述

3.偵聽器

  • 偵聽firstName和lastName的變化
  <div id="app">
            <div>{{fullName}}</div>
           <div>{{age}}</div>
       </div>

       <script>
           var vm = new Vue({
               el:"#app",
               data:{
                   firstName:"shangqian",
                   lastName:"zhushang",
                   fullName:"shangqian zhushang",
                   age:28
               },
               watch:{
                   firstName:function () {
                       console.log("計算了一次")
                       this.fullName = this.firstName + " " + this.lastName
                   },
                   lastName:function () {
                       console.log("計算了一次")
                       this.fullName = this.firstName + " " + this.lastName
                   }
               }
           })
       </script>

在這裏插入圖片描述

  • 雖然也有緩存 依賴變量沒有變化 就不會重新渲染
  • 但是watch語法太複雜了,所以優先用計算屬性 因爲它語法簡單

五.計算屬性的setter和getter

  • 把屬性寫成一個對象
  • 插值表達式讀取計算屬性內容時 就會走get方法 和剛纔寫法是一樣的
  • 簡單來說就是,設置值執行set,獲取值執行get
  <div id="app">
            <div>{{fullName}}</div>
       </div>

       <script>
           var vm = new Vue({
               el:"#app",
               data:{
                   firstName:"shangqian",
                   lastName:"zhushang",
               },
               computed:{
                   fullName:{
                       get:function(){
                             return this.firstName + " " + this.lastName
                       },
                       set:function (value) {
                           console.log(value)
                       }
                   }
               }
           })
       </script>

在這裏插入圖片描述

  • 通過setter改變firstName和lastName的值
<div id="app">
            <div>{{fullName}}</div>
       </div>

       <script>
           var vm = new Vue({
               el:"#app",
               data:{
                   firstName:"shangqian",
                   lastName:"zhushang",
               },
               computed:{
                   fullName:{
                       get:function(){
                             return this.firstName + " " + this.lastName
                       },
                       set:function (value) {
                           console.log(value)
                           var arr = value.split(" ");
                           this.firstName = arr[0];
                           this.lastName = arr[1];
                       }
                   }
               }
           })
       </script>
  • Computed是依賴值變化才重新計算
  • Get 通過其他值算出一個新值
  • Set 通過設置值改變關聯值 關聯值改變又會改變fullName值重新計算 頁面又會重新變化內容

六.Vue中的樣式綁定

1.綁定 HTML Class

  • 綁定對象
  • div綁定了一個class 名爲activated ,顯示不顯示取決於後邊的isActivated的值是true還是false
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="../vue.js"></script>
    <style>
        .activated{
            color:red
        }
    </style>
</head>
<body>
        <div id="app">
            <div @click="handleDivClick" :class="{activated: isActivated}">hello vue</div>
        </div>
        <script>
          var vm = new Vue({
              el:"#app",
              data:{
                  isActivated:false
              },
              methods:{
                  handleDivClick:function () {
                      this.isActivated = !this.isActivated
                  }
              }
          })
        </script>
</body>
  • 綁定數組
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="../vue.js"></script>
    <style>
        .activated{
            color:red
        }
    </style>
</head>
<body>
        <div id="app">
            <div @click="handleDivClick" :class="[activated]">hello vue</div>
        </div>
        <script>
          var vm = new Vue({
              el:"#app",
              data:{
                  activated:""
              },
              methods:{
                  handleDivClick:function () {
                      this.activated = this.activated === "activated"? "":"activated"
                  }
              }
          })
        </script>
</body>

2.綁定內聯樣式

  • 綁定對象
  <div id="app">
            <div @click="handleDivClick" :style="styleObj">hello vue</div>
        </div>
        <script>
          var vm = new Vue({
              el:"#app",
              data:{
                  styleObj:{
                      color:"black"
                  }
              },
              methods:{
                  handleDivClick:function () {
                      this.styleObj.color = this.styleObj.color === "black"?"red":"black"
                  }
              }
          })
        </script>
  • 綁定數組
  • 再添加一個屬性
  <div id="app">
            <div @click="handleDivClick" :style="[styleObj,{fontSize:'20px'}]">hello vue</div>
        </div>
        <script>
          var vm = new Vue({
              el:"#app",
              data:{
                  styleObj:{
                      color:"black"
                  }
              },
              methods:{
                  handleDivClick:function () {
                      this.styleObj.color = this.styleObj.color === "black"?"red":"black"
                  }
              }
          })
        </script>

七.Vue中的條件渲染

  • v-if、v-else-if、v-else

1.v-if與v-show區別

  <div id="app">
                <div v-if="show">{{content}}</div>
                <div v-show="show">hello vue</div>
            </div>
        <script>
            var vm = new Vue({
                el:"#app",
                data:{
                    show:false,
                    content:"hello world"
                }
        
            })
        </script>

在這裏插入圖片描述

  • v-show指令是已經渲染到頁面上的了,display設置爲none的緣故
  • v-if 表達式爲false 壓根不存在
  • 經常改變標籤存在不存在用v-show效率更高

2.v-if、v-else、v-else-if

  • 注意使用一定要連在一起,中間隔開會報錯
   <div id="app">
                <div v-if="show === 'a'">{{content+' a'}}</div>
                <div v-else-if="show === 'b' ">{{content+' b'}}</div>
                <div v-else>{{content+' c'}}</div>
            </div>
        <script>
            var vm = new Vue({
                el:"#app",
                data:{
                    show:'a',
                    content:"hello world"
                }

            })
        </script>

3.指定key值

  • 如下代碼中
  • 在郵箱input框輸入 再設置vm.show爲true 會發現用戶名input框自動填充了郵箱input框中的數據
     <div id="app">
                <div v-if="show">
                    用戶名:<input>
                </div>
                <div v-else>
                    郵箱:<input>
                </div>
            </div>
        <script>
            var vm = new Vue({
                el:"#app",
                data:{
                    show:false,
                    content:"hello world"
                }

            })
        </script>
  • Vue在重新渲染頁面時 會盡量去複用頁面上已經存在的dom
  • 去設置key值就可以避免 兩個key值不一樣vue就不會去複用
   <div id="app">
                <div v-if="show">
                    用戶名:<input key="username">
                </div>
                <div v-else>
                    郵箱:<input key="password">
                </div>
            </div>
        <script>
            var vm = new Vue({
                el:"#app",
                data:{
                    show:false,
                    content:"hello world"
                }

            })
        </script>

八.Vue中的列表渲染

 <div id="app">
            <div v-for="(item,index) of list">
                {{item}}--{{index}}
            </div>
        </div>
        <script>
            var vm = new Vue({
                el:"#app",
                data:{
                    list:[
                        "shang",
                        "qian",
                        "zhu",
                        "shang",
                        "haha"
                    ]
                }

            })
        </script>
  • 爲了提升循環顯示性能 每個循環項上加上唯一key值
    在這裏插入圖片描述
  • 不推薦用下標值,頻繁操作dom元素,還是費性能,這樣沒法複用dom節點
  • 後端返回前端數據,返回唯一的數據標識符id(如下情況)
   <div id="app">
            <div v-for="(item,index) of list" :key="item.id">
                {{item.text}}--{{index}}
            </div>
        </div>
        <script>
            var vm = new Vue({
                el:"#app",
                data:{
                    list:[
                        {
                            id:"101010101",
                            text:"haha"
                        },
                        {
                            id:"101010102",
                            text:"hehe"
                        },
                        {
                            id:"101010103",
                            text:"shangqian"
                        },
                        {
                            id:"101010104",
                            text:"shangzhu"
                        }
                    ]
                }

            })
        </script>
  • 修改數組內容時 ,不能通過下標的形式,只能通過方法(push、pop、shift、unshift、splice、sort、reverse)
  • 從下標1開始 刪除1條 添加一條新數據(splice方法)
  • 數據變化 頁面也變化了

在這裏插入圖片描述

  • 除了這幾個方法 還可以改變引用
  • 這裏就是List引用
  • 頁面也會隨着變化
    在這裏插入圖片描述
  • 如果想在這裏循環兩次(寫兩次循環有點不靠譜),還有什麼方法嘛?
    在這裏插入圖片描述
  • 可以外層加一個div
 <div id="app">
            <div v-for="(item,index) of list" :key="item.id">
            <div>
                {{item.text}}--{{index}}
            </div>
            <span>
                {{item.text}}--{{index}}
            </span>
            </div>
        </div>

在這裏插入圖片描述

  • 不想讓外層div出現 怎麼辦?
 <div id="app">
            <template v-for="(item,index) of list" :key="item.id">
            <div>
                {{item.text}}--{{index}}
            </div>
            <span>
                {{item.text}}--{{index}}
            </span>
            </template>
        </div>

在這裏插入圖片描述

  • 對象循環
 <div id="app">
            <div v-for="(item,key,index) of userInfo">
                  {{item}} ---- {{key}} ---- {{index}}
            </div>
        </div>
        <script>
            var vm = new Vue({
                el:"#app",
                data:{
                    userInfo:{
                        name:"shangqianzhushang",
                        age:18,
                        gender:"male"
                    }
                }

            })
        </script>

在這裏插入圖片描述

  • 數據改變 頁面就變
  • 添加數據 頁面沒變
  • 動態對象中加數據是不好用的,可以直接改引用

在這裏插入圖片描述

九.Vue中的set方法

  • Set方法是全局方法也是一個實例方法
  • 對象添加屬性
    在這裏插入圖片描述
  • 數組添加屬性
<div id="app">
            <div v-for="(item,index) of list">
                  {{item}} ---- {{index}}
            </div>
        </div>
        <script>
            var vm = new Vue({
                el:"#app",
                data:{
                    list:[1,2,3,4,5]
                }

            })
        </script>

在這裏插入圖片描述
總結:
數組有三種添加方式:方法、引用、set方法
對象又兩種添加方式:引用、set方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章