前端系列课程之计算属性&侦听器和自定义指令(一)

计算属性&侦听器和自定义指令

  • 目标:
  1. 掌握计算属性的应用
  2. 掌握监听器的应用
  3. 掌握自定义指令的应用

计算属性

  1. 为什么需要计算属性?

    (1)模板语法可以使用表达式,但是不便于实现复杂的业务逻辑功能,也不利于维护

在这里插入图片描述

  • 如何对绑定的title倒序?
    在这里插入图片描述
    例子:(倒序)

在这里插入图片描述

或者:

在这里插入图片描述

(2)计算属性可以解决模板语法的缺点, 完成复杂的逻辑,便于代码维护。

  • 计算属性的语法:

    计算属性通过computed选项进行设置,以函数的方式实现业务功能,需要返回一个结果。

在这里插入图片描述

  • 计算属性和方法的区别:

    计算属性以来响应式属性,当响应式属性没有变化时,计算属性不会执行,而方法始终会执行。

例子:

在这里插入图片描述

  • 计算属性的读写:

    计算属性默认只有读取功能,如果需要写操作,需要定义set方法。

在这里插入图片描述

例子:(实现写入)


<body>
    <div id="app">
        <p>姓名:{{userName}}</p>
        <button @click="userName='李四'">修改</button>
    </div>
    <script>
        var app = new Vue({

            el: '#app',
            data: {
                firstName: "三",
                lastName: "张"
            },
            methods: {
            },
            computed: {
                userName: {
                    get() {
                        return this.lastName + this.firstName
                    },
                    set(value) {
                        this.lastName = value[0]
                        this.firstName = value[value.length - 1]
                    }
                }
            },
        })
    </script>
</body>

点击修改后,修改值

实际应用:案例一:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.0/vue.js"></script>
    <title></title>
</head>

<body>
    <div id="app">
        search: <input type="text" name="" id="" v-model='age'>
        <table border="1">
            <tr>

                <th>编号:</th>
                <th>姓名:</th>
                <th>年龄:</th>
            </tr>
            <tr v-for="student,index in searchStus ">
                <td>{{index+1}}</td>
                <td v-for="value in student">{{value}}</td>

            </tr>
        </table>
    </div>
    <script>
        var app = new Vue({

            el: '#app',
            data: {
                age: 18,
                students: [{
                    name: 'tom',
                    age: 20
                }, {
                    name: 'jsck',
                    age: 23
                }, {
                    name: 'alex',
                    age: 34
                }, {
                    name: 'susan',
                    age: 50
                }, {
                    name: 'Jone',
                    age: 40
                }, ]
            },
            methods: {},
            computed: {
                searchStus() {
                    let newStus = []
                    for (let i = 0; i < this.students.length; i++) {
                        if (this.students[i].age > this.age) {
                            newStus.push(this.students[i])
                        }
                    }
                    return newStus
                },
            }
        })
    </script>
</body>

</html>

运行结果:(具有筛选功能)

在这里插入图片描述

注意:计算属性是同步操作,计算属性不支持异步请求

侦听器

  • 侦听器的特性
  1. 侦听器是用来检测数据变化,从而添加自定义的业务逻辑代码
  2. 侦听器可以监测计算属性非计算属性
  3. 侦听器可以实现比较复杂的逻辑,而计算属性一般用于简单逻辑代码
  4. 侦听器可以执行异步操作,而计算属性是同步执行
  5. 侦听器性能方面比不上计算属性
  • 侦听器的语法
  1. 通过watch选项设置侦听器

在这里插入图片描述


例子:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.0/vue.js"></script>
    <title></title>
</head>

<body>
    <div id="app">
        <p>{{title}}</p>
        <button @click="title = 'hello'">修改属性</button>
    </div>
    <script>
        var app = new Vue({

            el: '#app',
            data: {
                title: 'this is Vue'
            },
            watch: {
                title: function(val, oldVal) {
                    console.log("原值:", oldVal)
                    console.log("修改后值:", val)
                }
            }
        })
    </script>
</body>

</html>

运行结果:

在这里插入图片描述

  • 高级侦听器
  1. 深度侦听器
  2. 层次侦听器
  3. 多重侦听器

例子:

在这里插入图片描述
多重侦听:


<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.0/vue.js"></script>
    <title></title>
</head>

<body>
    <div id="app">
        <p>{{title}}</p>
        <p>电话:{{user.phone.home}}</p>
        <button @click="user.phone.home = '045222222222'">修改属性</button>
        <button @click="title = 'hello'">修改title属性</button>
    </div>
    <script>
        var app = new Vue({
            el: '#app',
            data: {
                title: 'This is Vue',
                user: {
                    name: 'tom',
                    age: 18,
                    phone: {
                        home: '04521111111',
                        selfPhone: '12345678901'
                    }
                }
            },
            watch: {
                user: {
                    handler: function(val, oldVal) {
                        console.log("原值:", oldVal)
                    },
                    //是否深度追踪
                    deep: true
                },
                //多重侦听器
                title: [
                    function watch1(val, oldVal) {
                        console.log("原值:", oldVal)
                        console.log("新值:", val)
                    },
                    function watch2(val, oldVal) {
                        console.log("原值:", oldVal)
                        console.log("新值:", val)
                    }
                ]
            }
        })
    </script>
</body>

</html>


运行结果:

在这里插入图片描述


**深度侦听:**

在这里插入图片描述


  • Vue响应工作原理

在这里插入图片描述

自定义指令

  • 全局指令
  1. 通过directive创建全局指令

在这里插入图片描述

  1. 指令对象的钩子函数
  • bind
  • inserted
  • update
  • componentUpdated
  • unbind

例子:(完整版)

在这里插入图片描述


  • 简化指令
  1. 简化指令的语法:

在这里插入图片描述
在这里插入图片描述

例子:(简化版)

在这里插入图片描述

  • 局部指令
  1. 通过directive选项设置局部指令

在这里插入图片描述

  • 指令对象钩子函数的参数
  1. el
  2. binding
    a. name
    b. value
    c. expression
    d. modifiers

在这里插入图片描述
例子:
输出结果为data中定义的title:this is Vue

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值