vue計(jì)算屬性

1. 什么是計(jì)算屬性

我們己經(jīng)可以搭建出一個(gè)簡(jiǎn)單的 Vue 應(yīng)用妓布,在模板中雙向綁定一些數(shù)據(jù)或表達(dá)式了叛拷。但是表達(dá)式如果過長(zhǎng)腾窝,或邏輯更為復(fù)雜時(shí)卷员,就會(huì)變得雕腫甚至難以閱讀和維護(hù)盈匾。

<div>
{{ text.split ( ’,’ ) ?reverse () . join (’,’)}}
</div>

這里的表達(dá)式包含 3 個(gè)操作,并不是很清晰毕骡,所以在遇到復(fù)雜的邏輯時(shí)應(yīng)該使用 計(jì)算屬性
所有的計(jì)算屬性都以函數(shù)的形式寫在 Vue 實(shí)例內(nèi)的computed 選項(xiàng)內(nèi)削饵,最終返回計(jì)算后的結(jié)果。

2.計(jì)算屬性的用法

在一個(gè)計(jì)算屬性里可以完成各種復(fù)雜的邏輯未巫,包括運(yùn)算窿撬、函數(shù)調(diào)用等,只要最終返回一個(gè)結(jié)果就可以叙凡。除了上例簡(jiǎn)單的用法

計(jì)算屬性還可以依賴多個(gè) Vue 實(shí)例的數(shù)據(jù)尤仍,只要其中任一數(shù)據(jù)變化,計(jì)算屬性就會(huì)重新執(zhí)行狭姨,視圖也會(huì)更新

getter和setter

每一個(gè)計(jì)算屬性都包含一個(gè) getter 和一個(gè) setter,我們上面的兩個(gè)示例都是計(jì)算屬性的默認(rèn)用法 苏遥, 只是利用了 getter來讀取饼拍。在你需要時(shí),也可以提供一個(gè) setter 函數(shù) 田炭, 當(dāng)手動(dòng)修改計(jì)算屬性的值就像修改一個(gè)普通數(shù)據(jù)那樣時(shí)师抄,就會(huì)觸發(fā) setter函數(shù),執(zhí)行一些自定義的操作
計(jì)算屬性除了上述簡(jiǎn)單的文本插值外教硫,還經(jīng)常用于動(dòng)態(tài)地設(shè)置元素的樣式名稱 class 和內(nèi)聯(lián)樣式 style

小技巧: 計(jì)算屬性還有兩個(gè)很實(shí)用的小技巧容易被忽略:

一是計(jì)算屬性可以依賴其他計(jì)算屬性:
二是計(jì)算屬性不僅可以依賴當(dāng)前 Vue 實(shí)例的數(shù)據(jù)叨吮,還可以依賴其他實(shí)例的數(shù)據(jù)

demo

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>計(jì)算屬性</title>
</head>
<body>
<div id="demo">
    {{text}} <br>
    {{text.split(',').reverse().join(',')}} <br>
    ----下邊是使用計(jì)算屬性得到的 <br>
    {{ reverseText }}
    <!--邏輯過長(zhǎng)就會(huì)變得臃腫,難以維護(hù)瞬矩,所以遇到復(fù)雜的邏輯時(shí)茶鉴,應(yīng)當(dāng)使用計(jì)算屬性-->
    <hr>
    計(jì)算屬性的緩存: <br>
    {{ now }} <br>
    通過methods拿到的時(shí)間戳(方法需要加括號(hào)): <br>
    {{ thisTime()}}
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script type="text/javascript">
    //需求:'123,456,789'編程789,456,123
    var app = new Vue({
        el:'#demo',
        data:{
            text:'123,456,789',
            msg:'nihao'
        },
        //定義計(jì)算屬性
        computed:{
            //如果計(jì)算屬性直接跟一個(gè)function,默認(rèn)的就是getter函數(shù)
           reverseText:function(){
                return this.text.split(',').reverse().join(',');
            },
            now:function(){
               return Date.now();
            }
        },
        methods:{
            thisTime: function(){
                return Date.now();
            }
        }
    })
</script>
</body>
</html>

3.3計(jì)算屬性的緩存

調(diào)用 methods 里的方法也可以與計(jì)算屬性起到同樣的作用
頁面中的方法: 如果是調(diào)用方法景用,只要頁面重新渲染涵叮。方法就會(huì)重新執(zhí)行,不需要渲染伞插,則不需要重新執(zhí)行

計(jì)算屬性:不管渲染不渲染割粮,只要計(jì)算屬性依賴的數(shù)據(jù)未發(fā)生變化,就永遠(yuǎn)不變

結(jié)論: 沒有使用計(jì)算屬性媚污,在 methods 里定義了一個(gè)方法實(shí)現(xiàn)了相同的效果舀瓢,甚至該方法還可以接受參數(shù),使用起來更靈活耗美。既然使用 methods 就可以實(shí)現(xiàn)京髓,那么為什么還需要計(jì)算屬性呢航缀?原因就是計(jì)算屬性是基于它的依賴緩存的。 一個(gè)計(jì)算屬性所依賴的數(shù)據(jù)發(fā)生變化時(shí)朵锣,它才會(huì)重新取值谬盐,所以text 只要不改變,計(jì)算屬性也就不更新

**何時(shí)使用: **-----------使用計(jì)算屬性還是 methods 取決于你是否需要緩存诚些,當(dāng)遍歷大數(shù)組和做大量計(jì)算時(shí)飞傀,應(yīng)當(dāng)使用計(jì)算屬性,除非你不希望得到緩存诬烹。

demo:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="abc">
    我的姓名是----{{fullName}}
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
    var app2 = new Vue({
        el:'#abc',
        data:{
            firstName : 'Zhang',
            lastName : 'Sanfeng'
        },
        computed:{
            //計(jì)算屬性的默認(rèn)用法是getter函數(shù)
            // fullName:function(){
            //     return this.firstName + ' '+this.lastName;
            // }
            //設(shè)置全成名字砸烦,就要調(diào)用set方法
            fullName:{
                get:function(){
                        return this.firstName + ' '+this.lastName;
                },
                set:function(newValue){
                    console.log('我是set方法。我被調(diào)用了')
                        //用逗號(hào)分隔 Liu,Bei
                   var names =  newValue.split(',');//分隔為數(shù)組
                    this.firstName = names[0];
                    this.lastName = names[1];
                }
            }
        }
    })
</script>
</body>
</html>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绞吁,一起剝皮案震驚了整個(gè)濱河市幢痘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌家破,老刑警劉巖颜说,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異汰聋,居然都是意外死亡门粪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門烹困,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玄妈,“玉大人,你說我怎么就攤上這事髓梅∧怛撸” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵枯饿,是天一觀的道長(zhǎng)酝锅。 經(jīng)常有香客問我,道長(zhǎng)奢方,這世上最難降的妖魔是什么屈张? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮袱巨,結(jié)果婚禮上阁谆,老公的妹妹穿的比我還像新娘。我一直安慰自己愉老,他們只是感情好场绿,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嫉入,像睡著了一般焰盗。 火紅的嫁衣襯著肌膚如雪璧尸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天熬拒,我揣著相機(jī)與錄音爷光,去河邊找鬼。 笑死澎粟,一個(gè)胖子當(dāng)著我的面吹牛蛀序,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播活烙,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼徐裸,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了啸盏?” 一聲冷哼從身側(cè)響起重贺,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎回懦,沒想到半個(gè)月后气笙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怯晕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年潜圃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贫贝。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蛉谜,靈堂內(nèi)的尸體忽然破棺而出稚晚,到底是詐尸還是另有隱情,我是刑警寧澤型诚,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布客燕,位于F島的核電站,受9級(jí)特大地震影響狰贯,放射性物質(zhì)發(fā)生泄漏也搓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一涵紊、第九天 我趴在偏房一處隱蔽的房頂上張望傍妒。 院中可真熱鬧,春花似錦摸柄、人聲如沸颤练。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗦玖。三九已至患雇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宇挫,已是汗流浹背苛吱。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留器瘪,地道東北人翠储。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像娱局,于是被迫代替她去往敵國(guó)和親彰亥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1. 計(jì)算屬性的定義 計(jì)算屬性是vue實(shí)例中的一個(gè)配置選項(xiàng):computed所有的計(jì)算屬性都以函數(shù)的形式寫在vue...
    春秋若北閱讀 1,513評(píng)論 0 1
  • 1衰齐、計(jì)算屬性的定義 我們己經(jīng)可以搭建出一個(gè)簡(jiǎn)單的 Vue 應(yīng)用任斋,在模板中雙向綁定一些數(shù)據(jù)或表達(dá)式了。但是表達(dá)式如果...
    飛天小豬_pig閱讀 1,640評(píng)論 0 1
  • 什么是計(jì)算屬性 我們己經(jīng)可以搭建出一個(gè)簡(jiǎn)單的 Vue 應(yīng)用耻涛,在模板中雙向綁定一些數(shù)據(jù)或表達(dá)式了废酷。但是表達(dá)式如果過長(zhǎng)...
    諾CIUM閱讀 3,614評(píng)論 0 1
  • 模板內(nèi)的表達(dá)式非常便利,但是設(shè)計(jì)它們的初衷是用于簡(jiǎn)單運(yùn)算的抹缕。在模板中放入太多的邏輯會(huì)讓模板過重且難以維護(hù)澈蟆。所以,對(duì)...
    wenmingxing閱讀 61評(píng)論 0 0
  • Vue的計(jì)算屬性(computed properties) 起因卓研? 雖然在模板中綁定表達(dá)式是非常便利的趴俘,但是它們實(shí)...
    codeTao閱讀 693評(píng)論 0 0