First
data 和 computed都是響應式的,先看看官方的說法:性能
Vue 實例的數據對象。Vue 將會遞歸將 data 的屬性轉換爲 getter/setter,從而讓 data 的屬性可以響應數據變化。
深刻理解響應式原理:
當你把一個普通的 JavaScript 對象傳給 Vue 實例的 data 選項,Vue 將遍歷此對象全部的屬性,並使用 Object.defineProperty 把這些屬性所有轉爲 getter/setter。
每一個組件實例都有相應的 watcher 實例對象,它會在組件渲染的過程當中把屬性記錄爲依賴,以後當依賴項的 setter 被調用時,會通知 watcher 從新計算,從而導致它關聯的組件得以更新。
原理以下圖:測試
2.二者的區別:this
當須要這種隨賦值變量的改動而改動的時候,仍是用計算屬性computed合適
若是實在要在data裏面聲明屬性,能夠先賦一個值,而後在methods裏面定義方法操做該屬性,效果等同,也會有響應式
測試如下代碼感覺如下:spa
<template> <div> <h2>num1是data中的變量,其初始值爲:{{num1}}</h2> <h2>點擊按鈕後,data中的num1變化爲:{{num1}}</h2> <h2>點擊按鈕後,computed中的c_num1變化爲:{{c_num1}}</h2> <button @click="outerNumChange">給num1+10</button> <hr> <h1>1.data定義的屬性不會由於它的賦值變量的變化而變化</h1> <h1>2.computed定義的屬性會隨它的賦值變量的變化而變化</h1> </div> </template> <script> let outer_obj1 = { no: 30 }; export default { data() { return { t: outer_obj1, //這樣,這個組件被屢次使用時,c_num1共享狀態。沒有這句,computed中的c_num1也不跟蹤狀態。 num1: outer_obj1.no }; }, computed: { c_num1() { return outer_obj1.no; } }, methods: { outerNumChange() { outer_obj1.no += 10; console.log(this.c_num1); } } }; </script> <style> </style>
以上代碼轉載自代碼來源.net