vue过滤器

一.过滤器filter

  概念:Vue.js 允许你自定义过滤器,可被用作一些常见的文本格式化。过滤器可以用在两个地方:mustache 插值和 v-bind 表达式。过滤器应该被添加在 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>
</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>
View Code

 

二.侦听事件

<!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>
View Code

 

三.计算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>
View Code

 

四.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>
View Code

 总结:

在vue使用的过程中,如果要初始化操作,把初始化操作的代码放在 mounted 中执行。
mounted阶段就是在vm对象已经把data数据实现到页面以后。一般页面初始化使用。例如,用户访问页面加载成功以后,就要执行的ajax请求。

另一个就是created,这个阶段就是在 vue对象创建以后,把ajax请求后端数据的代码放进 created

 

五.ajax请求  

  vue.js默认没有提供ajax功能的。

  所以使用vue的时候,一般都会使用axios的插件来实现ajax与后端服务器的数据交互。

  注意,axios本质上就是javascript的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>
View Code

   例子二:

// 发送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'
View Code

 

六.同源策略问题

  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>
View Code

   案例二:

<!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>
View Code

  2.ajax跨域(跨源)方案之CORS 

  CORS是一个W3C标准,全称是"跨域资源共享",它允许浏览器向跨源的后端服务器发出ajax请求,从而克服了AJAX只能同源使用的限制。

  实现CORS主要依靠后端服务器中响应数据中设置响应头信息返回的。

  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数据的数据转换.

  

stringifyjson对象字符串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>

 

posted @ 2019-03-10 10:28  阿布_alone  阅读(315)  评论(0编辑  收藏  举报
TOP