成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Vue+Vue-router+Vuex項(xiàng)目實(shí)戰(zhàn)

zlyBear / 2440人閱讀

摘要:實(shí)現(xiàn)電商網(wǎng)站效果展示下載代碼安裝依賴啟動(dòng)項(xiàng)目運(yùn)行環(huán)境需求分析登錄頁面商品列表頁網(wǎng)站首頁購物車頁實(shí)現(xiàn)結(jié)算商品詳情頁可按顏色品牌對商品進(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
需求分析

登錄頁面、商品列表頁(網(wǎng)站首頁)、購物車頁(實(shí)現(xiàn)結(jié)算)、商品詳情頁

可按顏色、品牌對商品進(jìn)行篩選,單擊選中,再次點(diǎn)擊取消

根據(jù)價(jià)格進(jìn)行升序降序、銷量降序排列

商品列表顯示圖片、名稱、銷量、顏色、單價(jià)

實(shí)時(shí)顯示購物車數(shù)量(商品類別數(shù))

購物車頁面實(shí)現(xiàn)商品總價(jià)、總數(shù)進(jìn)行結(jié)算,優(yōu)惠券打折

數(shù)據(jù)存儲(chǔ) & 數(shù)據(jù)處理

product.js存放商品數(shù)據(jù)(生產(chǎn)環(huán)境需通過接口調(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("賬號或密碼不能為空");
    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)站首頁");
    window.location.href = "/list";
}else{
    window.alert("賬號或密碼錯(cuò)誤");
}

數(shù)據(jù)過濾與排序處理

filteredAndOrderedList(){
    //拷貝原數(shù)組
    let list = [...this.list];
    //品牌過濾
    if(this.filterBrand !== ""){
        list = list.filter(item => item.brand === this.filterBrand);
    }
    //顏色過濾
    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ù)

//購物車商品總數(shù)
countAll(){
    let count = 0;
    this.cartList.forEach(item => {
        count += item.count;
    });
    return count;
},
//購物車商品總價(jià)
costAll(){
    let cost = 0;
    this.cartList.forEach(item => {
        cost += this.productDictList[item.id].cost * item.count;
    });
    return cost;
}

購物車結(jié)算處理

//通知Vuex,完成下單
handleOrder(){
    this.$store.dispatch("buy").then(() => {
        window.alert("購買成功");
    })
},
vue-router & vuex

vue-router路由管理/src/views/目錄下的vue組件進(jìn)行設(shè)置,router-views掛載所有路由,登錄界面與商品列表頁面之間header做隱藏顯示處理,登錄狀態(tài)下刷新頁面跳轉(zhuǎn)至列表頁,其他頁面設(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: "購物車"
        },
        component: (resolve) => require(["./views/cart.vue"], resolve)
    },
    {
        path: "/login/:loginStatus",
        meta: {
            title: "登錄注冊"
        },
        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: [],
        //購物車數(shù)據(jù),數(shù)組形式,數(shù)據(jù)元素為對象(商品id,購買數(shù)量count)
        cartList: [],
        //當(dāng)前用戶賬號
        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;
        },
        //添加購物車
        addCart(state, id){
            const isAdded = state.cartList.find(item => item.id === id);
            //如果不存在設(shè)置購物車為1,存在count++
            if(isAdded){
                isAdded.count++;
            }else{
                state.cartList.push({
                    id: id,
                    count: 1
                })
            }
        },
        //修改購物車商品數(shù)量
        editCartCount(state, payload){
            const product = state.cartList.find(item => item.id === payload.id);
            product.count += payload.count;
        },
        //刪除購物車商品
        deleteCart(state, id){
            const index = state.cartList.findIndex(item => item.id === id);
            state.cartList.splice(index, 1)
        },
        //清空購物車
        emptyCart(state){
            state.cartList = [];
        },
        getUser(state, username){
            console.log("username",username)
            state.username = username;
        },
        getLoginStatus(state, flag){
            state.loginStatus = flag;
        }
    },
    actions: {
        //異步請求商品列表,暫且使用setTimeout
        getProductList(context){
            setTimeout(() => {
                context.commit("setProductList", product_data)
            }, 500);
        },
        //購買
        buy(context){
            //生產(chǎn)環(huán)境使用ajax請求服務(wù)端響應(yīng)后再清空購物車
            return new Promise(resolve => {
                setTimeout(() => {
                    context.commit("emptyCart");
                    resolve();
                }, 500);
            });
        },
    }
});
后記

項(xiàng)目地址: 閱讀完本文如果對vue的理解有所幫助,請給顆star,謝謝~

筆者個(gè)人微信 gm4118679254 歡迎加好友一起交流技術(shù)

參考資料

Vue.js實(shí)戰(zhàn)
Vue.js

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/102706.html

相關(guān)文章

  • Vue+Vue-router+Vuex項(xiàng)目實(shí)戰(zhàn)

    摘要:實(shí)現(xiàn)電商網(wǎng)站效果展示下載代碼安裝依賴啟動(dòng)項(xiàng)目運(yùn)行環(huán)境需求分析登錄頁面商品列表頁網(wǎng)站首頁購物車頁實(shí)現(xiàn)結(jié)算商品詳情頁可按顏色品牌對商品進(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...

    Chiclaim 評論0 收藏0
  • Vue+Vue-router+Vuex項(xiàng)目實(shí)戰(zhàn)

    摘要:實(shí)現(xiàn)電商網(wǎng)站效果展示下載代碼安裝依賴啟動(dòng)項(xiàng)目運(yùn)行環(huán)境需求分析登錄頁面商品列表頁網(wǎng)站首頁購物車頁實(shí)現(xiàn)結(jié)算商品詳情頁可按顏色品牌對商品進(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...

    Half 評論0 收藏0
  • 手挽手帶你學(xué)VUE:四檔 Vue-cli3 Vuex Vue-router

    摘要:安裝過后到命令行執(zhí)行檢查版本,如果彈出版本的話恭喜你安裝成功,我們開始進(jìn)行下面的步驟了。全局安裝的包名稱由改成了。如果你已經(jīng)全局安裝了舊版本的或,你需要先通過卸載它。中的非常類似于事件每個(gè)都有一個(gè)字符串的事件類型和一個(gè)回調(diào)函數(shù)。 視頻教程 由于思否不支持視頻外鏈,視頻請移步http://www.henrongyi.top 你能學(xué)到什么 在這一期的學(xué)習(xí)進(jìn)度中,我們會(huì)開始學(xué)習(xí)在我們工作開...

    Sourcelink 評論0 收藏0
  • 手挽手帶你學(xué)VUE:四檔 Vue-cli3 Vuex Vue-router

    摘要:安裝過后到命令行執(zhí)行檢查版本,如果彈出版本的話恭喜你安裝成功,我們開始進(jìn)行下面的步驟了。全局安裝的包名稱由改成了。如果你已經(jīng)全局安裝了舊版本的或,你需要先通過卸載它。中的非常類似于事件每個(gè)都有一個(gè)字符串的事件類型和一個(gè)回調(diào)函數(shù)。 視頻教程 由于思否不支持視頻外鏈,視頻請移步http://www.henrongyi.top 你能學(xué)到什么 在這一期的學(xué)習(xí)進(jìn)度中,我們會(huì)開始學(xué)習(xí)在我們工作開...

    AlphaWallet 評論0 收藏0
  • 前端面試題總結(jié)(js、html、小程序、React、ES6、Vue、算法、全棧熱門視頻資源)

    摘要:并總結(jié)經(jīng)典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優(yōu)化項(xiàng)目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快速搭建項(xiàng)目。 本文是關(guān)注微信小程序的開發(fā)和面試問題,由基礎(chǔ)到困難循序漸進(jìn),適合面試和開發(fā)小程序。并總結(jié)vue React html css js 經(jīng)典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優(yōu)化項(xiàng)目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快...

    pumpkin9 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<