Vuex quản lý tất cả dữ liệu trong ứng dụng của bạn. Đó là "nguồn chân lý duy nhất" cho dữ liệu trên giao diện người dùng của bạn. Vì vậy, bất cứ điều gì thay đổi trạng thái của ứng dụng của bạn, chẳng hạn như thêm một người bạn, hoặc từ chối một người bạn, cần phải lưu thông qua Vuex. Điều này xảy ra thông qua ba loại chức năng chính, getters, actions và mutations.
Check-out: https://github.com/vuejs/vuex/tree/master/examples/shopping-cart/vuex
Getters được sử dụng để lấy dữ liệu từ lưu trữ trong Vuex. Chúng phản ứng với những thay đổi, có nghĩa là nếu dữ liệu Vuex thay đổi, thông tin trong thành phần của bạn cũng được cập nhật. Bạn có thể đặt những thứ này vào một cái gì đó như getters.js
để bạn có thể nhập chúng vào bất kỳ mô-đun nào bạn cần chúng.
Tác vụ là các chức năng mà bạn gọi trực tiếp, tức là. acceptFriendRequest
khi người dùng nhấp vào nút. Chúng tương tác với cơ sở dữ liệu của bạn và sau đó gửi các đột biến. Trong ứng dụng này, tất cả các hành động là trong actions.js
.
Vì vậy, bạn sẽ gọi this.acceptFriendRequest(recipient)
trong thành phần của mình. Điều này sẽ cho cơ sở dữ liệu của bạn cập nhật trạng thái của bạn bè, sau đó bạn nhận được xác nhận lại rằng điều này đã xảy ra. Đó là khi bạn gửi một đột biến cập nhật danh sách bạn bè hiện tại của người dùng trong Vuex.
Một đột biến cập nhật dữ liệu trong Vuex để phản ánh trạng thái mới. Khi điều này xảy ra, bất kỳ dữ liệu nào bạn đang truy xuất trong trình thu thập cũng được cập nhật. Dưới đây là một ví dụ của toàn bộ dòng chảy:
import {addFriend} from './actions.js';
import {friends} from './getters.js';
new Vue({
vuex:{
getters:{
friends
}
},
methods:{
addFriend
}
}
store.js:
export default {
state:{
friends: []
},
mutations:{
ADD_FRIEND(state, friend) {
state.friends.push(friend);
}
}
}
actions.js:
export default {
addFriend(friend){
Vue.http.post('/users/1/friends',friend)
.then((response)=>{
dispatch("ADD_FRIEND", response) //response is the new friend
})
}
}
getters.js
export default {
friends(state) {
return state.friends;
}
}
Vì vậy, tất cả trong số này được sắp xếp thành các tệp của riêng chúng và bạn có thể imp ort chúng trong bất kỳ thành phần bạn cần. Bạn có thể gọi this.addFriend(friend)
từ bất kỳ thành phần nào, và sau đó trình khởi động của bạn được truy cập từ this.friends
sẽ tự động cập nhật với người bạn mới khi đột biến xảy ra. Bạn luôn có thể sử dụng cùng một dữ liệu trong bất kỳ chế độ xem nào trong ứng dụng của mình và biết rằng dữ liệu đó là hiện tại với cơ sở dữ liệu của bạn.
Một số công cụ misc:
- thu khí tự động nhận
state
như là một biến, vì vậy bạn luôn có thể tham khảo tiểu bang của cửa hàng Vuex bạn
- đột biến không bao giờ nên không đồng bộ. Thực hiện tìm nạp/cập nhật trong hành động và sau đó gửi đột biến chỉ để cập nhật dữ liệu của bạn
- tạo dịch vụ (hoặc tài nguyên) bằng cách sử dụng
Vue Resource
sẽ giúp tìm nạp/cập nhật/xóa tài nguyên dễ dàng hơn. bạn có thể đặt chúng trong các tệp riêng biệt và nhập chúng trong actions.js
của bạn để tách logic truy xuất cơ sở dữ liệu được tách riêng. Sau đó, bạn sẽ viết một cái gì đó như FriendService.get({id: 1})
thay vì Vue.http.get('/users/1')
. xem https://github.com/vuejs/vue-resource/blob/master/docs/resource.md
- Vuex hoạt động với bộ công cụ vue để tìm "thời gian di chuyển". Bạn có thể xem danh sách mọi đột biến đã diễn ra và tua lại chúng/làm lại chúng. Thật tuyệt vời để gỡ lỗi và xem dữ liệu đang được thay đổi ở đâu.
Cảm ơn lời giải thích dài dòng và giúp tôi ở đây, có ý nghĩa rất nhiều với tôi. Chỉ là một câu hỏi; phương thức gọi API tình bạn của tôi trong trường hợp này không thực sự phải cập nhật kho lưu trữ vuex. Các cuộc gọi này chỉ đơn giản là thực hiện một yêu cầu độc lập đến điểm cuối api. Các phần khác của ứng dụng của tôi sẽ sử dụng vuex. Bạn vẫn nên làm điều đó như đề xuất của mình khi các phương pháp này không thực sự cần cập nhật cửa hàng? –
Nếu có bất kỳ chế độ xem nào khác trong ứng dụng của bạn muốn biết danh sách bạn bè, thì việc sử dụng Vuex sẽ là cách để đi. Sau đó, bạn không phải lấy lại danh sách bạn bè của mình ở những nơi khác nhau và bạn luôn biết rằng mình đã đồng bộ hóa với cơ sở dữ liệu. Nhưng nếu nó nhiều hơn bạn cần sau đó liên quan đến Vuex sẽ chỉ được thêm công việc. Trong trường hợp đó, tôi sẽ chỉ tạo một cái gì đó như '/ services/Friends.js' có tất cả các chức năng để quản lý tình bạn, vì vậy bạn có thể nhập bất cứ nơi nào bạn cần. – Jeff
Nếu bạn tách nó (dữ liệu thành phần vuex và cục bộ), bạn nên lưu trữ logic cơ sở dữ liệu để lấy dữ liệu từ API ở đâu? Không phải trong thư mục Vuex tôi nghĩ sao? Trong một thư mục riêng biệt có tên api? – Jordy