<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## [計算屬性](https://cn.vuejs.org/v2/guide/computed.html#計算屬性 "計算屬性") 模板內的表達式非常便利,但是設計它們的初衷是用于簡單運算的。在模板中放入太多的邏輯會讓模板過重且難以維護。例如: ~~~ <div id="example"> {{ message.split('').reverse().join('') }} </div> ~~~ 在這個地方,模板不再是簡單的聲明式邏輯。你必須看一段時間才能意識到,這里是想要顯示變量 `message` 的翻轉字符串。當你想要在模板中多次引用此處的翻轉字符串時,就會更加難以處理。 所以,對于任何復雜邏輯,你都應當使用**計算屬性**。 ### [基礎例子](https://cn.vuejs.org/v2/guide/computed.html#基礎例子 "基礎例子") ~~~ <div id="example"> <p>Original message: "{{ message }}"</p> <p>Computed reversed message: "{{ reversedMessage }}"</p> </div> ~~~ ~~~ var vm = new Vue({ el: '#example', data: { message: 'Hello' }, computed: { // 計算屬性的 getter reversedMessage: function () { // `this` 指向 vm 實例 return this.message.split('').reverse().join('') } } }) ~~~ 結果: Original message: "Hello" Computed reversed message: "olleH" 這里我們聲明了一個計算屬性 `reversedMessage`。我們提供的函數將用作屬性 `vm.reversedMessage` 的 getter 函數: ~~~ console.log(vm.reversedMessage) // => 'olleH' vm.message = 'Goodbye' console.log(vm.reversedMessage) // => 'eybdooG' ~~~ 你可以打開瀏覽器的控制臺,自行修改例子中的 vm。`vm.reversedMessage` 的值始終取決于 `vm.message` 的值。 你可以像綁定普通屬性一樣在模板中綁定計算屬性。Vue 知道 `vm.reversedMessage` 依賴于 `vm.message`,因此當 `vm.message` 發生改變時,所有依賴 `vm.reversedMessage` 的綁定也會更新。而且最妙的是我們已經以聲明的方式創建了這種依賴關系:計算屬性的 getter 函數是沒有副作用 (side effect) 的,這使它更易于測試和理解。 ### [計算屬性緩存 vs 方法](https://cn.vuejs.org/v2/guide/computed.html#計算屬性緩存-vs-方法 "計算屬性緩存 vs 方法") 你可能已經注意到我們可以通過在表達式中調用方法來達到同樣的效果: ~~~ <p>Reversed message: "{{ reversedMessage() }}"</p> ~~~ ~~~ // 在組件中 methods: { reversedMessage: function () { return this.message.split('').reverse().join('') } } ~~~ 我們可以將同一函數定義為一個方法而不是一個計算屬性。兩種方式的最終結果確實是完全相同的。然而,不同的是**計算屬性是基于它們的響應式依賴進行緩存的**。只在相關響應式依賴發生改變時它們才會重新求值。這就意味著只要 `message` 還沒有發生改變,多次訪問 `reversedMessage` 計算屬性會立即返回之前的計算結果,而不必再次執行函數。 這也同樣意味著下面的計算屬性將不再更新,因為 `Date.now()` 不是響應式依賴: ~~~ computed: { now: function () { return Date.now() } } ~~~ 相比之下,每當觸發重新渲染時,調用方法將**總會**再次執行函數。 我們為什么需要緩存?假設我們有一個性能開銷比較大的計算屬性 **A**,它需要遍歷一個巨大的數組并做大量的計算。然后我們可能有其他的計算屬性依賴于 **A** 。如果沒有緩存,我們將不可避免的多次執行 **A** 的 getter!如果你不希望有緩存,請用方法來替代。 ### [計算屬性 vs 偵聽屬性](https://cn.vuejs.org/v2/guide/computed.html#計算屬性-vs-偵聽屬性 "計算屬性 vs 偵聽屬性") Vue 提供了一種更通用的方式來觀察和響應 Vue 實例上的數據變動:**偵聽屬性**。當你有一些數據需要隨著其它數據變動而變動時,你很容易濫用 `watch`——特別是如果你之前使用過 AngularJS。然而,通常更好的做法是使用計算屬性而不是命令式的 `watch` 回調。細想一下這個例子: ~~~ <div id="demo">{{ fullName }}</div> ~~~ ~~~ var vm = new Vue({ el: '#demo', data: { firstName: 'Foo', lastName: 'Bar', fullName: 'Foo Bar' }, watch: { firstName: function (val) { this.fullName = val + ' ' + this.lastName }, lastName: function (val) { this.fullName = this.firstName + ' ' + val } } }) ~~~ 上面代碼是命令式且重復的。將它與計算屬性的版本進行比較: ~~~ var vm = new Vue({ el: '#demo', data: { firstName: 'Foo', lastName: 'Bar' }, computed: { fullName: function () { return this.firstName + ' ' + this.lastName } } }) ~~~ ### [計算屬性的 setter](https://cn.vuejs.org/v2/guide/computed.html#計算屬性的-setter "計算屬性的 setter") 計算屬性默認只有 getter ,不過在需要時你也可以提供一個 setter : ~~~ // ... computed: { fullName: { // getter get: function () { return this.firstName + ' ' + this.lastName }, // setter set: function (newValue) { var names = newValue.split(' ') this.firstName = names[0] this.lastName = names[names.length - 1] } } } // ... ~~~ 現在再運行 `vm.fullName = 'John Doe'` 時,setter 會被調用,`vm.firstName` 和 `vm.lastName` 也會相應地被更新。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看