計算屬性

来源:https://www.cnblogs.com/qt2019/archive/2019/03/02/10459783.html
-Advertisement-
Play Games

計算屬性 1.1 什麼是計算屬性: 插值表達式常用於簡單的運算,當其過長或邏輯複雜時,會難以維護,這時應該使用計算屬性。 插值表達式里的值是JS表達式 所有的計算屬性都以函數的形式寫在Vue實例內的computed選項內,最終返回計算後的結果。 1.2 計算屬性的用法 在一個計算屬性里可以完成各種復 ...


計算屬性

1.1 什麼是計算屬性:

插值表達式常用於簡單的運算,當其過長或邏輯複雜時,會難以維護,這時應該使用計算屬性。

插值表達式里的值是JS表達式

所有的計算屬性都以函數的形式寫在Vue實例內的computed選項內,最終返回計算後的結果。

 <!-- 
        將123,456 值反轉 456,123 
    -->
    <div id="app">
        <!-- 插值表達式用法 -->
        {{ text.split(',').reverse().join(',') }}
        <!-- 插值表達式用法 -->

        <!-- 計算屬性用法 -->
        {{ reversedText }}
        <!-- 計算屬性用法 -->
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
         var vm = new Vue({
             el:'#app',
             data:{
                 text:'123,456'
             },
             computed: {
                 reversedText:function(){
                     return this.text.split(',').reverse().join(',');
                 }
             },
         });
    </script>

1.2 計算屬性的用法

在一個計算屬性里可以完成各種複雜的邏輯,包括運算、函數等,只要最終返回一個結果就可以。

計算屬性可以以來多個Vue實例的數據,只要其中任一數據變化,計算屬性就會重新執行,視圖也會更新。

 <div id="app">
        總價:{{ prices }}
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
         var vm = new Vue({
             el:'#app',
             data:{
                package1:[
                    {
                        name:'iPhone 7',
                        price:7199,
                        count:2
                    },
                    {
                        name:'iPad',
                        price:2888,
                        count:1
                    },
                    {
                        name:'iPhone 7 Plus',
                        price:8239,
                        count:5
                    }
                ],
                package2:[
                    {
                        name:'apple',
                        price:3,
                        count:5
                    },
                    {
                        name:'banana',
                        price:2,
                        count:10
                    }
                ]
             },
             computed: {
                prices:function(){
                    let prices = 0;
                    for(let i = 0;i<this.package1.length;i++){
                        prices += this.package1[i].price * this.package1[i].count;
                    }
                    for(let i = 0;i<this.package2.length;i++){
                        prices += this.package2[i].price * this.package2[i].count;
                    }
                    return prices;
                }
             },
         });
    </script>

我們在控制台 vm.package1[0].count = 3; 總價的值就會相應的改變

每一個計算屬性都包含一個getter和一個setter,上面都是計算屬性的預設用法,只是利用了getter來讀取。

<div id="app">
        姓名:{{ fullName }}
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
         var vm = new Vue({
             el:'#app',
             data:{
                firstName:'Jack',
                lastName:'Green'
             },
             computed: {
                fullName:{
                    get:function(){
                        return this.firstName+' '+this.lastName;
                    },
                    set:function(newValue){
                        let names = newValue.split(' ');
                        this.firstName = names[0];
                        this.lastName =names[names.length - 1];
                    }
                }
             },
         });
    </script>

在你需要時,也可以提供一個setter函數,當手動修改計算屬性的值就像修改一個普通數據那樣時,就會觸發setter函數,執行一些自定義的操作。

app.fullName = 'Ross Joe';

<div id="app">
        姓名:{{ fullName }}
        複姓:{{ FXName }}
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
         var vm = new Vue({
             el:'#app',
             data:{
                firstName:'Jack',
                lastName:'Green'
             },
             computed: {
                fullName:{
                    get:function(){
                        return this.firstName+' '+this.lastName;
                    },
                    set:function(newValue){
                        let names = newValue.split(' ');
                        this.firstName = names[0];
                        this.lastName =names[names.length - 1];
                    }
                },
                 FXName:function(){
                     return 'zhuge '+this.fullName;
                 }
             },
         });
    </script>

計算屬性可以依賴其他計算屬性

   <div id="app1">    
    </div>
    
    <div id="app2">    
        {{ reversedText }}
        </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        var app1 =new Vue({
            el:'#app1',
            data:{
                text:'123,456'
            }
        });

        var app2 =new Vue({
            el:'#app2',
            computed: {
                reversedText:function(){
                   return app1.text.split(',').reverse().join(',');
                }
            },
        });
    </script>

計算屬性可以依賴當前Vue實例的數據,還可以依賴其他實例的數據

這樣的用法在組件和組件話里會用到

1.3 計算屬性緩存

<div id="app">
        <!-- 插值表達式用法 -->
        {{ text.split(',').reverse().join(',') }}
        <!-- 插值表達式用法 -->

        <!-- 計算屬性用法 -->
        {{ reversedText }}
        <!-- 計算屬性用法 -->

        <!-- 方法用法 -->
        {{ reversedMText() }}
        <!-- 方法用法 -->
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
         var vm = new Vue({
             el:'#app',
             data:{
                 text:'123,456'
             },
             methods:{
                reversedMText(){
                    return this.text.split(',').reverse().join(',');
                }
             },
             computed: {
                 reversedText:function(){
                     return this.text.split(',').reverse().join(',');
                 }
             }
         });
    </script>

methods里的方法與計算屬性起到同樣的作用,但是計算屬性是基於它的依賴緩存的。一個計算屬性所依賴的數據發生變化時,它才會重新取值。methods則不同,只要重新渲染,它就會被調用,因此函數也會被執行。

使用計算屬性還是methods取決於你是否需要緩存,當遍歷大數組和做大量計算時,應當使用計算屬性,除非你不希望得到緩存

參考:Vue.js實戰


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 繼承 記錄一下 javascript 的各種繼承方式,個人用得比較多的還是原型鏈繼承和 ES6 的 extends。 原型鏈繼承 缺點: 在創建 Child 的實例時,無法向 Parents 傳參 父類裡面的引用類型被共用,個例修改導致所有實例都被修改 借用構造函數 為瞭解決上面的問題 ,經典繼承方 ...
  • 作為一枚前段,我們知道對象類型在賦值的過程中其實是複製了地址,從而會導致改變了一方其他也都被改變的情況。通常在開發中我們不希望出現這樣的問題,我們可以使用淺拷貝來解決這個情況。 淺拷貝 首先可以通過Object.assign來解決這個問題,很多人認為這個函數是用來深拷貝的。其實並不是,Object. ...
  • 背景 經測試,android手機中沒有這個問題, iphone手機中的Safari瀏覽器會出現這個問題。 例如: 解決辦法: 給鏈接加上 target="_parent", 如果iframe的嵌套比較深可以用 target="_top" ...
  • 有時直接打開本地html文件會使一些web操作無法進行,需要運行一個本地伺服器。 使用nodejs的 可以迅速地啟動一個本地靜態資源伺服器 ...
  • 前言 本次做後臺管理系統,採用的是 AntD 框架。涉及到圖片的上傳,用的是AntD的 "upload" 組件。 前端做文件上傳這個功能,是很有技術難度的。既然框架給我們提供好了,那就直接用唄。結果用的時候,發現 upload 組件的很多bug。下麵來列舉幾個。 備註:本文寫於2019 03 02, ...
  • 背景 公司為提高客服部門溝通效率對接電話呼叫中心,調研後選擇了亞馬遜的Amazon Connect服務,因為是國外業務沒有選擇用阿裡雲,怕有坑。 Amazon Connect後臺 需要在後臺創建“聯繫流”,也就是用戶接通電話後我們提供的一系列功能選項,比如開始放一段歡迎語音,然後提示用戶選擇1,2, ...
  • 今天我們來詳解一下git的各種命令,此為git的第一篇,後續還會有好幾篇,希望大家看了能有所進步 Git Commit Git 倉庫中的提交記錄保存的是你的目錄下所有文件的快照,就像是把整個目錄複製,然後再粘貼一樣,但比複製粘貼優雅許多! Git 希望提交記錄儘可能地輕量,因此在你每次進行提交時,它 ...
  • 在JavaScript中,使用var創建變數,會創建全局變數或局部變數。 只有在非函數內創建的變數,才是全局變數,該變數可以在任何地方被讀取。 而在函數內創建變數時,只有在函數內部才可讀取。在函數外部時,調用函數也無法讀取局部變數。 function test(){ var g = 5; } // ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...