摘要:實(shí)現(xiàn)電商網(wǎng)站效果展示下載代碼安裝依賴啟動(dòng)項(xiàng)目運(yùn)行環(huán)境需求分析登錄頁(yè)面商品列表頁(yè)網(wǎng)站首頁(yè)購(gòu)物車頁(yè)實(shí)現(xiàn)結(jié)算商品詳情頁(yè)可按顏色品牌對(duì)商品進(jìn)行篩選,單擊選中,再次點(diǎn)擊取消根據(jù)價(jià)格進(jìn)行升序降序銷量降序排列商品列表顯示圖片名稱銷量顏色單價(jià)實(shí)時(shí)顯示
shopping
vue + vue-router + vuex實(shí)現(xiàn)電商網(wǎng)站
效果展示 install下載代碼: git clone https://github.com/chenchangyuan/shopping.git
安裝依賴: npm install
啟動(dòng)項(xiàng)目: npm run dev
運(yùn)行環(huán)境: node v9.11.1 npm 5.6.0需求分析
登錄頁(yè)面、商品列表頁(yè)(網(wǎng)站首頁(yè))、購(gòu)物車頁(yè)(實(shí)現(xiàn)結(jié)算)、商品詳情頁(yè)
可按顏色、品牌對(duì)商品進(jìn)行篩選,單擊選中,再次點(diǎn)擊取消
根據(jù)價(jià)格進(jìn)行升序降序、銷量降序排列
商品列表顯示圖片、名稱、銷量、顏色、單價(jià)
實(shí)時(shí)顯示購(gòu)物車數(shù)量(商品類別數(shù))
購(gòu)物車頁(yè)面實(shí)現(xiàn)商品總價(jià)、總數(shù)進(jìn)行結(jié)算,優(yōu)惠券打折
數(shù)據(jù)存儲(chǔ) & 數(shù)據(jù)處理product.js存放商品數(shù)據(jù)(生產(chǎn)環(huán)境需通過(guò)接口調(diào)用獲取數(shù)據(jù))
{ id: 1, name: "AirPods", brand: "Apple", image: "/src/images/airPods.jpg", imageDetail: "/src/images/airPods_detail.jpg", sales: 10000, cost: 1288, color: "白色" },
window.localStorage實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)與驗(yàn)證
let username = window.localStorage.getItem("username"); let password = window.localStorage.getItem("password"); if(!util.trim(this.username) || !util.trim(this.username) ){ window.alert("賬號(hào)或密碼不能為空"); return; } if(username === this.username && password === this.password){ this.login = false; window.localStorage.setItem("loginStatus", "login"); this.$store.commit("getUser", this.username); window.alert("登陸成功,確定進(jìn)入網(wǎng)站首頁(yè)"); window.location.href = "/list"; }else{ window.alert("賬號(hào)或密碼錯(cuò)誤"); }
數(shù)據(jù)過(guò)濾與排序處理
filteredAndOrderedList(){ //拷貝原數(shù)組 let list = [...this.list]; //品牌過(guò)濾 if(this.filterBrand !== ""){ list = list.filter(item => item.brand === this.filterBrand); } //顏色過(guò)濾 if(this.filterColor !== ""){ list = list.filter(item => item.color === this.filterColor); } //排序 if(this.order !== ""){ if(this.order === "sales"){ list = list.sort((a, b) => b.sales - a.sales); }else if(this.order === "cost-desc"){ list = list.sort((a, b) => b.cost - a.cost); }else if(this.order === "cost-asc"){ list = list.sort((a, b) => a.cost - b.cost); } } return list; }
實(shí)時(shí)顯示應(yīng)付總額與商品數(shù)
//購(gòu)物車商品總數(shù) countAll(){ let count = 0; this.cartList.forEach(item => { count += item.count; }); return count; }, //購(gòu)物車商品總價(jià) costAll(){ let cost = 0; this.cartList.forEach(item => { cost += this.productDictList[item.id].cost * item.count; }); return cost; }
購(gòu)物車結(jié)算處理
//通知Vuex,完成下單 handleOrder(){ this.$store.dispatch("buy").then(() => { window.alert("購(gòu)買成功"); }) },vue-router & vuex
vue-router路由管理/src/views/目錄下的vue組件進(jìn)行設(shè)置,router-views掛載所有路由,登錄界面與商品列表頁(yè)面之間header做隱藏顯示處理,登錄狀態(tài)下刷新頁(yè)面跳轉(zhuǎn)至列表頁(yè),其他頁(yè)面設(shè)置默認(rèn)跳轉(zhuǎn)
跳轉(zhuǎn)處理
const router = new VueRouter(RouterConfig); //跳轉(zhuǎn)前設(shè)置title router.beforeEach((to, from, next) => { window.document.title = to.meta.title; next(); }); //跳轉(zhuǎn)后設(shè)置scroll為原點(diǎn) router.afterEach((to, from, next) => { window.scrollTo(0, 0); });
routers配置
//商品列表路由配置 const routers = [ { path: "/list", meta: { title: "商品列表" }, component: (resolve) => require(["./views/list.vue"], resolve) }, { path: "/product/:id", meta: { title: "商品詳情" }, component: (resolve) => require(["./views/product.vue"], resolve) }, { path: "/cart", meta: { title: "購(gòu)物車" }, component: (resolve) => require(["./views/cart.vue"], resolve) }, { path: "/login/:loginStatus", meta: { title: "登錄注冊(cè)" }, component: (resolve) => require(["./views/login.vue"], resolve) }, { path: "*", redirect: "/login/login" } ]; export default routers;
vuex狀態(tài)管理,各組件共享數(shù)據(jù)在state中設(shè)置,mutation實(shí)現(xiàn)數(shù)據(jù)同步,action異步加載
//配置Vuex狀態(tài)管理 const store = new Vuex.Store({ state: { //商品列表信息 productList: [], //購(gòu)物車數(shù)據(jù),數(shù)組形式,數(shù)據(jù)元素為對(duì)象(商品id,購(gòu)買數(shù)量count) cartList: [], //當(dāng)前用戶賬號(hào) username: window.localStorage.getItem("username"), //登錄狀態(tài) loginStatus: !!window.localStorage.getItem("loginStatus"), }, getters: { //品牌、顏色篩選 brands: state => { const brands = state.productList.map(item => item.brand); return util.getFilterArray(brands); }, colors: state => { const colors = state.productList.map(item => item.color); return util.getFilterArray(colors); } }, //mutations只能以同步方式 mutations: { //添加商品列表 setProductList(state, data){ state.productList = data; }, //添加購(gòu)物車 addCart(state, id){ const isAdded = state.cartList.find(item => item.id === id); //如果不存在設(shè)置購(gòu)物車為1,存在count++ if(isAdded){ isAdded.count++; }else{ state.cartList.push({ id: id, count: 1 }) } }, //修改購(gòu)物車商品數(shù)量 editCartCount(state, payload){ const product = state.cartList.find(item => item.id === payload.id); product.count += payload.count; }, //刪除購(gòu)物車商品 deleteCart(state, id){ const index = state.cartList.findIndex(item => item.id === id); state.cartList.splice(index, 1) }, //清空購(gòu)物車 emptyCart(state){ state.cartList = []; }, getUser(state, username){ console.log("username",username) state.username = username; }, getLoginStatus(state, flag){ state.loginStatus = flag; } }, actions: { //異步請(qǐng)求商品列表,暫且使用setTimeout getProductList(context){ setTimeout(() => { context.commit("setProductList", product_data) }, 500); }, //購(gòu)買 buy(context){ //生產(chǎn)環(huán)境使用ajax請(qǐng)求服務(wù)端響應(yīng)后再清空購(gòu)物車 return new Promise(resolve => { setTimeout(() => { context.commit("emptyCart"); resolve(); }, 500); }); }, } });后記
項(xiàng)目地址: 閱讀完本文如果對(duì)vue的理解有所幫助,請(qǐng)給顆star,謝謝~
筆者個(gè)人微信 gm4118679254 歡迎加好友一起交流技術(shù)
參考資料Vue.js實(shí)戰(zhàn)
Vue.js
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/117535.html
摘要:實(shí)現(xiàn)電商網(wǎng)站效果展示下載代碼安裝依賴啟動(dòng)項(xiàng)目運(yùn)行環(huán)境需求分析登錄頁(yè)面商品列表頁(yè)網(wǎng)站首頁(yè)購(gòu)物車頁(yè)實(shí)現(xiàn)結(jié)算商品詳情頁(yè)可按顏色品牌對(duì)商品進(jìn)行篩選,單擊選中,再次點(diǎn)擊取消根據(jù)價(jià)格進(jìn)行升序降序銷量降序排列商品列表顯示圖片名稱銷量顏色單價(jià)實(shí)時(shí)顯示 shopping vue + vue-router + vuex實(shí)現(xiàn)電商網(wǎng)站 效果展示 showImg(https://user-gold-cdn.xi...
摘要:實(shí)現(xiàn)電商網(wǎng)站效果展示下載代碼安裝依賴啟動(dòng)項(xiàng)目運(yùn)行環(huán)境需求分析登錄頁(yè)面商品列表頁(yè)網(wǎng)站首頁(yè)購(gòu)物車頁(yè)實(shí)現(xiàn)結(jié)算商品詳情頁(yè)可按顏色品牌對(duì)商品進(jìn)行篩選,單擊選中,再次點(diǎn)擊取消根據(jù)價(jià)格進(jìn)行升序降序銷量降序排列商品列表顯示圖片名稱銷量顏色單價(jià)實(shí)時(shí)顯示 shopping vue + vue-router + vuex實(shí)現(xiàn)電商網(wǎng)站 效果展示 showImg(https://user-gold-cdn.xi...
摘要:安裝過(guò)后到命令行執(zhí)行檢查版本,如果彈出版本的話恭喜你安裝成功,我們開始進(jìn)行下面的步驟了。全局安裝的包名稱由改成了。如果你已經(jīng)全局安裝了舊版本的或,你需要先通過(guò)卸載它。中的非常類似于事件每個(gè)都有一個(gè)字符串的事件類型和一個(gè)回調(diào)函數(shù)。 視頻教程 由于思否不支持視頻外鏈,視頻請(qǐng)移步http://www.henrongyi.top 你能學(xué)到什么 在這一期的學(xué)習(xí)進(jìn)度中,我們會(huì)開始學(xué)習(xí)在我們工作開...
摘要:安裝過(guò)后到命令行執(zhí)行檢查版本,如果彈出版本的話恭喜你安裝成功,我們開始進(jìn)行下面的步驟了。全局安裝的包名稱由改成了。如果你已經(jīng)全局安裝了舊版本的或,你需要先通過(guò)卸載它。中的非常類似于事件每個(gè)都有一個(gè)字符串的事件類型和一個(gè)回調(diào)函數(shù)。 視頻教程 由于思否不支持視頻外鏈,視頻請(qǐng)移步http://www.henrongyi.top 你能學(xué)到什么 在這一期的學(xué)習(xí)進(jìn)度中,我們會(huì)開始學(xué)習(xí)在我們工作開...
摘要:并總結(jié)經(jīng)典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優(yōu)化項(xiàng)目,在瀏覽器端的層面上提升速度,幫助初中級(jí)前端工程師快速搭建項(xiàng)目。 本文是關(guān)注微信小程序的開發(fā)和面試問(wèn)題,由基礎(chǔ)到困難循序漸進(jìn),適合面試和開發(fā)小程序。并總結(jié)vue React html css js 經(jīng)典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優(yōu)化項(xiàng)目,在瀏覽器端的層面上提升速度,幫助初中級(jí)前端工程師快...
閱讀 2956·2023-04-26 01:32
閱讀 1552·2021-09-13 10:37
閱讀 2288·2019-08-30 15:56
閱讀 1681·2019-08-30 14:00
閱讀 3056·2019-08-30 12:44
閱讀 1972·2019-08-26 12:20
閱讀 1070·2019-08-23 16:29
閱讀 3236·2019-08-23 14:44