以下是 Vue 中 data
、watch
、created
和 methods
的詳細解釋,結合常見使用場景和示例:
1. data
:響應式數據容器
- 作用:定義組件的響應式數據(狀態),當數據變化時,視圖自動更新。
- 特點:
- 必須是一個函數,返回數據對象(避免多個組件實例共享同一對象)。
- 數據會被 Vue 的響應式系統劫持,自動追蹤變化。
- 示例:
data() {return {message: "Hello Vue!",count: 0}; }
- 在模板或方法中通過
this.message
訪問。
- 在模板或方法中通過
2. watch
:監聽數據變化
- 作用:觀察
data
或計算屬性的變化,執行副作用操作(如異步請求、復雜邏輯)。 - 特點:
- 支持深度監聽對象/數組內部變化(
deep: true
)。 - 可設置
immediate: true
在初始化時立即觸發回調。
- 支持深度監聽對象/數組內部變化(
- 示例:
watch: {count(newVal, oldVal) {console.log(`count 從 ${oldVal} 變為 ${newVal}`);},user: {handler(newVal) {// 監聽對象內部變化},deep: true,immediate: true} }
3. created
:生命周期鉤子
- 觸發時機:組件實例創建完成,數據觀測(
data
)已完成,但 DOM 未掛載。 - 典型用途:
- 初始化數據(如從 API 獲取數據)。
- 添加事件監聽(需在
beforeDestroy
中移除)。
- 示例:
created() {fetch("/api/data").then(response => response.json()).then(data => {this.message = data.message; // 更新響應式數據}); }
4. methods
:方法集合
- 作用:定義組件內的事件處理函數或工具方法。
- 特點:
- 方法中的
this
自動綁定到組件實例。 - 可直接修改
data
中的數據(觸發響應式更新)。
- 方法中的
- 示例:
methods: {increment() {this.count++; // 修改 data 中的 count},showAlert() {alert(this.message);} }
協作流程示例
export default {data() {return { count: 0 };},created() {// 初始化時設置 countthis.count = 10;},methods: {increment() {this.count++;}},watch: {count(newVal) {console.log("count 變化:", newVal);}}
};
created
鉤子將count
初始化為 10。- 用戶點擊按鈕觸發
increment
方法,count
增加。 watch
監聽到count
變化,打印日志。
關鍵區別
特性 | data | watch | created | methods |
---|---|---|---|---|
用途 | 存儲響應式數據 | 監聽數據變化 | 初始化操作 | 定義事件/邏輯方法 |
執行時機 | 組件初始化時生成 | 數據變化時觸發 | 組件創建后,DOM 前 | 按需調用 |
響應式 | 是 | 是(需顯式監聽) | 否 | 否 |
常見問題
-
為什么
data
必須是函數?
避免多個組件實例共享同一數據對象,導致狀態污染。 -
watch
vscomputed
computed
:依賴其他數據計算新值(緩存機制)。watch
:觀察數據變化執行副作用(如異步操作)。
-
created
vsmounted
created
:數據已初始化,DOM 未生成。mounted
:DOM 已掛載,可操作 DOM 元素。
案例搭載
功能說明
用戶可通過下拉框選擇設備模式(Bridge_VLAN35/Bridge_UNTAG/Router1)
選中值雙向綁定到 DeviceFromData.mode 字段
選項變化時觸發 deviceModeChange 方法
<el-select v-model="DeviceFromData.mode" @change="deviceModeChange"id="wansMesh_basic_device_mode_select"placeholder="請選擇設備模式"clearablefilterablestyle="width: 100%"
><el-option v-for="mode in deviceModes":key="mode.value":label="mode.label":value="mode.value":id="`mode-option-${mode.value}`":disabled="mode.disabled"/>
</el-select>
// Vue 數據部分
data() {return {DeviceFromData: {mode: '' // 初始值},deviceModes: [{ label: "Bridge_VLAN35", value: "bridge_vlan35",disabled: false },{ label: "Bridge_UNTAG", value: "bridge_untag",disabled: false },{ label: "Router1", value: "router",disabled: true // 示例禁用選項}]};
},
methods: {deviceModeChange(newVal) {console.log('模式已變更為:', newVal);// 可在此處添加業務邏輯}
}