actions
ใน Vuex เป็นแบบอะซิงโครนัส วิธีเดียวที่จะทำให้ฟังก์ชันการโทร (ผู้เริ่มต้นดำเนินการ) ทราบว่าการดำเนินการเสร็จสมบูรณ์แล้ว - คือการส่งคืนคำสัญญาและแก้ไขในภายหลัง
นี่คือตัวอย่าง: myAction
ส่งคืน a Promise
, ทำการโทร http และแก้ไขหรือปฏิเสธในPromise
ภายหลัง - ทั้งหมดแบบอะซิงโครนัส
actions: {
myAction(context, data) {
return new Promise((resolve, reject) => {
// Do something here... lets say, a http call using vue-resource
this.$http("/api/something").then(response => {
// http success, call the mutator and change something in state
resolve(response); // Let the calling function know that http is done. You may send some data back
}, error => {
// http failed, let the calling function know that action did not work out
reject(error);
})
})
}
}
ตอนนี้เมื่อคอมโพเนนต์ Vue ของคุณเริ่มmyAction
ทำงานมันจะได้รับวัตถุ Promise นี้และสามารถรู้ได้ว่ามันสำเร็จหรือไม่ นี่คือโค้ดตัวอย่างสำหรับคอมโพเนนต์ Vue:
export default {
mounted: function() {
// This component just got created. Lets fetch some data here using an action
this.$store.dispatch("myAction").then(response => {
console.log("Got some data, now lets show something in this component")
}, error => {
console.error("Got nothing from server. Prompt user to check internet connection and try again")
})
}
}
ดังที่คุณเห็นด้านบนเป็นประโยชน์อย่างมากสำหรับactions
การส่งคืนไฟล์Promise
. มิฉะนั้นจะไม่มีทางที่ผู้ริเริ่มการดำเนินการจะรู้ว่าเกิดอะไรขึ้นและเมื่อสิ่งต่างๆมีความเสถียรเพียงพอที่จะแสดงบางสิ่งบนอินเทอร์เฟซผู้ใช้
และหมายเหตุสุดท้ายเกี่ยวกับmutators
- ดังที่คุณชี้ให้เห็นอย่างถูกต้องว่าเป็นแบบซิงโครนัส พวกเขาเปลี่ยนสิ่งในและมักจะเรียกจากstate
actions
ไม่จำเป็นต้องผสมPromises
กับmutators
ที่actions
จับส่วนนั้น
แก้ไข: มุมมองของฉันเกี่ยวกับวัฏจักร Vuex ของการไหลของข้อมูลทิศทางเดียว:
หากคุณเข้าถึงข้อมูลเช่นthis.$store.state["your data key"]
ในส่วนประกอบของคุณกระแสข้อมูลจะเป็นแบบทิศทางเดียว
สัญญาจากการกระทำเป็นเพียงการบอกให้ส่วนประกอบรู้ว่าการกระทำนั้นสมบูรณ์
ส่วนประกอบอาจรับข้อมูลจากฟังก์ชันการแก้ไขสัญญาในตัวอย่างข้างต้น (ไม่ใช่แบบทิศทางเดียวจึงไม่แนะนำ) หรือโดยตรงจาก$store.state["your data key"]
ที่เป็นแบบทิศทางเดียวและเป็นไปตามวงจรชีวิตของข้อมูล vuex
ย่อหน้าข้างบนถือว่า mutator ของคุณใช้Vue.set(state, "your data key", http_data)
เมื่อการเรียก http เสร็จสิ้นในการกระทำของคุณ