目錄
1 計算屬性 computed
2 方法methods
3 偵聽器watch
首頁 web前端 Vue.js 聊聊Vue中的計算屬性、方法與偵聽器

聊聊Vue中的計算屬性、方法與偵聽器

Mar 29, 2023 pm 05:54 PM
javascript 前端 vue.js

這篇文章帶大家學習Vue,聊聊Vue基礎理論實操,介紹一下Vue中的計算屬性、方法與偵聽器 ,希望對大家有所幫助!

聊聊Vue中的計算屬性、方法與偵聽器

需求:在data 中,有firstName 和lastName 兩個內容,頁面顯示「全名fullName 」。

透過上一篇文章可以知道,我們直接使用插值表達式就能實現這個需求:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>前端一万小时-计算属性、方法与侦听器</title>
  <script src="./vue.js"></script>
</head>
<body>
  <div id="app">
    {{firstName + &#39; &#39; + lastName}} <!-- 2️⃣使用插值表达式展示全名。 -->
  </div>

  <script>
    var vm = new Vue({
      el: &#39;#app&#39;,

      data: { // 1️⃣在 data 中定义一组数据,里面有 firstName 和 lastName 两个内容;
        firstName: &#39;Oli&#39;,
        lastName: &#39;Zhao&#39;
      }
    })
  </script>
</body>
</html>
登入後複製

聊聊Vue中的計算屬性、方法與偵聽器

但需求是實現了,可同時模板上就有了一些邏輯。而模板本身就是用來顯示就好,不需要添加邏輯在裡面! 【相關推薦:vuejs影片教學web前端開發

#理想的方式是在插值表達式中直接加入fullName 變數來顯示全名:

<div id="app">
  {{fullName}}
</div>

<script>
  var vm = new Vue({
    el: &#39;#app&#39;,
    data: {
      firstName: &#39;Oli&#39;,
      lastName: &#39;Zhao&#39;,
      fullName: &#39;Oli Zhao&#39; // ❗️data 中添加了 fullName!
    }
  })
</script>
登入後複製

聊聊Vue中的計算屬性、方法與偵聽器

可以看到,當程式碼這樣寫時也是沒有問題的。

但其實程式碼冗餘了:原本data 內已經有了firstNamelastName ,可以用它們組合出全名,但又重新定義了一次fullName

接下來,將介紹另外三種方法來解決這個需求。

1 計算屬性 computed

<div id="app">
  {{fullName}}
</div>

<script>
  var vm = new Vue({
    el: &#39;#app&#39;,
    data: {
      firstName: &#39;Oli&#39;,
      lastName: &#39;Zhao&#39;
    },

    computed: { // 1️⃣计算属性 computed 属于 Vue 实例的方法,直接定义在实例中;

      fullName() { // 2️⃣计算属性的值 fullName 是一个函数;

        return this.firstName + &#39; &#39; + this.lastName // ❗️一定要写上 return 把计算结果返回!
      }
    }
  })
</script>
登入後複製

使用計算屬性後,程式碼完全不會冗餘,fullName 是根據firstNamelastName 計算出來的,頁面上的效果也是一樣。 聊聊Vue中的計算屬性、方法與偵聽器

計算屬性還有一個非常重要的知識點:

計算屬性會基於它們的回應式依賴進行快取。

也就是說,當計算屬性所依賴的資料改變時,它會重新計算;若沒有變更時,則不計算,會一直使用上一次計算的結果(這樣也就提高了一些性能)。

在我們的程式碼中,當firstNamelastName 改變時,fullName 會重新計算,不變時則用快取的上次計算結果。

<div id="app">
  {{fullName}}

  {{age}} <!-- 2️⃣把 age 渲染到模板上; -->
  
</div>

<script>
  var vm = new Vue({
    el: &#39;#app&#39;,
    data: {
      firstName: &#39;Oli&#39;,
      lastName: &#39;Zhao&#39;,

      age: 18 // 1️⃣data 中添加 age 为 18;
    },
    computed: {
      fullName() {
        console.log(&#39;计算了一次&#39;) // 3️⃣每当执行时 console.log 一次。
        return this.firstName + &#39; &#39; + this.lastName
      }
    }
  })
</script>
登入後複製

儲存重新整理網頁後,可以看到計算屬性 計算了一次 。當在控制台輸入vm.age = 20 更改age 後,頁面重新渲染了,“18”變為了“20”,但控制台沒有再次輸出計算了一次 ,即計算屬性沒有進行重新計算。

聊聊Vue中的計算屬性、方法與偵聽器

而當我們改變lastName 後,會重新計算一次:

聊聊Vue中的計算屬性、方法與偵聽器

2 方法methods

第二種是我們已經很熟悉的方法 methods

<div id="app">

  <!-- ❗️注意:在插值表达式内,计算属性通过属性的名字就可以用,但调用方法时,
	一定要加上 () 来进行调用! -->
  {{fullName()}}

  {{age}}
</div>

<script>
  var vm = new Vue({
    el: &#39;#app&#39;,
    data: {
      firstName: &#39;Oli&#39;,
      lastName: &#39;Zhao&#39;,
      age: 18
    },

    methods: { // ❗️在 methods 中定义 fullName 方法,逻辑上与计算属性一样;
      fullName() { 
        console.log(&#39;计算了一次&#39;)
        return this.firstName + &#39; &#39; + this.lastName
      }
    }

  })
</script>
登入後複製

儲存後,刷新頁面查看效果時,它會進行一次計算。當我們更改age 時,它會再計算一次,更改lastName 時也會進行一次計算:聊聊Vue中的計算屬性、方法與偵聽器

所以方法是沒有緩存機制的,只要頁面重新渲染, fullName 方法就會被重新執行一次

3 偵聽器watch

當使用偵聽器時,不可避免的會讓程式碼冗餘:

<div id="app">

  {{fullName}} <!-- 1️⃣-②:插值表达式内不需要 (); -->

  {{age}}
</div>

<script>
  var vm = new Vue({
    el: &#39;#app&#39;,
    data: {
      firstName: &#39;Oli&#39;,
      lastName: &#39;Zhao&#39;,
      fullName: &#39;Oli Zhao&#39;, // 1️⃣-①:data 中定义 fullName;
      age: 18
    },

    watch: {  // 2️⃣在实例中定义侦听器 watch;

      firstName() { /*
      							2️⃣-①:定义 firstName 方法,对 firstName 进行侦听,
                    当它改变时,重新对 fullName 赋值;
                     */
        console.log(&#39;计算了一次&#39;)
        this.fullName = this.firstName + &#39; &#39; + this.lastName
      },

      lastName() { /*
      						 2️⃣-②:定义 lastName 方法,对 lastName 进行侦听,
                   当它改变时,重新对 fullName 赋值。
                    */
        console.log(&#39;计算了一次&#39;)
        this.fullName = this.firstName + &#39; &#39; + this.lastName
      }
    }

  })
</script>
登入後複製

儲存後回到頁面重新整理。當第一次進入頁面時,因為我們重新定義過 fullName ,所以 watch 不會進行計算就會顯示出來。在修改與fullName 不想關的資料age 後,由於我們只用watch 偵聽了firstNamelastName ,所以也不會進行計算。當我們修改 lastName 時,則進行一次計算:

聊聊Vue中的計算屬性、方法與偵聽器

#總結:

  • methods 會在每次渲染頁面都執行一次方法;
  • watchcomputed 都具備快取機制,但watch 的文法比computed 的文法複雜了許多。

所以一般情況下,當一個功能可以透過watch 、 methods 和computed 方法都可以實現時,首推「計算屬性computed 」。

(學習影片分享:vuejs入門教學程式設計基礎影片

以上是聊聊Vue中的計算屬性、方法與偵聽器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PHP與Vue:完美搭檔的前端開發利器 PHP與Vue:完美搭檔的前端開發利器 Mar 16, 2024 pm 12:09 PM

PHP與Vue:完美搭檔的前端開發利器

前端面試官常問的問題 前端面試官常問的問題 Mar 19, 2024 pm 02:24 PM

前端面試官常問的問題

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

簡易JavaScript教學:取得HTTP狀態碼的方法

Django是前端還是後端?一探究竟! Django是前端還是後端?一探究竟! Jan 19, 2024 am 08:37 AM

Django是前端還是後端?一探究竟!

什麼是前端模組化ESM? 什麼是前端模組化ESM? Feb 25, 2024 am 11:48 AM

什麼是前端模組化ESM?

如何在JavaScript中取得HTTP狀態碼的簡單方法 如何在JavaScript中取得HTTP狀態碼的簡單方法 Jan 05, 2024 pm 01:37 PM

如何在JavaScript中取得HTTP狀態碼的簡單方法

Go語言前端技術探秘:前端開發新視野 Go語言前端技術探秘:前端開發新視野 Mar 28, 2024 pm 01:06 PM

Go語言前端技術探秘:前端開發新視野

從PHP後端到前端開發的轉變之路 從PHP後端到前端開發的轉變之路 Mar 12, 2024 pm 06:45 PM

從PHP後端到前端開發的轉變之路

See all articles