Vue的computed爲什麼使用閉包函數傳值

如題,在使用Vue經常會遇到在computed傳值,根據入參去渲染數據。找到的網上信息只是告訴我通過閉包傳值,但是不知道爲什麼。

直接看代碼

<script type="text/x-template" id="hello-world-template">
    <div>
      <p>Original message: "{{ message }}"</p>
      <p>Computed reversed message: "{{ reversedMessage }}"</p>
      <p>Computed reversed message: "{{ reversedMessage1(2) }}"</p>
	</div>
</script>
<div id="example"></div>

<script>
var vm = new Vue({
    el: '#example',
    template: '#hello-world-template',
    data: {
      message: 'Hello'
    },
    computed: {
      reversedMessage: function() {
        return this.message.split('').reverse().join('')
      },
      // 計算屬性的 getter
      reversedMessage1: function() {
        return function reversedMessageget(y) {
          return this.message.split('').reverse().join('')+'___'+y;
        }
      },
    },
    mounted(){
      console.log(this)
    }
  })
</script>

Vue解析computed,本質上是在當前組件this下通過Object.defineProperties()方法創建新建一個reversedMessagereversedMessage1變量。
打印出來的this
但是在js的代碼看到reversedMessage是基本類型,reversedMessage1都是function。這是爲什麼呢?其實上面利用的就是definePropertiesget方法。
上面computed代碼可以轉換成這樣:

reversedMessage: {
  get: function () {
    return this.message.split('').reverse().join('')
  },
},
reversedMessage1: {
  get: function () {
    return function reversedMessageget(y) {
      var str = this.message.split('').reverse().join('');
      return str;
    }
  }
}

這樣就好理解,只是簡寫了變量的get方法,外面那層匿名函數就是個空殼子。
聲明變量的類型就是通過get裏的返回值,真正接收參數的是內部函數。

所以Vuecomputed是通過閉包函數進行傳值。

https://cn.vuejs.org/v2/guide/computed.html#基礎例子

嗨,沒好好看官網!就發了吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章