Vue 项目 购物车 模块

购物车 ajax 接口请求拆分到 service 文件夹中

// goods.js
import axios from 'axios'

export default {
    getGoodsInfo () {
        return axios.get('/api/goods')
        .then(res => {
            // 处理数据格式,并返回
            const {code, data: goodsInfo, slider, keys} = res.data;
            if (code) {
                return {goodsInfo, slider, keys};
            } else {
                return null;
            }
        });
    }
}

路由切换动态

// 1. 使用 transition 组件 嵌套 router-view 组件
<transition name="route-move">
    <router-view class="child-view" />
</transition>

// 2. 通过 CSS 定义路由切换动画
.route-move-enter {
    // 入场前状态
    transform: translate3d(-100%, 0, 0);
}
.route-move-leave-to{
    // 离场后状态
    transform: translate3d(100%, 0, 0);
}
.route-move-enter-active,
.route-move-leave-active{
    // 激活状态
    transition: transform 0.3s;
}

购物车动画,使用 Vue 的 JS 方式的半场动画

// CartAnim.vue
<template>
<div class="ball-wrap">
    <transition
        @before-enter="beforeEnter"
        @enter="enter"
        @after-enter="afterEnter"
    >
        <div class="ball" v-show="show">
            <div class="inner">
                <div class="cubeic-add"></div>
            </div>
        </div>
    </transition>
</div>
</template>

<script>
export default {
    name: "cartAnim",
    data () {
        return {
            show: false
        }
    },
    methods: {
        start(el) {
            // 启动动画接口,传递点击按钮元素
            this.el = el;
            // 适应.ball显示,激活动画钩子
            this.show = true;
        },
        beforeEnter(el) {
            // 把小球移动到点击的DOM元素所在位置
            const rect = this.el.getBoundingClientRect();
            // 转换为用于绝对定位的坐标
            const x = rect.left - window.innerWidth /2;
            const y = -(window.innerHeight - rect.top - 10 - 20);
            // ball 只移动 y 轴
            el.style.transfrom = `translate3d(0, ${y}px, 0)`;
            // inner 只移动 x 轴
            const inner = el.querySelector(".inner");
            inner.style.transform = `translate3d(${x}px, 0, 0)`;
        },
        enter(el, done) {
            // 获取offsetHeight就会重绘
            document.body.offsetHeight;
            //指定动画结束位置
            el.style.transform = `translate3d(0, 0, 0)`;
            const inner = el.querySelector(".inner");
            inner.style.transform = `translate3d(0, 0, 0)`;
            el.addEventListener("transitionend", done);
        },
        afterEnter(el) {
            // 动画结束, 开始清理工作
            this.show = false;
            el.style.display = "none";
            this.$emit("transitionend");
        }
    }
}
</script>

<style scoped>
.ball-wrap .ball{
    position: fixed;
    left: 50%;
    bottom: 10px;
    z-index: 100000;
    color: red;
    transition: all .5s cubic-bezier(0.49, -0.29, 0.75, 0.41);
}
.ball-wrap .ball .inner{
    width: 16px;
    height: 16px;
    transition: all 0.5s linear;
    background: #f00;
    border-radius: 50%;
}
.ball-wrap .ball .inner .cubeic-add {
    font-size: 22px;
}
</style>

// CartAnim 組件的使用
// 1. 引入组件
import CartAnim from '@/components/CartAnim.vue';
// 2. 挂载到组件选项中
components: {
    CartAnim
}
// 3. 在组件模板中 使用组件,并在商品列表组件上监听启动事件
<cart-anim ref="ca"></cart-anim>
<good-list @cartanim="$refs.ca.start($event)" />

// 4. 在 good-list 组件中通过 $emit 派发自定义事件
this.$emit('cartanim', event.target);

全局创建组件实例函数

import Vue from 'vue';

export default function(Component, props) {
    // 创建vue实例
    const instance = new Vue({
        render: h => h(Component, { props });
    }).$mount();

    // 把生成的dom追加至body中
    document.body.appendChild(instance.$el);

    // 添加一个销毁方法
    const comp = instance.$children[0];
    comp.remove = function () {
        document.body.removeChild(instance.$el);
        instance.$destroy();
    }
    return comp;
}

// 在入口 main.js 中注入方法
import create from './utils/create'
Vue.prototype.$create = create;

// 在组件中使用 $create 方法
const anim = this.$create(CartAnim);
anim.start(el);
anim.$on("transitionend", anim.remove);

原文地址:https://www.cnblogs.com/yuxi2018/p/11967313.html

时间: 2024-08-27 04:22:15

Vue 项目 购物车 模块的相关文章

Vue 项目 login 模块

登录模块 需要做路由的守卫,有些模块是需要被保护的,必须登录才能访问. 常见手法是给路由添加 meta:{ auth:true } 来做标识,表示需要做认证. // 路由守卫 router.beforeEach((to, from, next) => { // 判断要进入的路由是否需要认证 if(to.meta.auth) { // 通过token令牌机制判断是否已经登录 const token = localStorage.getItem('token'); if (token) { next

web day25 web day24 小项目练习图书商城, 购物车模块,订单模块,支付(易宝支付)

购物车模块 购物车存储: 保存在session中(本次使用的) 保存在cookie中 保存在数据库中 购物车相关类 购物车结构 CartItem:包含图书和数量,小计 Cart:包含一个Map<String,CartItem>和部分购物车操作方法 修改登录方法,在用户登录成功后,马上在session中添加一辆车 页面负责遍历存在session域中的购物车属性 添加购物车条目 清空购物车条目 指定删除购物车条目 图 我的购物车 top.jsp中存在一个链接:我的购物车 我的购物车直接访问/jsp

easymall项目的商品删除,前台商品分页,商品详情,购物车模块

简单的挑选一下昨天所学的重点知识模块,以备后续的复习 一.购物车模块1.1购物车两种实现的区别:!!!!!!!! 用session保存  缺点:浏览器关闭,session失效时保存在session中购物信息将会消失  后续优化,将购买的信息除了保存在session中以外,还要将购物的信息保存在cookie中,这样  就解决了浏览器关闭购买商品信息丢失的问题(但是解决不了跟换电脑信息丢失的问题)  优点:不用操作数据库,可以减少数据库访问压力 数据库中:  缺点:只用登录的用户才能添加购物车   

第六次博客作业:对bookstore项目中的购物车模块进行测试,并写出测试的缺陷报告。

缺陷编号:01.01.0001 发现人:Lmh 记录日期:2016-06-11 所属模块:购物车模块 确认人:Lmh 确认日期:2016-06-11 当前状态:公开 严重度:3 优先级:3 问题概述:重复购买同一本书,数量不会叠加,会更新成第二次购买的数量. 问题再现描述: 1.执行正常的购买书籍操作,购买数量为99. 2.查看购物车数量为99. 3.返回继续购买同一种书籍,选择购买数量为88. 4.这时查看购物车的该书籍数量会刷新为88. 问题隔离描述: 1.修改购买数量为其他任意数字,问题依

D15 Sping Boot 入门 Sping框架--Java Web之书城项目(六) 购物车模块

需求分析 购物车模块 原文地址:https://www.cnblogs.com/nuister/p/12684743.html

vue项目总结,所用到的技术点

1.用到的技术点 vue 是一个渐进式JavaScript框架 npm install vue vue-route 是一个路由匹配功能 npm install vue-router vue-resource 发送ajax请求的 npm install vue-resource vue-preview 图片预览插件 npm i vue-preview -S vuex 组件传值 npm install vuex --save mint-ui 基于vue的移动端组件 npm i mint-ui -S

用JSP实现的商城购物车模块

这两天,在学习JSP,正好找个小模块来练练手: 下面就是实现购物车模块的页面效果截图: 图1. 产品显示页面 通过此页面进行产品选择,增加到购物车 图2 .购物车页面 图3 . 商品数量设置 好了,先不贴图了,直接上代码:先看看项目的文档结构把(麻雀虽小,五脏俱全): 整个项目包括三个类,两个JSP页面,以下分别把他们的代码贴上: Cart.java package shopping.cart; import java.util.ArrayList; import java.util.Itera

vue 项目搭建

cli 方式安装      集成了内置webpack 模块 安装步骤   1.全局安装 vue-cli $ npm install --global vue-cli 2. 创建一个基于 webpack 模板的新项目 $ vue init webpack my-project 3.安装依赖,走你 $ cd my-project $ npm install $ npm run dev 如果npm安装慢的话 可以使用淘宝镜像 npm install -g cnpm --registry=https:/

Vue 项目中使用 jsPlumb

jsPlumb 介绍 jsPlumb 是一个强大的 JavaScript 连线库,它可以将 html中 的元素用箭头.曲线.直线等连接起来,适用于开发 Web 上的图表.建模工具.流程图.关系图等. jsPlumb 参考网站 博客园:http://www.cnblogs.com/leomYili/p/6346526.html?utm_source=itdadao&utm_medium=referral 官网:https://www.jsplumbtoolkit.com/ 安装 jsPlumb v