最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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í)候,可讀性更高的代碼會讓維護(hù)你代碼的人更快上手。本文說的computed計(jì)算屬性就是為了這一目的來的,計(jì)算屬性可以讓我們的代碼看起來不臃腫,可讀性和可維護(hù)性更高,所以在介紹使用Compition Api生成計(jì)算屬性之前,我們需要先介紹下啥是計(jì)算屬性。

1. 計(jì)算屬性

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

Vue的表達(dá)式很強(qiáng)大也很方便,但是寫簡單的操作還行,復(fù)雜的操作雖然也沒啥大問題,但是會讓代碼變得很臃腫,導(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è)問題。也許很多小伙伴會說用方法抽取呀,后面會介紹為啥不用方法。 使用計(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'
    }
  }
//  ..........

在上面的代碼中,我們在這里定義了一個(gè)計(jì)算屬性 publishedBooksMessage。當(dāng)我們更改此應(yīng)用的 data 中 books 數(shù)組的值后,可以看到 publishedBooksMessage 也會隨之改變。在模板中使用計(jì)算屬性的方式和一般的屬性并無二致。Vue 會檢測到 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ì)算屬性值會基于其響應(yīng)式依賴被緩存。一個(gè)計(jì)算屬性僅會在其響應(yīng)式依賴更新時(shí)才重新計(jì)算。這意味著只要 author.books 不改變,無論多少次訪問 ,publishedBooksMessage 都會立即返回先前的計(jì)算結(jié)果,而不用重復(fù)執(zhí)行 getter 函數(shù) 也就是說,計(jì)算屬性會做一個(gè)緩存,只要計(jì)算屬性中參與計(jì)算的變量對應(yīng)的依賴不更新,計(jì)算屬性就會返回緩存的值,有更新才會重新計(jì)算。就比如本例中的books,只要我們不往books中添加新書,那么計(jì)算屬性publishedBooksMessage 會一直返回之前計(jì)算的值,不會觸發(fā)重新計(jì)算,而使用方法的話,每次都會去執(zhí)行方法,無論是否加入新書,都會執(zhí)行。這樣就會浪費(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í),你會收到一個(gè)運(yùn)行時(shí)警告。因?yàn)橛?jì)算屬性主要是會緩存,如果隨意的寫會破壞之前緩存的值,導(dǎo)致下次取出緩存的值時(shí)導(dǎo)致值不是預(yù)期的。通常情況下我們只在某些特殊場景中才需要用到“可寫”的屬性,可寫的計(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 會被調(diào)用而 this.firstName 和 this.lastName 會隨之更新,get()方法是在每次取值時(shí)都會調(diào)用,而set方法是每次賦值時(shí)都會調(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>

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

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

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

總結(jié)

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

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

相關(guān)文章

  • Vue3插槽Slot實(shí)現(xiàn)原理詳解

    Vue3插槽Slot實(shí)現(xiàn)原理詳解

    這篇文章主要為大家介紹了Vue3插槽Slot實(shí)現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Vue項(xiàng)目開發(fā)常見問題和解決方案總結(jié)

    Vue項(xiàng)目開發(fā)常見問題和解決方案總結(jié)

    這篇文章主要介紹了Vue項(xiàng)目開發(fā)常見問題和解決方案總結(jié),幫助大家更好的利用vue開發(fā),感興趣的朋友可以了解下
    2020-09-09
  • Vuex 在Vue 組件中獲得Vuex 狀態(tài)state的方法

    Vuex 在Vue 組件中獲得Vuex 狀態(tài)state的方法

    今天小編就為大家分享一篇Vuex 在Vue 組件中獲得Vuex 狀態(tài)state的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • Vue3?入口文件createApp函數(shù)詳解

    Vue3?入口文件createApp函數(shù)詳解

    這篇文章主要介紹了Vue3?入口文件createApp函數(shù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • vue組件中實(shí)現(xiàn)嵌套子組件案例

    vue組件中實(shí)現(xiàn)嵌套子組件案例

    這篇文章主要介紹了vue組件中實(shí)現(xiàn)嵌套子組件案例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • VUE組件中的 Drawer 抽屜實(shí)現(xiàn)代碼

    VUE組件中的 Drawer 抽屜實(shí)現(xiàn)代碼

    這篇文章主要介紹了VUE組件 之 Drawer 抽屜 ,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Vue.js上傳圖片到阿里云OSS存儲的方法示例

    Vue.js上傳圖片到阿里云OSS存儲的方法示例

    這篇文章主要介紹了Vue.js上傳圖片到阿里云OSS存儲的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-12-12
  • Vue跳轉(zhuǎn)頁面的幾種常用方法總結(jié)

    Vue跳轉(zhuǎn)頁面的幾種常用方法總結(jié)

    在Vue.js中,頁面跳轉(zhuǎn)是構(gòu)建單頁面應(yīng)用(SPA)的基本操作之一,本文將介紹Vue中實(shí)現(xiàn)頁面跳轉(zhuǎn)的幾種方法,并通過實(shí)例代碼幫助理解每種方法的用法,需要的朋友可以參考下
    2024-09-09
  • vue3使用echarts繪制折線圖的代碼示例

    vue3使用echarts繪制折線圖的代碼示例

    這篇文章主要為大家學(xué)習(xí)介紹了Vue3如何使用echarts實(shí)現(xiàn)繪制折線圖,文中有詳細(xì)的示例代碼供大家參考,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-07-07
  • 使用vue-touch報(bào)priority錯(cuò)誤的解決

    使用vue-touch報(bào)priority錯(cuò)誤的解決

    這篇文章主要介紹了使用vue-touch報(bào)priority錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評論

南昌市| 砀山县| 新邵县| 高雄县| 元朗区| 三门县| 健康| 渝北区| 万年县| 调兵山市| 云安县| 广南县| 铁岭市| 平潭县| 应城市| 永顺县| 乌海市| 鲜城| 泊头市| 清河县| 汽车| 宁陵县| 萨迦县| 抚宁县| 延津县| 西充县| 石泉县| 高碑店市| 南充市| 浏阳市| 资阳市| 定州市| 吉隆县| 枞阳县| 香港| 天津市| 阿鲁科尔沁旗| 平罗县| 灵山县| 夏邑县| 彩票|