Vue 计算属性和监听属性(侦听器)之间的区别

这里结合 姓名案例 来理解 计算属性监听属性(侦听器)之间的区别


姓名案例 计算属性 实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>姓名案例_计算属性实现</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>

<div id="root">
    姓:<input type="text" v-model="fistName"> <br><br>
    名:<input type="text" v-model="lastName"> <br><br>
    全名:<span>{{fullName}}</span>
</div>

<script type="text/javascript">
    const vm = new Vue({
        el: '#root',
        data() {
            return {
                fistName: '张',
                lastName: '三'
            }
        },
        computed: {
            fullName() {
                return this.fistName + '-' + this.lastName
            }
        }
    })
</script>

</body>
</html>


姓名案例 监听属性(侦听器) 实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>姓名案例_监听属性实现</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>

<div id="root">
    姓:<input type="text" v-model="fistName"> <br><br>
    名:<input type="text" v-model="lastName"> <br><br>
    全名:<span>{{fullName}}</span>
</div>

<script type="text/javascript">
    const vm = new Vue({
        el: '#root',
        data() {
            return {
                fistName: '张',
                lastName: '三',
                fullName: '张-三'
            }
        },
        watch: {
            fistName(val) {
                this.fullName = val + '-' + this.lastName
            },
            lastName(val) {
                this.fullName = this.fistName + '-' + val
            }
        }
    })
</script>

</body>
</html>


对比 计算属性监听属性(侦听器)二者

// 计算属性
const vm = new Vue({
    el: '#root',
    data() {
        return {
            fistName: '张',
            lastName: '三'
        }
    },
    computed: {
        fullName() {
            return this.fistName + '-' + this.lastName
        }
    }
})
// 监听属性(侦听器)
const vm = new Vue({
    el: '#root',
    data() {
        return {
            fistName: '张',
            lastName: '三',
            fullName: '张-三'
        }
    },
    watch: {
        fistName(val) {
            this.fullName = val + '-' + this.lastName
        },
        lastName(val) {
            this.fullName = this.fistName + '-' + val
        }
    }
})

对比二者发现 监听属性 的代码是命令式且重复的,而 计算属性 好得多了



现在加上一个需求,输入 姓氏 后延迟一秒再显示全名

使用 监听属性 是这样实现的

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>姓名案例_监听属性实现_延迟一秒显示</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>

<div id="root">
    姓:<input type="text" v-model="fistName"> <br><br>
    名:<input type="text" v-model="lastName"> <br><br>
    全名:<span>{{fullName}}</span>
</div>

<script type="text/javascript">
    const vm = new Vue({
        el: '#root',
        data() {
            return {
                fistName: '张',
                lastName: '三',
                fullName: '张-三'
            }
        },
        watch: {
            fistName(val) {
                setTimeout(() => {
                    this.fullName = val + '-' + this.lastName
                }, 1000);
            },
            lastName(val) {
                this.fullName = this.fistName + '-' + val
            }
        }
    })
</script>

</body>
</html>

但是 计算属性 却不行



总结

Vue 计算属性和监听属性(侦听器)之间的区别

  1. 计算属性 能完成的功能,监听属性 都可以完成
  2. 监听属性 能完成的功能,计算属性 不一定可以完成,如 监听属性可以进行异步操作

备注

被 Vue 管理的函数,最好写成普通函数,这样 this 的指向才是 vm 或 组件实例

不被 Vue 管理的函数(定时器的回调函数、ajax 的回调函数、promise 的回调函数),

最好写成箭头函数,这样 this 的指向才是 vm 或 组件实例



posted @ 2022-04-07 09:36  春暖花开鸟  阅读(372)  评论(0编辑  收藏  举报