forEach 、 some 、 filter 、findIndex 这些都属于数组的新方法,都会对数组中的每一项进行遍历,执行相关的操作。
过滤器可被用作一些常见的文本格式化,Vue.js允许自定义过滤器,过滤器只可以用在两个地方:mustache插值和v-bind表达式。过滤器应该被添加在JavaScript表达式的尾部。
语法:
//过滤器调用 对那个变量格式化,变量名称 | 过滤器名称 {{paramName | 过滤器名称}}// 竖线也叫管道符号 ,可以添加多个过滤器,以管道符隔开 如 {{pName | filter1 | filter2 | ...}},执行顺序从左到右依次执行 //定义过滤器的语法调用vue的filter方法,传入,过滤器名称,以及要处理数据的函数,函数中的第一个参数,是过利器管道符前面的数据 Vue.filter('过滤器名称',function(data){ return data+'sdgsdgssd'; }) //比如对上述案例的日期格式化 {{item.ctime | timeFormate}}//过滤器名称其实就是一个函数,可以传参的, timeFormate('paa','sdgas') Vue.filter('timeFormate',function(ctime){//function(ctime,arg1,arg2,...)//除了第一个参数是固定的,后续可以自定义个数 });上述过滤器是全局的,也就是说不只是一个vue实例可以使用,其他的vue实例也可以使用,当然如果想让某个vue实例才能使用的话,就需要自定义一个局部的过滤器
var vm = new Vue({ el:'#app', data: { dt: new Date() }, methods: { }, filters: {//这就是局部过滤器,或者叫该vue实例私有的过滤器 //过滤器有两个条件 [过滤器名称 和 处理函数] dateFormat: function(dateStr,param1){ //处理函数的内容同上 } } });过滤器调用的时候如果有两个同名的过滤器,一个是私有的一个是全局的,那么它会调用自己私有的,不会调用全局的。
使用ES6中的字符串新方法String.prototype.padStart(maxLength,fillString=’’) 头部填充或 String.prototype.padEnd(maxLength,fillString=’’) 尾部填充来填充字符串。
var m = (dt.getMonth() + 1).toString().padStart(2,'0');//这样就实现了月份是两位数字了 var d = dt.getDate().toString().padStart(2,'0');//小于10的日期天也被填充成两位数字了keyCode 的事件用法已经被废弃了并可能不会被最新的浏览器支持。
为了在必要的情况下支持旧浏览器,Vue 提供了绝大多数常用的按键码的别名:
.enter.tab.delete (捕获“删除”和“退格”键).esc.space.up.down.left.right有一些按键 (.esc 以及所有的方向键) 在 IE9 中有不同的 key 值, 如果你想支持 IE9,这些内置的别名应该是首选。
你还可以通过全局 config.keyCodes 对象自定义按键修饰符别名:
// 可以使用 `v-on:keyup.f1` Vue.config.keyCodes.f1 = 112除了用上述Vue给的这些按键修饰符,我们还可以自定义全局按键修饰符。
Vue.config.keyCodes.f2 = 113;//此时就可以使用 //html中使用: Name: <input type="text" name="" class="form-control" v-model="name" @keyup.f2="add">比如说现在要自定义一个v-focus 指令,来让某个input自动获取焦点,比如定义全局的指令v-focus,其中第一个参数是指令的名称,且不需要在指令的名称前面加“v-” 前缀,在调用的时候,必须在指令名称前加上“v-”前缀。第二个参数是一个对象,这个对象有一些质量相关的函数,这些函数可以在指定的阶段执行相关的操作。
<script> Vue.directive('focus',{ bind: function(el) {//el是绑定到的元素,在这些函数(当前以及下面的函数)中,第一个参数,都是el,表示被绑定了指令的元素,它是一个原生的jsDOM对象。 //当指令绑定到元素上时,执行,只执行一次 //el.focus();//但是当前方法调用后没有任何作用,原因是,在元素刚绑定指令时,还没有插入到内存中的DOM树中去,所以没反应。只有当元素插入DOM之后才能获取焦点。 }, inserted: function(el) {//当元素插入到DOM重视会执行,只执行一次, el.focus();//此时元素已经插入到DOM中,所以可以看到效果。 }, updated: function(el) {}//当VNode更新时,会执行,可执行多次 });//定义全局的指令 </script> //调用 <label for=""> 搜索名称: <input type="text" name="" id="" class="form-control" v-model="keywords" v-focus> </label>大多数情况下,我们可能想在bind和update钩子上做重复动作,并且不希望关心其他的钩子函数,可以写成如下方式:
Vue.directive('color-swatch',function(el, binding){ el.style.backgroundColor = binding.value; }); //私有: directives: {//自定义私有指令 [指令名称 对象(包含了函数)] 'fontweight': { bind:function(el,binding){ el.style.fontWeight = binding.value; } }, //私有 'fontsize':function(el,binding) {//这个function等同于,bind和update中都写了 el.style.fontSize = binding.value; } }从vue实例创建、运行、到销毁期间总是伴随着各种各样的事件,这些事件统称为生命周期。
生命周期钩子: 就是生命周期事件或者生命周期函数的别名而已;
var vm = new Vue({ el: '#app', data: {}, methods:{}, beforeCreate(){//生命周期中的第一个函数,vue实例在完全创建出来之前会执行该函数 }, created(){//第二个生命周期函数 //此时data 和methods 都已经被初始化了 }, beforeMount(){//第三个声明周期函数 模板已编译完成,只是未挂载到页面中去 console.log(document.getElementById('h3').innerText);//此时输出的是{{msg}}而不是msg的值 }, mounted(){//第四个生命周期函数 此时内存中的模板,已经挂载到了浏览器页面中了,用户此时已经可以看到渲染好的页面了 console.log(document.getElementById('h3').innerText);//此时输出的是msg的值'OK',而不是插值表达式了 }, //接下来是运行期间的两个周期函数 beforeUpdate(){//数据更新时,且发生在更新之前 console.log('界面上元素的内容:'+document.getElementById('h3').innerText);//此时输出的依旧是没改变之前的数据 console.log('data中的msg数据是:'+this.msg);//此时已经是改变后的数据了 }, updated(){//数据更新后,页面和data数据已经同步为最新了 console.log('界面上元素的内容:'+document.getElementById('h3').innerText);//此时已经是改变后的数据了 console.log('data中的msg数据是:'+this.msg);//此时已经是改变后的数据了 } });
主要的生命周期函数分类:
在该函数体内操作时,此时data和methods都还没有被执行初始化
在该函数体内,data和methods已经被初始化了,也就是说data和methods最早被使用的时候是在created()方法中。
在该函数执行的时候,页面中的元素的内容并没有被替换过来,只是之前写的一些模板字符串,即如果我们想获取元素的内容,我们拿到的只是插值表达式,而不是值内容。
实例创建期间的最后一个周期函数,执行完mounted就表示,实例已经完全被创建好了,此时如果没有其他操作的话,这个实例就会在内存中不动了。
一旦数据发生改变时就会先触发该事件,且页面中显示的数据还是旧的,但是此时data中的数据是最新的,页面和最新的数据尚未同步。
此时页面中的数据和data中的数据已经都是最新的了,保持同步了
此时vue实例中的数据、方法、指令、过滤器等都还可用,没有被销毁
此时vue实例已被销毁,实例中的东西均不可用。
除了使用vue-resource之外,还可以使用“axios”的第三方包实现数据的请求
测试URL请求资源地址:
get请求: http://vue.studyit.io/api/getlunbo
post请求:http://vue.studyit.io/api/post
jsonp请求地址: http://vue.studyit.io/api/jsonp
methods: { getInfo(){ this.$http.get(getUrl).then(function(result){//get() 第二个参数是请求参数,可不传 console.log('result='+result); }); }, postInfo(){//手动发起的post请求,默认没有表单格式,服务器处理不了,所以需要给post的第三个参数设置提交的内容类型,现在设置为普通表单数据格式 application/x-wwww-form-rulencoded this.$http.post(postUrl,{name,this.name},{emulateJSON:true}).then(result => {//post()第二个参数,是要传给接口的参数 console.log(result); }); }, jsonpInfo(){ this.$http.jsonp(jsonpUrl).then(result => { console.log(result); }); } }全局设置根路径的方式:
Vue.http.options.root = 'http://vue.studyit.io/'; //如果通过全局配置根路径,请求的数据接口根域名则每次单独发起http请求的视乎url路径应该以相对路径开头,并且前面不能带'/'否则不会启用根路径做拼接。 this.$http.get('api/getprodlist').then(result=>{});//这里的是相对路径,并且url不能以'/'开始。还可以配置emulateJSON为全局的省去每次的post还要传这个参数
Vue.http.options.emulateJSON = true; this.$http.post(postUrl,{name,this.name}).then(result => {//post()第二个参数,是要传给接口的参数 console.log(result); });