vue过滤器
一.过滤器filter
<!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="js/vue.js"></script> </head> <body> <div id='app'> <!-- 一个过滤器可以传多个参数 --> <!-- 一条数据也可以用多个过滤器处理,用管道符拼接 --> <p>{{msg | msgFormat('','大家把') | test}}</p> </div> <script> // 定义一个 Vue 全局的过滤器,名字叫做 msgFormat //固定格式Vue.filter('过滤器名字',function(data){函数内容}) //过滤器第一个位置已经被占用了就是过滤器要处理的那个对象,调用过滤器的那个对象 //可以传入多个参数,打一个位置的实参不用写,形参要写 //还有,顾虑完的结果必须return Vue.filter('msgFormat',function(msg,arg1,arg2){ // 字符串的 replace 方法,第一个参数,除了可写一个 字符串之外,还可以定义一个正则 return msg.replace(/喜欢/g,arg1+arg2) }) //另一个过滤 器 Vue.filter('test',function(data){ return data+'=============' }) let vm=new Vue({ el:'#app', data:{ msg:'我喜欢你,也不知道喜欢什么,可能就是喜欢上你吧' }, //filters带s是一个对象,这个在一个vm对象,所有是一个局部过滤器 filters:{ trans: function(value){ // 必须要使用return 把过滤后的内容返回 return value.toUpperCase(); } }) </script> </body> </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='js/vue.js'> </script> </head> <body> <div id="app"> <span @click='num++'>+</span> <input type="text" v-model='num'> <span @click='num--'>-</span> </div> <script> //侦听属性 //这边的属性是指data中的数据 let vm=new Vue({ el:'#app', data:{ num:0 }, //watch;里面的方法会在在data的数据发生改变的时候,自动执行 watch:{ //格式:要观察的变量名:function(变化后的值,变化前的值){} num:function(v1,v2){ if(v1<0){ this.num=0; } } } }) </script> </body> </html>
三.计算computed(和过滤差不多,都是对字符串进行处理)
<!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='js/vue.js'> </script> </head> <body> <div id="app"> <span>{{str}}</span> <span>{{computed_str}}</span> </div> <script> let vm=new Vue({ el:'#app', data:{ str:'我爱你' }, //计算属性 //记得返回值 computed: { computed_str:function(value){ return '计算后的结果:'+this.str.split('').reverse().join(''); } }, }) </script> </body> </html>
四.Vue的生命周期
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/vue.js"></script> </head> <body> <div id="app"> <p>{{num}}</p> </div> <script> // 侦听属性 // 这里的属性是指代data中的数据 let vm = new Vue({ el:"#app", data:{ num:10 }, // vm对象初始化之前,此时el和data还没有出现 beforeCreate: function(){ console.log("beforeCreate在vm对象初始化之前,此时el和data还没有出现"); console.log(this.$el); // this..$el 查看上面vue对象操作的标签控制器 console.log(this.$data); // this.$data 查看上面vue对象保存的data,访问bum这些数据时没有的 }, // vm对象初始化之后, created: function(){ console.log('created在vm对象初始化之后执行了,此时$el没有,但是已经有data数据了'); console.log(this.$el); console.log(this.$data); console.log( this.num ); // 开发项目时,在这个函数中,编写向后台请求数据的代码,这些代码不涉及到视图html标签的操作 // ajax }, // 把data数据挂载到html视图之前 beforeMount: function(){ console.log('beforeMount执行了,此时vue并没有把data数据挂载到html视图中,所以$el还是源码中的vue指令'); console.log(this.$el.innerHTML); console.log(this.$data); // $data早已经有了 }, // 把data数据挂载到html视图之后 mounted: function(){ console.log('mounted执行了,此时vue已经把data数据挂载到html视图中了,所以$el就是挂载后的数据'); console.log(this.$el.innerHTML); // 这个位置用于编写初始化中操作html内容的代码 } }) </script> </body> </html>
总结:
在vue使用的过程中,如果要初始化操作,把初始化操作的代码放在 mounted 中执行。
mounted阶段就是在vm对象已经把data数据实现到页面以后。一般页面初始化使用。例如,用户访问页面加载成功以后,就要执行的ajax请求。
另一个就是created,这个阶段就是在 vue对象创建以后,把ajax请求后端数据的代码放进 created
五.ajax请求
<!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='js/vue.js'> </script> <!-- 需要写在vue后面,对vue有依赖 --> <script src='js/axios.js'> </script> </head> <body> <div id="app"> 请输入你要查询的城市: <input type="text" v-model='city'> <button @click='getweather'>点击获取天气</button> <h1>{{ganmao}}</h1> </div> <script> let vm=new Vue({ el:'#app', data:{ city:'', ganmao:'', }, methods:{ //在这里编辑一个ajax //axios是一个对象 //axios.get(url地址).then(function{}) 发送get的请求数据,then是请求成功后的处理函数 //axios.post 发送post请求 //进入ajax前要保存Vue对象到一个变量里面,方便在ajax里面调用this getweather:function(){ _this=this //会在请求成功之后,自动执行,response里面包含后端返回的数据 axios.get("http://wthrcdn.etouch.cn/weather_mini?city="+this.city).then(function(response){ console.log(response); console.log('ajax内部的函数',this); _this.ganmao=response.data.data.ganmao }).catch(function(error){//捕获错误,会自动捕获ajax请求失败的错误信息 console.log(error) }) } } }) </script> </body> </html>
例子二:
// 发送get请求 // 参数1: 必填,字符串,请求的数据接口的url地址 // 参数2:必填,json对象,要提供给数据接口的参数 // 参数3:可选,json对象,请求头信息 axios.get('/user',{ ID:'12345', }) .then(function (response) { // 请求成功以后的回调函数 console.log("请求成功"); console.log(response); }) .catch(function (error) { // 请求失败以后的回调函数 console.log("请求失败"); console.log(error); }); // 发送post请求,参数和使用和axios.get()一样。 axios.post('/user',{ params:{ firstName: 'Fred', lastName: 'Flintstone' } }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); }); // b'firstName=Fred&lastName=Flintstone'
六.同源策略问题
1.同源问题的拦截
在浏览器页面运行过程中,
服务器和浏览器运行程序的地址要保持在同一个源下.
同源策略,是浏览器为了保护用户信息安全的一种安全机制。所谓的同源就是指代通信的两个地址(例如服务端接口地址与浏览器客户端页面地址)之间比较,是否协议、域名(IP)和端口相同。不同源的客户端脚本[javascript]在没有明确授权的情况下,没有权限读写对方信息。
ajax本质上还是javascript,是运行在浏览器中的脚本语言,所以会被受到浏览器的同源策略所限制。
<!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='js/vue.js'> </script> <script src='js/axios.js'></script> </head> <body> <div id="app"> 请输入你要查询歌曲: <input type="text" v-model='music'> <button @click='getinfo'>点击获取歌曲详情</button> <p>{{detail}}</p> </div> <script> // 同源策略: // 在浏览器页面运行过程中, // 服务器和浏览器运行程序的地址要保持在同一个源下. // 源:必须同样的域名, 同样的端口, 同样的协议 // ajax运行的前端地址: http://www.baidu.com/get_user // 服务器: https://blog.baidu.com/get_user 不同源,[端口一样,域名不同,协议不同,] // 服务器: http://blog.sina.com/get_user 不同源,[端口一样,域名不同,协议相同,] // 服务器: http://www.baidu.com/v1/get_user 同源,[端口一样,域名一样,协议相同,] let vm=new Vue({ el:'#app', data:{ music:'', detail:'', }, methods:{ getinfo:function(){ _this=this axios.get("http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.search.catalogSug&query="+this.music) .then(function(response){ console.log(response); console.log('ajax内部的函数',this) _this.detail=response.data.data.ganmao }).catch(function(error){console.log(error)}) } } }) </script> </body> </html>
案例二:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/jquery-1.12.4.js"></script> <script> $(function(){ $("#btn").on("click",function(){ $.ajax({ url: 'http://weatherapi.market.xiaomi.com/wtr-v2/weather', type: 'get', dataType: 'json', data:{ "cityId":101010100 } }) .done(function(resp) { // 请求成功以后的操作 console.log(resp); }) .fail(function(error) { // 请求失败以后的操作 console.log(error); }); }); }) </script> </head> <body> <button id="btn">点击获取数据</button> </body> </html>
2.
CORS是一个W3C标准,全称是"跨域资源共享",它允许浏览器向跨源的后端服务器发出ajax请求,从而克服了AJAX只能同源使用的限制。
response = new Response()
response .set_header("")
// 在响应行信息里面设置以下内容:
Access-Control-Allow-Origin: ajax所在的域名地址
Access-Control-Allow-Origin: www.oldboy.cn # 表示只允许www.oldboy.cn域名的客户端的ajax跨域访问
// * 表示任意源,表示允许任意源下的客户端的ajax都可以访问当前服务端信息
Access-Control-Allow-Origin: *
总结:
0. 同源策略:浏览器的一种保护用户数据的一种安全机制。
浏览器会限制脚本语法不能跨源访问其他源的数据地址。
同源:判断两个通信的地址之间,是否协议,域名[IP],端口一致。
ajax: http://127.0.0.1/index.html
api数据接口: http://localhost/index
这两个是同源么?不是同源的。
1. ajax默认情况下会受到同源策略的影响,一旦受到影响会报错误如下:
No 'Access-Control-Allow-Origin' header is present on the requested resource
2. 解决ajax只能同源访问数据接口的方式:
1. 在服务端的响应行中设置:
Access-Control-Allow-Origin: 允许访问的域名地址
七.json数据
1.介绍
json是 JavaScript Object Notation 的首字母缩写,单词的意思是javascript对象表示法,这里说的json指的是类似于javascript对象的一种数据格式。
json的作用:在不同的系统平台,或不同编程语言之间传递数据。
2.语法
json数据对象类似于JavaScript中的对象,但是它的键对应的值里面是没有函数方法的,值可以是普通变量,不支持undefined,值还可以是数组或者json对象。
3.总结
1. json文件的后缀是json
2. json文件一般保存一个单一的json数据对象
3. json数据的属性不能是方法或者undefined,属性值只能:数值、字符串、对象和数组
4. json数据只使用双引号、每一个属性成员之间使用逗号隔开,并且最后一个成员没有逗号。
{
"name":"小明",
"age":200,
"fav":["code","eat","swim","read"],
"son":{
"name":"小小明",
"age":100
}
}
4,方法
avascript提供了一个JSON对象来操作json数据的数据转换.
stringify | json对象 | 字符串 | json对象转成字符串 |
---|---|---|---|
方法 | 参数 | 返回值 | 描述 |
parse | 字符串 | json对象 | 字符串格式的json数据转成json对象 |
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script> var json_obj = { "name":"小明", "age":200, "fav":["code","eat","swim","read"], "son":{ "name":"小小明", "age":100 } }; // json对象转换成字符串格式的json数据 var data_str = JSON.stringify(json_obj); console.log( data_str ); // 字符串格式的json数据转换成json对象 var data_json = JSON.parse(data_str); console.log( data_json ); </script> </head> <body> </body> </html>