1、站点添加实例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script type="text/javascript" src="../js/vue.min.js"></script> <link rel="stylesheet" href="../css/bootstrap.css"> </head> <body> <div id="app"> <div class="panel panel-primary"> <div class="panel-heading"> <h3 class="panel-title">添加站点</h3> </div> <div class="panel-body form-inline"> <label>Id:<input type="text" class="form-control" v-model="id"></label> <!--按enter触发add--> <label>Name:<input type="text" class="form-control" v-model="name" @keyup.enter="add"></label> <input type="button" value="添加" class="btn btn-primary" @click="add"> <label>搜索名称关键字: <input type="text" class="form-control" v-model="keywords" id="search" v-focus v-color="'blue'"> </label> </div> </div> <table class="table table-bordered table-hover table-striped"> <thead> <tr> <th>Id</th> <th>Name</th> <th>Ctime</th> <th>Operation</th> </tr> </thead> <tbody> <tr v-for="item in search(keywords)"> <td>{{item.id}}</td> <td>{{item.name}}</td> <td>{{item.ctime | dateFormat()}}</td> <td><a href="#" @click.prevent="del(item.id)">删除</a></td> </tr> </tbody> </table> </div> <div id="app1"> <p v-fontweight="900" v-fontsize="50">{{dt | dateFormat}}</p> </div> <script> //过滤器Vue Vue.filter('dateFormat',function (dateStr,pattern="") { //将字符串获取当前时间 var dt = new Date(dateStr); var y = dt.getFullYear() var m = (dt.getMonth() +1).toString().padStart(2,'0') var d = dt.getDate().toString().padStart(2,'0')//填充后两个长度 /* return y + '-' + m + '-'+ d return '${y}-${m}-${d}'*/ //if(pattern && pattern.toLowerCase() === 'yyyy-mm-dd'){ if(pattern && pattern.toLowerCase() === 'yyyy-mm-dd'){ //return '${y}-${m}-${d}' return y + '-' + m + '-'+ d }else { var hh = dt.getHours().toString().padStart(2,'0') var mm = dt.getMinutes().toString().padStart(2,'0') var ss = dt.getSeconds().toString().padStart(2,'0') return y + '-' + m + '-'+ d +' '+hh+':'+mm+':'+ss } }) //自定义按键修饰符 Vue.config.keyCodes.f2 = 113 //自定义指令 v-focus, //param1 名称 //param2 inserted update bind Vue.directive('focus',{ bind:function (el) {//首先执行 执行一次,el dom对象,触发的dom //在元素刚绑定,含没有插入到dom }, inserted:function (el) {//插入到dom el.focus()//行为 }, updated:function (el) { }//触发一次 }) Vue.directive('color',{ //样式 bind:function (el,binding) { el.style.color = 'red' //console.log(binding.name) // console.log(binding.expression) // console.log(binding.value) el.style.color = binding.value } }) var vm = new Vue({ el:'#app', data:{ id:'', name:'', keywords:'', websites:[ {id:1,name:'百度',ctime:new Date()}, {id:2,name:'京东',ctime:new Date()}, {id:3,name:'淘宝',ctime:new Date()} ] }, methods:{ add(){//添加 //1获取id和name,直接从data获取 //2.组织出一个对象 //3.把这个对象,调用数组的相关方法,添加到当前的data上的websites if(this.id!='' && this.name!= ''){ var website = {id:this.id,name:this.name,ctime:new Date()} this.websites.push(website) this.id = this.name = '' }else { alert('id和name不能为空') } }, del(id){//根据id删除数据 var index = this.websites.findIndex(item =>{ if (item.id == id){ return true; } }) this.websites.splice(index,1) }, //通过关键字过滤所有符合条件的website search(keywords){ // 注意:forEarch some filter findIndex这些都是属于数组的新方法,都是进行遍历 return this.websites.filter(item => { // if(item.name.indexOf(keywords) != -1){ //es6 提供的一个新方法 string.prototype.includes if(item.name.includes(keywords)){ return item } }) } } }) var vm1 = new Vue({ el: '#app1', data: { dt: new Date() }, methods: {}, filters: { dateFormat: function (dateStr, pattern = '') { //将字符串获取当前时间 var dt = new Date(dateStr); var y = dt.getFullYear() var m = dt.getMonth() + 1 var d = dt.getDate() if (pattern && pattern.toLowerCase() === 'yyyy-mm-dd') { return y + '-' + m + '-' + d } else { var hh = dt.getHours().toString().padStart(2,'0') var mm = dt.getMinutes().toString().padStart(2,'0') var ss = dt.getSeconds().toString().padStart(2,'0') return y + '-' + m + '-' + d + ' ' + hh + ':' + mm + ':' + ss + '~~~~' } } }, directives:{//自定义私有指令 'fontweight':{ bind:function (el,binding) { el.style.fontweight = binding.value } }, 'fontsize':function (el,binding) { console.log(binding.value) el.style.fontsize = parseInt(binding.value) + 'px' } } }) //document.getElementById('search').focus() </script> </body> </html>
实际效果
2、列表添加与删除动画
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../js/vue.min.js"></script> <style> li{ border: 1px dashed #999; margin: 5px; line-height: 35px; padding-left: 5px; font-size: 14px; 100%; } li:hover{ background-color: pink; transition: all 0.4s ease; } .v-enter,.v-leave-to{ opacity: 0; transform: translateY(80px); } .v-enter-active,.v-leave-active{ transition: all 0.6s ease; } /*实现列表删除元素的后续列表渐渐的飘上来*/ .v-move{ transition: all 0.6s ease; } .v-leave-active{ position: absolute; } </style> </head> <body> <div id="app"> <div> <label> Id: <input type="text" v-model="id"> </label> <label> Name: <input type="text" v-model="name"> </label> <input type="button" value="添加" @click="add"> </div> <!-- <ul>--> <!--实现列表动画不能使用transition包裹 要使用transition-group--> <transition-group appear tag="ul"> <li v-for="(item,i) in list" :key="item.id" @click="del(i)"> {{item.id}} ----- {{item.name}} </li> </transition-group> <!-- </ul>--> </div> <script> var vm = new Vue({ el:'#app', data:{ id:'', name:'', list:[ {id:1,name:'赵高'}, {id:2,name:'秦桧'}, {id:3,name:'严嵩'}, {id:4,name:'魏忠贤'} ] }, methods:{ add(){ if(this.id!="" && this.name != ""){ this.list.push({id:this.id,name:this.name}) } }, del(i){ this.list.splice(i,1) } } }) </script> </body> </html>
实际效果
3.实例