Vue3 计算属性computed

文章目录

  • [Vue3 计算属性computed](#Vue3 计算属性computed)
    • [1. 引入-翻转字符串实例](#1. 引入-翻转字符串实例)
    • [2. computed vs methods](#2. computed vs methods)
    • [3. computed setter](#3. computed setter)

Vue3 计算属性computed

1. 引入-翻转字符串实例

计算属性关键词: computed。

计算属性在处理一些复杂逻辑时是很有用的。

  • 实例 1:模板变的很复杂起来,也不容易看懂理解

    html 复制代码
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>Vue 测试实例 计算属性-反转字符串</title>
        <script src="https://cdn.staticfile.org/vue/3.2.36/vue.global.min.js"></script>
    </head>
    <body>
    <!--创建一个id为app class为demo的div-->
    <div id="app" class="demo">
        {{ message.split('').reverse().join('') }}
    
    </div>
    
    <script>
        //    定义Vue3的HelloVueApp应用
        const HelloVueApp = {
            // 设置返回值message
            data() {
                return {
                   message: 'RUNOOB!'
                }
            }
        }
        // 创建HelloVueApp应用,mount('#app') 将 Vue 应用 HelloVueApp 挂载到 <div id="app" class="demo">中
        Vue.createApp(HelloVueApp).mount('#app')
    </script>
    </body>
    </html>
  • 实例2:使用了计算属性的实例

    声明了一个计算属性 reversedMessage 。

    提供的函数将用作属性 vm.reversedMessage 的 getter 。

    vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

    html 复制代码
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>Vue 测试实例 计算属性-反转字符串</title>
        <script src="https://cdn.staticfile.org/vue/3.2.36/vue.global.min.js"></script>
    </head>
    <body>
    <!--创建一个id为app class为demo的div-->
    <div id="app" class="demo">
        <p>原始字符串:{{ message }}</p>
    <!--    使用计算属性翻转字符串-->
        <p>计算后反转字符串: {{ reverseMessage}}</p>
    
    </div>
    
    <script>
        //    定义Vue3的HelloVueApp应用
        const HelloVueApp = {
            // 设置返回值message
            data() {
                return {
                   message: 'RUNOOB!'
                }
            },
            computed: {
            //     计算属性的getter实现翻转字符串
                reverseMessage: function () {
                //     this指向vm实例
                    return this.message.split('').reverse().join('')
                }
            }
        }
        // 创建HelloVueApp应用,mount('#app') 将 Vue 应用 HelloVueApp 挂载到 <div id="app" class="demo">中
        Vue.createApp(HelloVueApp).mount('#app')
    </script>
    </body>
    </html>

    页面效果:

2. computed vs methods

  • 我们可以使用 methods 来替代 computed,效果上两个都是一样的

  • 但是 computed 是基于它的依赖缓存 ,只有相关依赖发生改变时才会重新取值。

  • 而使用 methods ,在重新渲染的时候,函数总会重新调用执行。

  • computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

    html 复制代码
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>Vue 测试实例 计算属性VS.methods-反转字符串</title>
        <script src="https://cdn.staticfile.org/vue/3.2.36/vue.global.min.js"></script>
    </head>
    <body>
    <!--创建一个id为app class为demo的div-->
    <div id="app" class="demo">
        <p>原始字符串:{{ message }}</p>
    <!--    使用计算属性翻转字符串-->
        <p>使用计算属性computed计算后反转字符串: {{ reverseMessage}}</p>
    <!--    注意:使用methods定义方法,方法名后面必须带 -->
        <p>使用methods定义方法实现翻转字符串: {{ reverseMessage2() }}</p>
    </div>
    
    <script>
        //    定义Vue3的HelloVueApp应用
        const HelloVueApp = {
            // 设置返回值message
            data() {
                return {
                   message: 'RUNOOB!'
                }
            },
            computed: {
            //     计算属性的getter实现翻转字符串
                reverseMessage: function () {
                //     this指向vm实例
                    return this.message.split('').reverse().join('')
                }
            },
        //     使用methods实现翻转字符串
            methods: {
            //     定义翻转字符串函数
                reverseMessage2: function () {
                    return this.message.split('').reverse().join('')
                }
            }
        }
        // 创建HelloVueApp应用,mount('#app') 将 Vue 应用 HelloVueApp 挂载到 <div id="app" class="demo">中
        Vue.createApp(HelloVueApp).mount('#app')
    </script>
    </body>
    </html>

3. computed setter

  • computed 属性默认只有 getter ,不过在需要时也可以提供一个 setter :

    html 复制代码
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>Vue 测试实例 计算属性&Setter</title>
        <script src="https://cdn.staticfile.org/vue/3.2.36/vue.global.min.js"></script>
    </head>
    <body>
    <!--创建一个id为app class为demo的div-->
    <div id="app" class="demo">
    
    </div>
    
    <script>
        //    定义Vue3的HelloVueApp应用
        const HelloVueApp = {
            // 设置返回值message
            data() {
                return {
                    name: 'Google',
                    url: 'http://www.google.com'
                }
            },
            computed: {
            //     计算属性的getter
                site: {
                    get: function () {
                        return this.name + ' ' + this.url
                    },
                    //     计算属性的setter 对传入的newValue值自己写
                    set: function (newValue) {
                        // 将传入字符串的name和url分开 name和url用空格分开
                        var names = newValue.split(' ')
                        this.name = names[0]
                        this.url = names[names.length - 1]
                    }
                }
            }
        }
        // 创建HelloVueApp应用,mount('#app') 将 Vue 应用 HelloVueApp 挂载到 <div id="app" class="demo">中
        vm = Vue.createApp(HelloVueApp).mount('#app')
        document.write('name: ' + vm.name);
        document.write('<br>');
        document.write('url: ', vm.url);
        document.write('<br>');
        document.write('<br>-----------更新数据-------<br>')
        // 调用 setter更新site, vm.name 和 vm.url 也会被对应更新
        vm.site = '比亚迪官网 https://www.bydglobal.com/cn/index.html';
        document.write('name: ' + vm.name);
        document.write('<br>');
        document.write('url: ' + vm.url);
        document.write('<br>');
    
    
    
    
    </script>
    </body>
    </html>

    页面效果: vm.site = '比亚迪官网 https://www.bydglobal.com/cn/index.html'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。

相关推荐
treasure1403 小时前
【复古】浅尝Django前后端不分离
前端·css·python·django·bootstrap·html·web
jay神5 小时前
基于 YOLOv8 的手势识别系统(Web 版)
前端·人工智能·python·深度学习·yolo·计算机视觉·计算机毕业设计
屏什么录5 小时前
长时间录屏中途崩溃:MP4 打不开的 6 种救回方案与参数设置
前端·音视频开发
ruanno_top5 小时前
表单重置后,验证码还显示已通过:Vue 受控组件的 3 种假同步
vue.js
code_Bo5 小时前
不只命令行:我把跨 Agent 会话同步做成了桌面应用
前端·javascript·后端
kyriewen5 小时前
AI 能把页面写出来,为什么改个需求就开始崩?
前端·javascript·人工智能
OpsEye5 小时前
同一套用例跑两个大模型接口,差异到底出在哪
javascript·ai编程
X1A0RAN6 小时前
PPT 图片批量处理教程:导出全部幻灯片 · 提取全部素材
开发语言·javascript·powerpoint
涛涛ing6 小时前
2026年最值得关注的前端变化,藏在“默认值”里
前端
量化分析码农7 小时前
股票历史数据的复权参数对照:多级别返回的字段与数值差异
java·javascript·后端