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,真正的进行销毁.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值