亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Vue計算屬性的使用

2019-11-19 15:54:02
字體:
來源:轉載
供稿:網友

我們都知道在Vue構造函數的參數對象中有一個【data】屬性,該屬性值是一個對象,該對象是對數據的代理,是一個鍵值對并且時刻與頁面表現是一致的,但是這里面只能是簡單的鍵值對,不能擁有業務邏輯,并且由于【data】中的屬性屬于同一個生命周期,所以如果我們需要某一個屬性是依賴于另外一個屬性時,在【data】中是做不到的,于是Vue為我們提供了【計算屬性】

一、計算屬性

1.1 概述

計算屬性歸根結底也是屬性,它也是跟表現層是時刻同步的,雖然我們可以在插值中對數據進行各種處理,但是插值中的表達式處理畢竟只能用于簡單的運算,不能擁有太多的業務邏輯。

<body>  <div id="app">    <h1>{{name.toUpperCase()}}</h1>    <!-- <h1>BLUE</h1> -->  </div></body><script>  let vm = new Vue({    el: "#app",    data: {      name: 'blue'    }  })</script>

上面代碼是我們熟悉的在插值中使用表達式,但是這里面我們不能寫入業務代碼。

1.2 計算屬性語法

在構造函數的參數對象中有一個【computed】屬性,該屬性就是用于定義計算屬性的,該對象中的【鍵】也就是我們的計算屬性,與【data】不同的是,計算屬性的鍵值是一個【擁有返回值的函數】,該函數中可以訪問到【data】中的所有屬性。

<body>  <div id="app">    <h1>{{rs}}</h1>    <!-- <h1>BLUE LOVE PINK</h1> -->  </div></body><script>  let vm = new Vue({    el: "#app",    data: {      hs: 'BLUE',      wf: "PINK"    },    computed: {      rs:function(){        return `${this.hs} LOVE ${this.wf}`      }    }  })</script>

上面代碼屬性【rs】是定義的一個計算屬性,該屬性值是通過【data】中的兩個屬性值計算得到,返回一個拼接的字符串(這兒使用了ES6的【模板字符串】)并且當【data】中的相關值變化之后,【rs】屬性都會進行重新計算。

可能剛開始對計算屬性會有些疑惑,比如上面的例子我把代碼寫成下面這樣子也是可以的

<body>  <div id="app">    <h1>{{hs}} LOVE {{wf}}</h1>    <!-- <h1>BLUE LOVE PINK</h1> -->  </div></body><script>  let vm = new Vue({    el: "#app",    data: {      hs: 'BLUE',      wf: "PINK"    }  })</script>

上面的代碼運行效果和我們使用計算屬性的效果是一樣的,但是這樣的寫法只適用于簡單的處理,【計算屬性可以處理更復雜的業務邏輯】,比如我們根據【data】中的一個屬性值進行數據請求用于構建一個屬性,我們就必須使用計算屬性了。

【注意??!】計算屬性雖然是一個方法,但是在Vue內部會被翻譯成一個屬性,我們可以使用實例【vm.rs】訪問到數據的。

1.3 計算屬性和過濾器的比較

如果用于對【data】中【單個】屬性的【簡單】處理,推薦使用過濾器,但是如果一個值使用了【data】中至少2個值或者對一個值進行復雜處理,那么就推薦使用計算屬性了。

<body>  <div id="app">    <h1>{{hs | lover}}</h1>    <!-- <h1>BLUE LOVE PINK</h1> -->  </div></body><script>  let vm = new Vue({    el: "#app",    data: {      hs: 'BLUE',    },    filters: {      lover(value){        return `${value} LOVE PINK`      }    }  })</script>

上面代碼就使用了一個【data】屬性值做簡單的處理,所以使用過濾器,而且也發現了過濾字符串“LOVE PINK”是不可變的。

1.4 計算屬性和Methods的比較

計算屬性就是為了定屬性的時候處理復雜的業務邏輯,而且在插值中我們可以使用表達式,那么我們是否可以通過使用在插值中調用一個有返回值的函數呢?它和計算屬性又有什么區別呢?

<body>  <div id="app">    <h1>{{rs}}</h1>    <!-- <h1>EULB</h1> -->  </div></body><script>  let vm = new Vue({    el: "#app",    data: {      name: 'BLUE',    },    computed: {      rs: function () {        return [...this.name].reverse().join('');      }    }  })</script>

上面代碼將數據進行反向處理(使用了【ES6數組字符串擴展】 ),當我們改變name的值的時候,計算屬性【rs】會跟著改變。下面我們將它改成一個方法結合插值表達式進行處理,看看區別。

<body>  <div id="app">    <h1>{{ rs() }}</h1>    <!-- <h1>EULB</h1> -->  </div></body><script>  let vm = new Vue({    el: "#app",    data: {      name: 'BLUE',    },    methods: {      rs() {        return [...this.name].reverse().join('');      }    }  })</script>

上面代碼將計算屬性改成了一個方法結合插值表達式,發現效果和計算屬性沒差別,改變name的值的時候頁面也刷新了。那是不是這兩者就真的沒區別呢,答案當然是否定的,如果沒有區別干嘛還有計算屬性的存在。

【計算屬性是基于依賴進行緩存的】,只有計算屬性的依賴發生改變時才會重新求值,也就是說如果依賴沒有發生改變,那么計算屬性會立刻返回之前的計算結果,假如我們有一個性能開銷比較大的的計算屬性 A ,它需要遍歷一個極大的數組和做大量的計算。然后我們可能有其他的計算屬性依賴于 A 。如果沒有緩存,我們將不可避免的多次執行 A 的 getter!如果你不希望有緩存,請用 method 替代。

1.5 計算屬性和Watch的比較

我們發現計算屬性會監聽依賴,如果依賴發生變化則會從新計算屬性,那么【監聽器】也有這么一個功能,那么我們應該在什么時候使用【計算屬性】,什么時候使用【監聽器】呢?

<body>  <div id="app">    <h1>{{fullName}}</h1>  </div></body><script>  let vm = new Vue({    el: "#app",    data: {      firstName: 'Jack',      lastName: 'Blue',      fullName: 'Jack Blue'    },    watch: {      firstName: function (val) {        this.fullName = val + ' ' + this.lastName      },      lastName: function (val) {        this.fullName = this.firstName + ' ' + val      }    }  })</script>

上面代碼中我們監聽firstName和lastName用于構建fullName,效果很好,當firstName和lastName任意一個值改變的時候fullName都會隨之改變。下面我們看一下計算屬性的寫法

<body>  <div id="app">    <h1>{{fullName}}</h1>    <!-- <h1>Jack Blue</h1> -->  </div></body><script>  let vm = new Vue({    el: "#app",    data: {      firstName: 'Jack',      lastName: 'Blue',    },    computed: {      fullName() {        return this.firstName + ' ' + this.lastName      }    }  })</script>

上面代碼使用計算屬性的方式進行了改造,fullName 依賴 firstName和 lastName 兩個屬性,當這兩個屬性任意一個發生變化,fullname都會重新進行計算。但是計算屬性是不是簡潔了很多呢!

【總結??!】當一個屬性需要依賴多個【data】中的屬性時,建議使用計算屬性,如果我們不是對屬性進行操作,只是單純的依據【data】中的某個值變化后做一些【非屬性操作】時或者是在數據變化響應時,【執行異步操作或開銷較大的操作】(比如:將變化后的值存入數據庫,而不是改變其他屬性)就使用Watch。

1.6 計算屬性的setter

上面我們是使用的計算屬性都是用于對計算屬性的取值,計算屬性默認頁只給了【getter】,但是在需要的時候我們可以人為的添加【setter】

<body>  <div id="app">    <h1>{{fullName}}</h1>    <!-- <h1>Jack Blue</h1> -->  </div></body><script>  let vm = new Vue({    el: "#app",    data: {      firstName: 'Jack',      lastName: 'Blue',    },    computed: {      fullName: {        //getter        get() {          return this.firstName + ' ' + this.lastName        },        //setter        set(newValue) {          var names = newValue.split(' ')          this.firstName = names[0]          this.lastName = names[names.length - 1]        }      }    }  })</script>

上面代碼定義了計算屬性的一個setter,注意當需要定義setter的時候語法上面是有區別的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品久久久久久久久| 欧美伦理91i| 亚洲欧美激情在线视频| 国产一区香蕉久久| 粉嫩av一区二区三区免费野| 精品国产成人在线| 久久精品亚洲94久久精品| 国产亚洲xxx| 亚洲午夜久久久影院| 国产精品99久久99久久久二8| 欧美成人精品一区二区| 国产婷婷色综合av蜜臀av| 亚洲最大中文字幕| 91精品国产九九九久久久亚洲| 亚洲男人第一av网站| 国产欧美精品一区二区三区-老狼| 亚洲无限乱码一二三四麻| 久久久久久成人精品| 色久欧美在线视频观看| 亚洲美女中文字幕| 91免费观看网站| 成人网址在线观看| 亚洲欧美日韩中文在线| 国产丝袜一区二区三区免费视频| 国产欧美日韩精品在线观看| 中文字幕久精品免费视频| 国产视频在线观看一区二区| 日韩精品免费在线视频观看| 日韩在线免费视频观看| 国产精品电影网站| 国产亚洲xxx| 亚洲国产精品久久久久秋霞蜜臀| 日韩网站免费观看高清| 伊人男人综合视频网| 亚洲综合日韩在线| 国产精品福利网| 国产乱人伦真实精品视频| …久久精品99久久香蕉国产| 日本久久久久久久久| 亚洲欧美日韩一区二区三区在线| 久久久噜噜噜久久中文字免| 成人黄色在线免费| 91亚洲va在线va天堂va国| 欧美性少妇18aaaa视频| 亚洲a级在线观看| 欧美国产视频一区二区| 欧美日韩国产中文字幕| 国产一区二区三区三区在线观看| 色久欧美在线视频观看| 热99久久精品| 国产日本欧美一区二区三区在线| 亚洲视频在线免费观看| 久久久久久久激情视频| 亚洲免费一在线| 色偷偷av一区二区三区乱| 欧美中文在线视频| 一区二区欧美亚洲| 亚洲国产精品嫩草影院久久| 亚洲人精选亚洲人成在线| 播播国产欧美激情| 日本久久精品视频| 国产成+人+综合+亚洲欧美丁香花| 欧洲美女免费图片一区| 欧美成人精品三级在线观看| 亚洲男人第一网站| 亚洲成人精品久久| 日韩资源在线观看| 97久久伊人激情网| 中文字幕国产精品| 久久夜色精品国产亚洲aⅴ| 91视频国产一区| 亚洲精品不卡在线| 欧美巨乳在线观看| 欧美激情按摩在线| 91影视免费在线观看| 视频在线观看一区二区| 亚洲男人7777| 超碰97人人做人人爱少妇| 亚洲第一免费播放区| 久久久久久69| 欧美第一黄色网| 在线看欧美日韩| 91在线高清视频| 宅男66日本亚洲欧美视频| 亚洲视频日韩精品| 欧美成人在线免费| 亚洲全黄一级网站| 欧美日韩国产一区中文午夜| 日韩一区二区久久久| 日韩久久精品电影| 欧美午夜激情视频| 国产在线一区二区三区| 精品一区二区电影| 精品久久香蕉国产线看观看亚洲| 国产精品日韩一区| 日韩电视剧在线观看免费网站| 国产精品v日韩精品| 久久99久国产精品黄毛片入口| 国产精品中文字幕久久久| 日韩在线观看免费高清完整版| 欧美成人午夜激情在线| 成人亚洲欧美一区二区三区| 亚洲黄色www| 欧美午夜片欧美片在线观看| 欧美日韩性视频| 国产精品jizz在线观看麻豆| 插插插亚洲综合网| 久久国产色av| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲mm色国产网站| 亚洲一区二区三区毛片| 国产一区二区香蕉| 亚洲成年人影院在线| 久久久精品国产亚洲| 欧美电影电视剧在线观看| 国产精品中文久久久久久久| www国产亚洲精品久久网站| 亚洲性线免费观看视频成熟| 国产精品欧美激情在线播放| 国产精品美女在线观看| 精品国产1区2区| 亚洲精品98久久久久久中文字幕| 欧美久久精品午夜青青大伊人| 久久久噜噜噜久久久| 日韩精品一二三四区| 国产视频精品xxxx| 国产精品成人av性教育| 亚洲国产精彩中文乱码av在线播放| 亚洲女人被黑人巨大进入al| 性欧美xxxx| 亚洲欧洲美洲在线综合| 久久亚洲欧美日韩精品专区| 亚洲a∨日韩av高清在线观看| 欧美成人亚洲成人| 亚洲欧美日韩综合| 九九热精品视频国产| 91免费福利视频| 国产精品第七十二页| 中文字幕久精品免费视频| 国产成人一区二区| 久久精品国产一区二区电影| 国产精品精品久久久久久| 在线亚洲午夜片av大片| 91亚洲精品在线观看| 三级精品视频久久久久| 18一19gay欧美视频网站| 中文字幕国产精品久久| 久久综合色影院| 国语自产精品视频在免费| 久久噜噜噜精品国产亚洲综合| 亚洲欧美综合区自拍另类| 国产精品免费看久久久香蕉| 午夜精品美女自拍福到在线| 性色av一区二区三区红粉影视| 欧美在线欧美在线| 欧美成人激情图片网| 亚洲午夜未删减在线观看| 日韩精品视频在线观看免费| 国产男女猛烈无遮挡91| 精品久久久久久久久久久久久| 国内偷自视频区视频综合| 亚洲片在线观看| 亚洲黄色av女优在线观看| 国产精品18久久久久久首页狼|