Vue筆記整理從0開始-Day2

一.品牌案例

首先是品牌案例出手,鞏固之前的知識點,順便回顧下基本的Js方法,這裏不使用css樣式,就最基本的html表格展示:

在這裏插入圖片描述
直接上代碼:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<style>
    [v-cloak] {				//用於渲染數據完成後展示
        display: none
    }
</style>

<body>
    <div id="app">
        id:<input value="id" v-model="id"><br>			//輸入框綁定data中的id
        name:<input value="name" v-model="name">		//name綁定車的姓名
        <button @click="addCar">添加</button>			//添加方法
        <br>
        搜索名稱關鍵字:<input v-model="keyword">		//綁定關鍵字
        <table style="border:1px solid black">				//table展示
            <tr>																	//表頭
                <td>id</td>
                <td>品牌名稱</td>
                <td>添加時間</td>
                <td>操作</td>
            </tr>
             <tr v-for="(item,i) in search(keyword)" :key="item.id">			//從search返回的List遍歷取值並展示,同時使用:key綁定對應的值
                <td>{{item.id}}</td>					
                <td>{{item.name}}</td>
                <td>{{item.time}}</td>
                <td @click="deleteByIndex(i)"><button>刪除</button></td>		//傳對應的索引,根據索引刪值
            </tr>

        </table>

    </div>

    <script type="text/javascript">
        var app = new Vue({
            el: "#app",
            data: {
                id: '',				//新增id
                name: '',		//新增name
                keyword: '',		//關鍵字搜索
                car: "  ",			//新增車輛對象
                cars: [{				//默認展示的對象數組
                    id: 1,
                    name: '寶馬',
                    time: new Date()
                }, {
                    id: 2,
                    name: '奔馳',
                    time: new Date()
                }],
                
            },
            methods: {
                addCar() {				//新增車輛,獲取到輸入的id和name,並Push到this.cars即可,同時清空id和name
                    this.car = {
                        id: this.id,
                        name: this.name,
                        time: new Date
                    }
                    this.cars.push(this.car)
                    this.id = this.name = null
                },
                deleteByIndex(index) {				//根據索引刪除對應的內容
                    this.cars.splice(index, 1)
                },
                search(keyword){					//根據關鍵字搜索,這裏使用foreach,js的字符串查詢,indexOf,如果=-1則沒有該字符串	
       //方法1:      let  tempList=[]
                    // this.cars.forEach(item => {
                    //     if(item.name.indexOf(keyword) != -1){
                    //         tempList.push(item)
                    //     }
                  
                    // })
                    // return tempList

        //方法2:    
                    let tempList = this.cars.filter(item=>{		//es6的新特性filter,用來過濾生成新數組並返回tempList,使用includes方法判斷是否包含
                        if(item.name.includes(keyword)){
                            return item
                        }})
                        return tempList
                }
            }
        })
    </script>
</body>

</html>

說明: 一些Es6的新特性
//forEach:沒辦法停止遍歷,全部都遍歷結束
//some:可以提前終止
//filter:過濾,篩選符合條件的數據
//findIndex:查找下標


過濾器

過濾器的使用:mustache和v-bind兩種指定才能使用過濾器,其他的不能使用過濾器
過濾器的定義: 並且可以有多個過濾器,內容依次往後傳遞

		//data永遠都是過濾器使用傳遞過來的值
         app.filter('過濾器的名稱',function(data,arg1,arg2){
                return data+'123'+arg1+arg2
            })
        //過濾器的使用,可以傳多個參數
        {{name|namenpe(arg1,arg2)}}    

配合全局時間過濾器的使用:

 Vue.filter('dateFormat',function(data,type='yyyy-mm-dd'){					//獲取時間並判斷轉換日期格式,可以用戶自定義
            var dt = new Date(data)									//轉換時間
            var y = dt.getFullYear										//年
               var m = dt.getMonth +1								//月
               var d = dt.getDate										//日
            if(type.toLowerCase()=='yyyy-mm-dd hh:mm:dd'){		//大小寫轉換          
               var h = dt.getHours										//時
               var mm = dt.getMinutes									//分
               var ss = dt.getSeconds									//秒
                return `${y}-${m}-${d}-${h}:${mm}:${ss}`			//return格式
            }else{	
               return `${y}-${m}-${d}`
            }
            })

全局過濾器:所有的vm實例都能共享,比如多個app,對應多個vm,那麼都能共享。私有過濾器:在當前的vm中定義私有過濾器:如果同名,那麼有限調用私有過濾器,就近原則:

<script type="text/javascript">
        var app = new Vue({
            el: "#app",
            data: {
              
            },
           
            methods: {
               
            },
            filters:{
                dataFormat(dateStr,pattern){
                    //局部過濾器1    過濾器調用的時候採用就近原則,如名稱一致,那麼優先調用私有過濾器
                }
            }

        })
  
    </script>

Es6:padStart:填充字符換方法,兩個參數(maxLength,fillString=’ ') 8->08

  var m = dt.getMonth +1.toString().padStart(2,'0')

自定義修飾符:

  • @keyup.enter:回車鍵,
  • .tab
  • .delete
  • .esc
  • space
  • up
  • down
  • left
  • right
    自定義全局按鍵修飾符:
  Vue.config.KeyCodes.f2=113  //不過現在瀏覽器新特性已經支持f2了
  name:<input value="name" v-model="name" @keyup.f2="addCar">

默認獲取焦點:自定義指令:v-fous:

Vue.directive('focus',{
		bind:(el){			//樣式
	
		},			//每當指令綁定到元素上時會執行的函數,只執行一次,但是剛綁定的時候還沒能插入到Dom元素中去,因此focus在這裏不生效
		
		inserted:(el){
		el.focus()				//行爲,防止不生效
		},	//表示元素插入到DOM中的時候會執行insrted函數
			
		update:(el){
		
		} 		//當VNode更新時會執行update,可能會觸發多次
}):

定義全局的指令,參數1:指令的名稱,在定義時前面不需要加v-前綴,但是在i調用時指令名稱前加上v-調用。參數2是一個對象,有一些指令相關的函數,這些函數可以在特定的時候執行相關操作.在每個函數中,第一個參數永遠都是el,就是原生的js對象,調用原生的dom方法。

  Vue.directive('focus',{
            inserted(el){
                el.focus()
            }
        })

樣式只要綁定給了元素,不管這個元素有沒有被插入到頁面中,這個元素肯定有了一個內聯的樣式,將來元素肯定會顯示,瀏覽器會解析應用給這個元素,通常第二個參數爲binding,裏面有幾個常用的值:name,value,expression即可。demo:

 Vue.directive('color',{				//定義color指令
          bind(el,binding){
              el.style.color=binding.value				//操作原生dom改變顏色
          }
      })
      搜索名稱關鍵字:<input v-model="keyword" v-focus v-color="'green'">

將文本框內容的顏色渲染成綠色


私有指令:綁定在vm下,和data,methods,filter同級:

directive:{
‘fontweight’:{
             bind(el,binding){
                 el.style.fontWeight=binding.value
             }
         }
  }

簡寫:->

'fontsize':(el,binding){				//類似存放在了bind和update上
   	el.style.fonsize=binding.value
}

Vue對象的生命週期:
分類:創建階段/運行階段/銷燬階段
new Vue()->初始化:->beforeCreated(第一個生命週期函數,實例完全被創建出來之前會執行),data和methods中的內容都沒被初始化->init data and method->created(數據和方法都能被獲取到,最早的方法)->判斷是否有el,判斷是否有template,如果沒有的話就把el編譯爲模板,只是在內存中渲染好了->編譯完之後要掛載:before mount:模板編譯完成,還沒渲染到頁面->內容只是{{msg}}->將內存中編譯好的模板真實地替換到瀏覽器中->mounted()輸出真實值。->此時如果沒有其他操作,實例就不動了->如果通過插件操作頁面上的DOM節點,最早要在mounted中進行->運行階段:當數據改變時候的兩個函數:beforeUpdate/update兩個函數,這兩個函數會根據data的改變會有選擇性的觸發0-無窮大次->銷燬:beforeDestory鉤子函數:都處於可用狀態,還沒有真正進行銷燬的過程->destory,真正的進行銷燬.

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