Vue2之过滤器、侦听器、计算属性、axios的相关使用

一、过滤器

1、介绍

过滤器是vue为开发者提供的功能,常用于文本的格式化。
过滤器可用在两个地方:插值表达式和v-bind属性绑定。
过滤器应该被添加在JavaScript表达式的尾部,由"管道符"进行调用

2、注意

(1)要定义到filters节点下,本质是一个函数
(2)在过滤器函数中,一定要有return值
(3)在过滤器的形参中,就可以获取到"管道符"前面待处理的那个值
(4)如果全局过滤器和私有过滤器名字一致,此时按照"就近原则",调用的是私有过滤器

3、应用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./lib/bootstrap.css">
</head>
<body>
    <div id="app">
        <p>message的值是:{
   
   {message | capi}}</p>
    </div>

    <!--1.导入Vue的库文件,在window全局就有了Vue这个构造函数-->
    <script src="./lib/vue-2.6.14.js"></script>
    <!--2.创建Vue的实例对象-->
    <script>
        // 创建Vue的实例对象
        // 相当于 ViewModel层
        const vm = new Vue({
      
      
            // el属性是固定的写法,表示当前vm实例要控制页面上的哪个区域,接收的值是一个选择器
            // 相当于 view层
            el: '#app',

            // data对象就是要渲染到页面上的数据
            // 相当于 model层
            data: {
      
      
                message: 'hello vue.js'
            },
            // methods的作用就是定义事件的处理函数
            methods: {
      
      
                
            },
            // 过滤器函数,必须定义到filters节点之下
            // 过滤器本质是函数
            filters: {
      
      
                // 注意:过滤器函数形参中的val,永远都是"管道符"前面的那个值
                capi(val) {
      
      
                    // 字符串有charAt方法,这个方法接收索引值,表示从字符串中把索引对应的字符,获取出来
                    const first = val.charAt(0).toUpperCase()
                    // 字符串的slice方法,可以截取字符串,从指定索引往后截取
                    const other = val.slice(1)
                    // 强调:过滤器中,一定要有一个返回值
                    return first + other
                }
            }
        })
    </script>
</body>
</html>

4、私有过滤器和全局过滤器

在filters节点下定义的过滤器,称为"私有过滤器",因为它只能在当前vm实例所控制的el区域内使用。
如果希望在多个vue实例之间共享过滤器,则可以按照如下的格式定义全局过滤器。

Vue.filter('capi',function(str){
    
    
  const first = str.charAt(0).toUpperCase()
  // 字符串的slice方法,可以截取字符串,从指定索引往后截取
  const other = str.slice(1)
  // 强调:过滤器中,一定要有一个返回值
  return first + other
  //return str.charAt(0).toUpperCase() + str.slice(1) 
})

全部代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./lib/bootstrap.css">
</head>
<body>
    <div id="app">
        <p>message的值是:{
   
   {message | capi}}</p>
    </div>

    <div id="app2">
        <p>message的值是:{
   
   {message | capi}}</p>
    </div>

    <!--1.导入Vue的库文件,在window全局就有了Vue这个构造函数-->
    <script src="./lib/vue-2.6.14.js"></script>
    <!--2.创建Vue的实例对象-->
    <script>
        // 全局过滤器 - 独立于每个vm实例之外
        // Vue.filter() 方法接收两个参数
        // 第一个参数,是全局过滤器的"名字"
        // 第二个参数,是全局过滤器的"处理函数"
        Vue.filter('capi',function(str){
      
      
            const first = str.charAt(0).toUpperCase()
            // 字符串的slice方法,可以截取字符串,从指定索引往后截取
            const other = str.slice(1)
            // 强调:过滤器中,一定要有一个返回值
            return first + other
            //return str.charAt(0).toUpperCase() + str.slice(1) 
        })

        // 创建Vue的实例对象
        // 相当于 ViewModel层
        const vm = new Vue({
      
      
            // el属性是固定的写法,表示当前vm实例要控制页面上的哪个区域,接收的值是一个选择器
            // 相当于 view层
            el: '#app',

            // data对象就是要渲染到页面上的数据
            // 相当于 model层
            data: {
      
      
                message: 'hello vue.js'
            },
            // methods的作用就是定义事件的处理函数
            methods: {
      
      
                
            },
            // 过滤器函数,必须定义到filters节点之下
            // 过滤器本质是函数
            filters: {
      
      
                
            }
        })
    
        const vm2 = new Vue({
      
      
            // el属性是固定的写法,表示当前vm实例要控制页面上的哪个区域,接收的值是一个选择器
            // 相当于 view层
            el: '#app2',
            // data对象就是要渲染到页面上的数据
            // 相当于 model层
            data: {
      
      
                message: 'hello world'
            },
            // methods的作用就是定义事件的处理函数
            methods: {
      
      
                
            },
            // 过滤器函数,必须定义到filters节点之下
            // 过滤器本质是函数
            filters: {
      
      
               
            }
        })

    </script>
</body>
</html>

5、过滤器的其他用法

5.1 连续调用多个过滤器

过滤器可以串联地进行调用

<p>{
   
   {data | filter1 | filter2}}</p>

5.2 过滤器的传参

<!--arg1和arg2是传递给filterA的参数-->
<p>{
   
   {message | filterA(arg1,arg2)}}</p>

// 过滤器处理函数的形参列表中
// 第一个参数:永远都是“管道符”前面待处理的值
// 从第二个参数开始,才是调用过滤器时传递过来的arg1 和 arg2参数
Vue.filter('filterA', (msg, arg1, arg2) => {
    // 过滤器的代码逻辑
})

5.3 过滤器的兼容性

过滤器在vue1.x和vue2.x中受支持,在vue3.x的版本中剔除了过滤器相关的功能。
在企业级项目开发中:
如果使用的是2.x版本的vue,则依然可以使用过滤器相关的功能
如果项目已经升级到了3.x版本的vue,官方建议使用计算属性或方法代替被剔除的过滤器功能

二、watch侦听器

1、什么是watch侦听器

watch侦听器允许开发者监视数据变化,从而针对数据的变化做特定的操作。

2、格式

侦听器本质上是一个函数,要监视哪个数据的变化,就把数据名作为方法名即可。
参数中是新值在前,旧值在后。

// 所有的侦听器,都应该被定义到watch节点下
watch: {
    
    
     username(newVal, oldVal){
    
    
         console.log('监听到了username值的变化!', newVal, oldVal)
     }
}

3、示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./lib/bootstrap.css">
</head>
<body>
    <div id="app">
        <input type="text" v-model="username">
    </div>

    <!--1.导入Vue的库文件,在window全局就有了Vue这个构造函数-->
    <script src="./lib/vue-2.6.14.js"></script>
    <!--2.创建Vue的实例对象-->
    <script>
        // 创建Vue的实例对象
        // 相当于 ViewModel层
        const vm = new Vue({
      
      
            // el属性是固定的写法,表示当前vm实例要控制页面上的哪个区域,接收的值是一个选择器
            // 相当于 view层
            el: '#app',

            // data对象就是要渲染到页面上的数据
            // 相当于 model层
            data: {
      
      
                username: ''
            },
            
            // 所有的侦听器,都应该被定义到watch节点下
            watch: {
      
      
                // 侦听器本质上是一个函数,要监视哪个数据的变化,就把数据名作为方法名即可
                // 参数中是新值在前,旧值在后
                username(newVal, oldVal){
      
      
                    console.log('监听到了username值的变化!', newVal, oldVal)
                }
            }
        })

    </script>
</body>
</html>

4、侦听器的格式

4.1 方法格式的侦听器

(1)缺点一
无法在刚进入页面的时候,自动触发。
(2)缺点二
如果侦听的是一个对象,如果对象中的属性发生了变化,不会触发侦听器

4.2 对象格式的侦听器

(1)优点一
可以通过immediate选项让侦听器自动触发。
(2)immediate选项相关代码

watch: {
    
    
  // 定义对象格式的侦听器
  username: {
    
    
        // 侦听器的处理函数
        handler(newVal, oldVal){
    
    
               console.log(newVal, oldVal)
        },
        // immediate选项的默认值是false
        // immediate的作用是:控制侦听器是否自动触发一次
        immediate: true
  }
}

(3)优点一
可以通过deep选项,让侦听器深度监听对象中每个属性的变化。
(4)deep选项相关代码

// 所有的侦听器,都应该被定义到watch节点下
watch: {
    
    
  info:{
    
    
    handler(newVal){
    
    
      console.log(newVal)
    },
    // 开启深度监听,只要对象中任何一个属性变化了,都会触发“对象的侦听器”
    deep:true
  }
}

也可以写成

'info.username'(newVal){
    
    
   console.log(newVal)
}

三、计算属性

1、介绍

计算属性指的是通过一系列运算之后,最终得到一个属性值。
这个动态计算出来的属性值可以被模板结构或methods方法使用。

2、特点

(1)定义的时候,要被定义为方法
(2)在使用计算属性的时候,当普通的属性使用即可

3、优点

(1)实现了代码的复用
(2)只要计算属性中依赖的数据源变化了,则计算属性会自动重新求值

4、相关应用

// 所有的计算属性,都要定义到computed节点之下
// 计算属性在定义的时候,要定义成“方法格式”
computed:{
    
    
    // rgb作为一个计算属性,被定义成了方法格式
    // 最终,在这个方法中,要返回一个生成好的 rgb(x,x,x)的字符串
     rgb(){
    
    
         return `rgb(${
      
      this.r},${
      
      this.g},${
      
      this.b})`
     }
}

5、完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./lib/bootstrap.css">
    <style>
        .box{
      
      
            width: 200px;
            height: 200px;
            border: 1px solid #ccc;
        }
    </style>
</head>
<body>
    <div id="app">
        <div>
            <span>R: </span>
            <input type="text" v-model.number="r">
        </div>
        <div>
            <span>G: </span>
            <input type="text" v-model.number="g">
        </div>
        <div>
            <span>B: </span>
            <input type="text" v-model.number="b">
        </div>
        <hr>
        <!--专门用户呈现颜色的div盒子-->
        <!--在属性身上,:代表   v-bind:属性绑定-->
        <!--:style 代表动态绑定一个样式对象,它的值是一个{ }样式对象-->
        <!--当前的样式对象中,只包含backgroundColor背景颜色 -->
        <div class="box" :style="{backgroundColor:rgb}">
            {
   
   {rgb}}
        </div>
        <button @click="show">按钮</button>
    </div>

    <!--1.导入Vue的库文件,在window全局就有了Vue这个构造函数-->
    <script src="./lib/vue-2.6.14.js"></script>
    <script src="./lib/jQuery-1.9.1.min.js"></script>
    <!--2.创建Vue的实例对象-->
    <script>
        // 创建Vue的实例对象
        // 相当于 ViewModel层
        const vm = new Vue({
      
      
            // el属性是固定的写法,表示当前vm实例要控制页面上的哪个区域,接收的值是一个选择器
            // 相当于 view层
            el: '#app',

            // data对象就是要渲染到页面上的数据
            // 相当于 model层
            data: {
      
      
                r: 0,
                g: 0,
                b: 0
            },

            methods:{
      
      
                // 点击按钮,在终端显示最新的颜色
                show(){
      
      
                    console.log(this.rgb)
                }
            },
            // 所有的计算属性,都要定义到computed节点之下
            // 计算属性在定义的时候,要定义成“方法格式”
            computed:{
      
      
                // rgb作为一个计算属性,被定义成了方法格式
                // 最终,在这个方法中,要返回一个生成好的 rgb(x,x,x)的字符串
                rgb(){
      
      
                    return `rgb(${ 
        this.r},${ 
        this.g},${ 
        this.b})`
                }
            }
        })
    </script>
</body>
</html>

四、axios库

1、介绍

axios专注于数据请求,在请求到数据之后,在真正的数据之外,又有一层封装,所以需要对里面的data进行引用。

2、axios发起GET请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
    <script src="./lib/axios.min.js"></script>
    <script>

        //1.调用axios方法得到的返回值是Promise对象
        axios({
      
      
            // 请求方式
            method: 'GET',
            // 请求的地址
            url:'http://www.liulongbin.top:3006/api/getbooks',
            // URL中的查询参数
            params:{
      
      
                id:1
            },
            // 请求体参数
            data:{
      
      }
        }).then(function(result){
      
      
            console.log(result.data)
        })

       
    </script>
</body>
</html>

3、axios发起POST请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button id="btn">发起POST请求</button>

    <script src="./lib/axios.min.js"></script>
    <script>
        document.querySelector('#btn').addEventListener('click', async function(){
      
      
            const result = await axios({
      
      
                // 请求方式
                method: 'POST',
                // 请求的地址
                url:'http://www.liulongbin.top:3006/api/post',
                // 请求体参数
                data:{
      
      
                    name: 'zs',
                    age:20
                }
            })

            console.log(result)
        })
    </script>
</body>
</html>

4、使用解构赋值发请求

4.1 步骤

(1)调用axios后,使用async/await进行简化
(2)使用解构赋值,从axios封装的大对象中,把data属性解构出来
(3)把解构出来的data属性,使用冒号进行重命名,一般都重命名为{data : res}

4.2 相关代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button id="btn">发起Get请求</button>

    <script src="./lib/axios.min.js"></script>
    <script>
        document.querySelector('#btn').addEventListener('click', async function(){
      
      
            const {
      
      data: res} = await axios({
      
      
                // 请求方式
                method: 'GET',
                // 请求的地址
                url:'http://www.liulongbin.top:3006/api/getbooks',
            })
            console.log(res.data)
        })
    </script>
</body>
</html>

5、使用axios.get发请求

5.1 格式

axios.get('url地址'{
    
    
  // get的参数
  params:{
    
    
    //参数内容
    id: 1
  }
})

5.2 完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button id="btn">GET</button>

    <script src="./lib/axios.min.js"></script>
    <script>
        document.querySelector('#btn').addEventListener('click', async function(){
      
      

            const {
      
      data: res} = await axios.get('http://www.liulongbin.top:3006/api/getbooks',{
      
      
                params: {
      
      
                    id: 1
                }
            })
            console.log(res)
        })
    </script>
</body>
</html>

6、使用axios.post发起请求

6.1 格式

axios.post('url地址',{
    
    
  // 参数内容
  name: 'zs',
  gender: '女'
})

6.2 完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button id="btn2">POST</button>

    <script src="./lib/axios.min.js"></script>
    <script>
        document.querySelector('#btn2').addEventListener('click', async function(){
      
      

            const {
      
      data: res} = await axios.post('http://www.liulongbin.top:3006/api/post',{
      
      
                name: 'zs',
                gender: '女'
            })
            console.log(res)
        })
    </script>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/qq_46106857/article/details/129025605
今日推荐