亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Vue使用Composition?API生成計(jì)算屬性computed

 更新時(shí)間:2023年06月20日 10:37:45   作者:海塔燈  
這篇文章主要為大家詳細(xì)介紹了Vue如何使用Composition?API實(shí)現(xiàn)生成計(jì)算屬性computed,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

概述

作為程序員我們都知道寫代碼不僅要高效完成需求,還要讓我們的代碼優(yōu)雅、可維護(hù)性更高。而可維護(hù)性即代碼的可讀性,因?yàn)槲覀儗懙拇a就是公司的財(cái)產(chǎn),當(dāng)需要其他人維護(hù)的時(shí)候,可讀性更高的代碼會(huì)讓維護(hù)你代碼的人更快上手。本文說的computed計(jì)算屬性就是為了這一目的來的,計(jì)算屬性可以讓我們的代碼看起來不臃腫,可讀性和可維護(hù)性更高,所以在介紹使用Compition Api生成計(jì)算屬性之前,我們需要先介紹下啥是計(jì)算屬性。

1. 計(jì)算屬性

1.1 計(jì)算屬性的介紹和使用

Vue的表達(dá)式很強(qiáng)大也很方便,但是寫簡(jiǎn)單的操作還行,復(fù)雜的操作雖然也沒啥大問題,但是會(huì)讓代碼變得很臃腫,導(dǎo)致可讀性變得很差,難以維護(hù)。引用官網(wǎng)的例子來了解計(jì)算屬性。

//.........省略開頭代碼.......
  data() {
    return {
      author: {
        name: 'John Doe',
        books: [
          'Vue 2 - Advanced Guide',
          'Vue 3 - Basic Guide',
          'Vue 4 - The Mystery'
        ]
      }
    }
  }

假設(shè)想根據(jù) author 是否已有一些書籍來展示不同的信息,如果使用表達(dá)式的方式如下:

<p>是否有已經(jīng)發(fā)布的書籍:</p>
<span>{{ author.books.length > 0 ? 'Yes' : 'No' }}</span>

上面的代碼看起來已經(jīng)顯示得有點(diǎn)復(fù)雜了,萬一我們需要在界面中的很多地方都這樣寫,就太臃腫了,同樣的代碼到處都在寫。所以引入了計(jì)算屬性來優(yōu)化這個(gè)問題。也許很多小伙伴會(huì)說用方法抽取呀,后面會(huì)介紹為啥不用方法。 使用計(jì)算屬性后上面的需求可以用如下的方式實(shí)現(xiàn),我們可以使用Vue提供的computed關(guān)鍵字定義計(jì)算屬性:

//.............省略開頭代碼.....
  data() {
    return {
      author: {
        name: 'John Doe',
        books: [
          'Vue 2 - Advanced Guide',
          'Vue 3 - Basic Guide',
          'Vue 4 - The Mystery'
        ]
      }
    }
  },
  computed: {
    // 一個(gè)計(jì)算屬性的 getter
    publishedBooksMessage() {
      // `this` 指向當(dāng)前組件實(shí)例
      return this.author.books.length > 0 ? 'Yes' : 'No'
    }
  }
//  ..........

在上面的代碼中,我們?cè)谶@里定義了一個(gè)計(jì)算屬性 publishedBooksMessage。當(dāng)我們更改此應(yīng)用的 data 中 books 數(shù)組的值后,可以看到 publishedBooksMessage 也會(huì)隨之改變。在模板中使用計(jì)算屬性的方式和一般的屬性并無二致。Vue 會(huì)檢測(cè)到 this.publishedBooksMessage 依賴于 this.author.books,所以當(dāng) this.author.books 改變時(shí),任何依賴于 this.publishedBooksMessage 的綁定都將同時(shí)更新。 (引用自Vue官網(wǎng)計(jì)算屬性章節(jié))

1.2 計(jì)算屬性和方法的區(qū)別

現(xiàn)在我們來解釋下為啥不用方法,Vue反而要提供一個(gè)計(jì)算屬性呢?我們繼續(xù)看例子來解釋。還是用上面的例子,我們同樣可以使用方法來完成需求

// 定義一個(gè)方法來判斷是否有新發(fā)布的作品
methods: {
  calculateBooksMessage() {
    return this.author.books.length > 0 ? 'Yes' : 'No'
  }
}
// 調(diào)用方法
<p>{{ calculateBooksMessage() }}</p>

如上面代碼所示,當(dāng)我們使用方法來實(shí)現(xiàn)上面的需求時(shí),執(zhí)行的結(jié)果確實(shí)是完全一致的,不同之處在于計(jì)算屬性值會(huì)基于其響應(yīng)式依賴被緩存。一個(gè)計(jì)算屬性僅會(huì)在其響應(yīng)式依賴更新時(shí)才重新計(jì)算。這意味著只要 author.books 不改變,無論多少次訪問 ,publishedBooksMessage 都會(huì)立即返回先前的計(jì)算結(jié)果,而不用重復(fù)執(zhí)行 getter 函數(shù) 也就是說,計(jì)算屬性會(huì)做一個(gè)緩存,只要計(jì)算屬性中參與計(jì)算的變量對(duì)應(yīng)的依賴不更新,計(jì)算屬性就會(huì)返回緩存的值,有更新才會(huì)重新計(jì)算。就比如本例中的books,只要我們不往books中添加新書,那么計(jì)算屬性publishedBooksMessage 會(huì)一直返回之前計(jì)算的值,不會(huì)觸發(fā)重新計(jì)算,而使用方法的話,每次都會(huì)去執(zhí)行方法,無論是否加入新書,都會(huì)執(zhí)行。這樣就會(huì)浪費(fèi)CPU資源,雖然不多,但是能省則省嘛。

使用計(jì)算屬性的另一個(gè)好處就是快,試想下你有一個(gè)很大的list想要渲染出來,使用方法的話,無論你是否更新list都需要執(zhí)行一遍遍歷拿length的操作,但是使用計(jì)算屬性,計(jì)算過一次后,只要后面沒有更新,就可以使用緩存,這樣就能提升頁面的響應(yīng)速度。

1.3 可寫計(jì)算屬性

計(jì)算屬性默認(rèn)是只讀的。當(dāng)你嘗試修改一個(gè)計(jì)算屬性時(shí),你會(huì)收到一個(gè)運(yùn)行時(shí)警告。因?yàn)橛?jì)算屬性主要是會(huì)緩存,如果隨意的寫會(huì)破壞之前緩存的值,導(dǎo)致下次取出緩存的值時(shí)導(dǎo)致值不是預(yù)期的。通常情況下我們只在某些特殊場(chǎng)景中才需要用到“可寫”的屬性,可寫的計(jì)算屬性可以通過同時(shí)提供 getter 和 setter 來創(chuàng)建,代碼如下:

  data() {
    return {
      firstName: 'John',
      lastName: 'Doe'
    }
  },
  computed: {
    fullName: {
      // getter
      get() {
        return this.firstName + ' ' + this.lastName
      },
      // setter
      set(newValue) {
        // 注意:我們這里使用的是解構(gòu)賦值語法
        [this.firstName, this.lastName] = newValue.split(' ')
      }
    }
  }

在上面的代碼中當(dāng)調(diào)用this.fullName = 'John Doe' 時(shí),setter 會(huì)被調(diào)用而 this.firstName 和 this.lastName 會(huì)隨之更新,get()方法是在每次取值時(shí)都會(huì)調(diào)用,而set方法是每次賦值時(shí)都會(huì)調(diào)用。

2.使用Compition API 生成計(jì)算屬性

在Compition API 中生成計(jì)算屬性其實(shí)就是把傳統(tǒng)Vue中使用的計(jì)算屬性寫到setup函數(shù)中,代碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>computed的使用</title>
    <script src="https://unpkg.com/vue@next"></script>
</head>
<body>
    <div id="root"></div>
</body>
<script>
const app = Vue.createApp({
    setup(){
        const{ref, computed} = Vue;
        const count = ref(0);
        const handleClick = ()=>{
            count.value += 1;
        }
        // 操作基本類型的值
        // const countAddFive = computed(()=>{
        //     return count.value + 5;
        // });
        let countAddFive = computed({
            get:() =>{
                return count.value + 5;
            },
            set:(param)=>{
                count.value = param  - 5;
            } 
        }) 
        setTimeout(()=>{
            countAddFive.value = 100;
        },3000)
        return {count,handleClick,countAddFive}
        },
   template:
         `
        <div>
            <span @click="handleClick">{{count}}--------{{countAddFive}}</span>
        </div>
         `
 });
 const vm = app.mount('#root');
</script>

上面的代碼中,我們?cè)趕etup中使用計(jì)算屬性時(shí)需要事先引入 const{ref, computed} = Vue;然后就是在setup()中使用,用法很簡(jiǎn)單,在代碼中已經(jīng) 很清晰了。代碼demo的意思也很簡(jiǎn)單,就是展示兩個(gè)值count,和countAddFive,點(diǎn)擊時(shí) 點(diǎn)擊時(shí),count的值加一,countAddFive加5,然后過了3秒后, 將countAddFive的值改成100,然后count的值會(huì)變成95,因?yàn)?/p>

 set:(param)=>{
                count.value = param  - 5;
            } 

設(shè)置conutAddFive的值時(shí)會(huì)將count的值減5。

總結(jié)

本文主要介紹了計(jì)算屬性和在Compition API 中使用計(jì)算屬性,學(xué)完本文,我們需要了解到在什么情況下需要使用計(jì)算屬性,計(jì)算屬性和方法的區(qū)別。以及了解可寫的計(jì)算屬性如何使用。計(jì)算屬性的使用可以極大的加快我們的界面響應(yīng)速度,建議讀者好好掌握計(jì)算屬性的使用,然后在項(xiàng)目中根據(jù)場(chǎng)景將計(jì)算屬性應(yīng)用到對(duì)應(yīng)的地方。

以上就是Vue使用Composition API生成計(jì)算屬性computed的詳細(xì)內(nèi)容,更多關(guān)于Vue計(jì)算屬性computed的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 淺析Vue 生命周期

    淺析Vue 生命周期

    這篇文章主要介紹了Vue 生命周期的過程,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-06-06
  • 初試vue-cli使用HBuilderx打包app的坑

    初試vue-cli使用HBuilderx打包app的坑

    這篇文章主要介紹了初試vue-cli使用HBuilderx打包app的坑,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Vue中如何定義數(shù)據(jù)示例詳解

    Vue中如何定義數(shù)據(jù)示例詳解

    這篇文章主要給大家介紹了關(guān)于Vue中如何定義數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-09-09
  • vue中el-dialog打開與關(guān)閉的幾種方式

    vue中el-dialog打開與關(guān)閉的幾種方式

    本文主要介紹了vue中el-dialog打開與關(guān)閉的幾種方式,包括 update:visible, ref和兄弟 bus這三種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • Vue2.0父組件與子組件之間的事件發(fā)射與接收實(shí)例代碼

    Vue2.0父組件與子組件之間的事件發(fā)射與接收實(shí)例代碼

    這篇文章主要介紹了Vue2.0父組件與子組件之間的事件發(fā)射與接收實(shí)例代碼,需要的朋友可以參考下
    2017-09-09
  • vue?大文件分片上傳(斷點(diǎn)續(xù)傳、并發(fā)上傳、秒傳)

    vue?大文件分片上傳(斷點(diǎn)續(xù)傳、并發(fā)上傳、秒傳)

    本文主要介紹了vue?大文件分片上傳,主要包括斷點(diǎn)續(xù)傳、并發(fā)上傳、秒傳,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • vite中的glob-import批量導(dǎo)入的實(shí)現(xiàn)

    vite中的glob-import批量導(dǎo)入的實(shí)現(xiàn)

    本文主要介紹了vite中的glob-import批量導(dǎo)入的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Vue項(xiàng)目中使用iView組件庫設(shè)置樣式不生效的解決方案

    Vue項(xiàng)目中使用iView組件庫設(shè)置樣式不生效的解決方案

    這篇文章主要介紹了Vue項(xiàng)目中使用iView組件庫設(shè)置樣式不生效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • VUE解決圖片視頻加載緩慢/首屏加載白屏的問題

    VUE解決圖片視頻加載緩慢/首屏加載白屏的問題

    在 Vue3 項(xiàng)目中,有時(shí)候會(huì)出現(xiàn)圖片視頻加載緩慢、首屏加載白屏的問題,所以本文小編就給大家詳細(xì)介紹一下如何解決圖片視頻加載緩慢/首屏加載白屏的問題,需要的朋友可以參考下
    2023-07-07
  • vue中v-show和v-if的異同及v-show用法

    vue中v-show和v-if的異同及v-show用法

    這篇文章主要介紹了vue中v-show和v-if的異同 ,通過代碼詳解v-show用法,本文給大家介紹的非常詳細(xì)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06

最新評(píng)論