Học VueJS là phải biết VUEX
VUEX nói đơn giản chính là Kho chứa dữ liệu tập trung, dùng chung cho tất cả các component trong ứng dụng VueJS. Xem hình sau để hình dung về kho chứa dữ liệu tập trungStep 1: sử dụng NPM (Node packages manager) để cài đặt thư viện Vuex
- Trỏ đường dẫn
cmd
vào thư mục gốcproject-netashop
. - Thực thi câu lệnh sau:
npm install vuex
Step 2: khởi tạo kho dữ liệu dùng chung cho các components
- Tạo thư mục
project-nentang/src/store/
- Tạo file
project-nentang/src/store/store.js
- Nội dung file như sau:
import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({ // State là Trạng thái => hay còn gọi là Data (dữ liệu) của KHO chứa (store) // Tất cả dữ liệu sẽ được khởi tạo trong thuộc tính `state` state: { products: [ { id: 1, name: 'Notebook Lenovo Ideapad 320 Intel® Core i5-7200u 8GB', price: 2259, image: require('@/assets/img/product/ipad4.png'), stars: 5, totalReviews: 230, details: 'Mô tả chi tiết về sản phẩm Notebook Lenovo', totalBuyed: 0 }, { id: 2, name: 'Notebook Dell Inspiron i15-3567-A30P Intel Core 7ª i5 4GB', price: 2284, image: require('@/assets/img/product/samsung-galaxy-tab.jpg'), stars: 3.4, totalReviews: 20, details: 'Mô tả chi tiết về sản phẩm Notebook Dell Inspiron', totalBuyed: 0 }, { id: 3, name: 'Notebook Samsung Essentials E21 Intel Celeron Dual Core', price: 1490, image: require('@/assets/img/product/iphone5.jpg'), stars: 1, totalReviews: 1, details: 'Mô tả chi tiết về sản phẩm Notebook Samsung Essentials', totalBuyed: 0 }, { id: 4, name: 'Notebook Samsung Expert X22 Intel Core 7 i5 8GB', price: 2307, image: require('@/assets/img/product/nokia-asha-311.jpg'), stars: 4.4, totalReviews: 340, details: 'Mô tả chi tiết về sản phẩm Notebook Samsung Expert', totalBuyed: 0 } ], cartProducts: [], currentProduct: {} }, // Getters: là các thuộc tính dùng để các component lấy dữ liệu từ KHO chứa (store) về getters: { getAllProducts: state => state.products, getProductsInCart: state => state.cartProducts, getCurrentProduct: state => state.currentProduct }, // Mutations: là các thuộc tính dùng để thay đổi giá trị bên trong KHO chứa (store) // thay đổi giá trị, nhưng chạy ĐỒNG BỘ (SYNC) mutations: { ADD_PRODUCT: (state, product) => { let o = state.cartProducts.find(o => o.id === product.id) // Tìm sản phẩm trong Giỏ hàng theo ID if (!o) { // Nếu sản phẩm chưa có trong Giỏ hàng => Thêm sản phẩm vào giỏ hàng product.totalBuyed = 1 state.cartProducts.push(Object.assign({}, product)) } else { // Nếu sản phẩm đã có => cộng đồn số lượng mua lên 1 đơn vị o.totalBuyed += 1 } }, REMOVE_PRODUCT: (state, id) => { let o = state.cartProducts.find(o => o.id === id) // Tìm sản phẩm trong Giỏ hàng theo ID let index = state.cartProducts.indexOf(o) state.cartProducts.splice(index, 1) }, CURRENT_PRODUCT: (state, product) => { state.currentProduct = product } }, // Actions: là các hàm (methods) dùng để thực hiện các hành động thay đổi giá trị bên trong KHO chứa (store) // tương tự như Mutations, nhưng có thể chạy BẤT ĐỒNG BỘ (ASYNC) actions: { addProduct: (context, product) => { context.commit('ADD_PRODUCT', product) }, removeProduct: (context, id) => { context.commit('REMOVE_PRODUCT', id) }, currentProduct: (context, product) => { context.commit('CURRENT_PRODUCT', product) } } })
Step 3: khai báo cho VueJS biết chúng ta sử dụng KHO dữ liệu dùng chung store
- Hiệu chỉnh file
project-nentang/src/main.js
- Nội dung file như sau:
// The Vue build version to load with the `import` command // (runtime-only or standalone) has been set in webpack.base.conf with an alias. import Vue from 'vue' import App from './App' import router from './router' import store from './store/store.js' Vue.config.productionTip = false // Import thư viện Bootstrap (JS và CSS) import 'bootstrap' import 'bootstrap/dist/css/bootstrap.min.css' // Import thư viện Font Awesome import { library } from '@fortawesome/fontawesome-svg-core' import { fab } from '@fortawesome/free-brands-svg-icons' import { fas } from '@fortawesome/free-solid-svg-icons' import { far } from '@fortawesome/free-regular-svg-icons' import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome' // Đăng ký component Global Layouts import Default from './layouts/LayoutDefault.vue' import NoSidebar from './layouts/LayoutNoSidebar.vue' library.add(fab, fas, far) Vue.component('font-awesome-icon', FontAwesomeIcon) Vue.component('default-layout', Default) Vue.component('no-sidebar-layout', NoSidebar) /* eslint-disable no-new */ new Vue({ el: '#app', router, store, components: { App }, template: '<App/>' })
Chương trình học
Các bài học
Bài học trước Bài học tiếp theo
Chương trình học
Bao gồm Module, Chương, Bài học, Bài tập, Kiểm tra...Chương trình học
Bài học trước Bài học tiếp theo