Implementación de Vue del caso del carrito de compras

Exhibición del producto terminadoInserte la descripción de la imagen aquí

caso de estudio

  1. Implementar los requisitos comerciales de manera componente.
  • Componentización basada en funciones comerciales
    ① Componente de título (texto de visualización)
    ② Componente de lista (visualización de lista, cambio de cantidad de producto)
    ③ Componente de liquidación (calcular la cantidad total de productos)
    Inserte la descripción de la imagen aquí

Pasos de implementación

primer paso

  1. Disposición estática
  2. Refactorice los datos estáticos en forma de componentes de Vue (implementado a través de Vue.component)
  3. Utilice componentes locales dentro de componentes globales para separar las tres partes (componentes)
  4. Implementar la refactorización en componentes

Segundo paso

  1. Realice la transferencia de datos dinámica con datos y accesorios
  2. Realizar la función de cálculo (el tercer atributo calculado)
  3. Fórmula de cálculo precio total = precio unitario * cantidad
  4. bucle v-for y complete la lista
  5. Obtenga la identificación en el componente secundario y páselo al componente secundario (this. $ Emit () y escuche en el componente principal)
  6. Configure el botón de eliminar (busque el índice de los datos correspondientes a id y use splice para eliminar los datos correspondientes)

tercer paso

  1. Haga la cantidad mostrada en la página
  2. Obtener id y valor a través de $ event (event.target.value)
  3. La sentencia es modificar los datos de ese índice
  4. Suma y resta de datos
  5. Use @click para vincular eventos y deshabilitar una función de salto de etiqueta
  6. Establecer una bandera para el signo más y el signo menos para distinguirse entre sí (cambio de campo de entrada, cambio de signo más, cambio de signo menos)

Para ponerlo en términos profesionales

  • Logre efectos de diseño y estilo generales
  • Dividir componentes funcionales independientes
  • Combine todos los subcomponentes para formar y estructura general
  • Implementar cada función de componente una por una
    • Componente de título
    • Componente de lista
    • Componente de liquidación

Estilo básico

#app {
    
    
            width: 700px;
            height: 800px;
            margin: 0 auto;
        }

        .container .cart {
    
    
            width: 300px;
            margin: auto;
        }

        .container .title {
    
    
            background-color: lightblue;
            height: 40px;
            line-height: 40px;
            text-align: center;
            /*color: #fff;*/
        }

        .container .total {
    
    
            background-color: #FFCE46;
            height: 50px;
            line-height: 50px;
            text-align: right;
        }

        .container .total button {
    
    
            margin: 0 10px;
            background-color: #DC4C40;
            height: 35px;
            width: 80px;
            border: 0;
        }

        .container .total span {
    
    
            color: red;
            font-weight: bold;
        }

        .container .item {
    
    
            height: 55px;
            line-height: 55px;
            position: relative;
            border-top: 1px solid #ADD8E6;
        }

        .container .item img {
    
    
            width: 45px;
            height: 45px;
            margin: 5px;
        }

        .container .item .name {
    
    
            position: absolute;
            width: 90px;
            top: 0;
            left: 55px;
            font-size: 16px;
        }

        .container .item .change {
    
    
            width: 100px;
            position: absolute;
            top: 0;
            right: 50px;
        }

        .container .item .change a {
    
    
            font-size: 20px;
            width: 30px;
            text-decoration: none;
            background-color: lightgray;
            vertical-align: middle;
        }

        .container .item .change .num {
    
    
            width: 40px;
            height: 25px;
        }

        .container .item .del {
    
    
            position: absolute;
            top: 0;
            right: 0px;
            width: 40px;
            text-align: center;
            font-size: 40px;
            cursor: pointer;
            color: red;
        }

        .container .item .del:hover {
    
    
            background-color: orange;
        }

El código principal para realizar la función.

<div id="app">
        <my-cart></my-cart>
    </div>

    <script type="text/javascript" src="../js/vue.js"></script>
    <script type="text/javascript">
        var CarTitle = {
     
     
            props: ['uname'],
            template: `
        <div class='title'>{
      
      {uname}}的商品</div>
        `
        }
        var CarList = {
     
     
            props: ['list'],
            template: ` 
         <div>
                <div :key='item.id' v-for='item in list' class="item">
                    <img :src="item.img">
                    <div class='name' >{
      
      {item.name}}</div>
                    <div class="change">
                        <a href="" @click.prevent='sub(item.id)'>—</a>
                        <input type="text" class="num" :value='item.num' @blur='changeNum(item.id,$event)' />
                        <a href="" @click.prevent='add(item.id)'>+</a>
                    </div>
                    <div class="del"  @click='del(item.id)'>x</div>
                </div>
            </div>

        `,
            methods: {
     
     
                changeNum: function (id, event) {
     
     
                    // console.log(id, event.target.value)
                    // 触发自定义事件
                    this.$emit('change-num', {
     
     
                        id: id,
                        num: event.target.value,
                        type: 'change'
                    })
                },
                sub: function (id) {
     
     
                    this.$emit('change-num', {
     
     
                        id: id,
                        type: 'sub'
                    })
                },
                add: function (id) {
     
     
                    this.$emit('change-num', {
     
     
                        id: id,
                        type: 'add'
                    })
                },
                del: function (id) {
     
     
                    // 把id传递给父组件
                    // console.log(id);
                    this.$emit('cart-del', id);
                }
            },
        }
        var CarTotal = {
     
     
            props: ['list'],
            template: `
            <div class="total">
                <span>总价:{
      
      {total}}</span>
                <button>结算</button>
            </div>
        `,
            // 添加第三属性
            computed: {
     
     
                total: function () {
     
     
                    // 计算商品的总价
                    var t = 0;
                    this.list.forEach((item) => {
     
     
                        t += item.price * item.num;
                    })
                    return t;
                }
            }
        }
        Vue.component('my-cart', {
     
     
            // 包含三个子属性  (局部属性)
            data: function () {
     
     
                return {
     
     
                    uname: '张三',
                    list: [
                        {
     
     
                            id: 1,
                            name: 'TCL彩电',
                            price: 1000,
                            num: 2,
                            img: 'img/a.jpg'
                        },
                        {
     
     
                            id: 2,
                            name: '机顶盒',
                            price: 2000,
                            num: 1,
                            img: 'img/b.jpg'
                        },
                        {
     
     
                            id: 3,
                            name: '海尔冰箱',
                            price: 1000,
                            num: 1,
                            img: 'img/c.jpg'
                        },
                        {
     
     
                            id: 4,
                            name: '小米手机',
                            price: 1000,
                            num: 1,
                            img: 'img/d.jpg'
                        },
                        {
     
     
                            id: 5,
                            name: '电视机',
                            price: 1000,
                            num: 1,
                            img: 'img/e.jpg'
                        }
                    ]
                }
            },
            template: `
            <div class="container">
                <cart-title :uname='uname'></cart-title>
                <cart-list :list='list' @change-num='changeNum($event)' @cart-del='delCart($event)'></cart-list>
                <cart-total :list='list'></cart-total>
            </div>
            `,
            components: {
     
     
                'cart-title': CarTitle,
                'cart-list': CarList,
                'cart-total': CarTotal,
            },
            methods: {
     
     
                changeNum: function (val) {
     
     
                    // 分为三种情况 : 输入域变更,加号变更,减号变更
                    if (val.type == 'change') {
     
     
                        // 根据子组件传递过来的数据,跟新list中对应的数据
                        this.list.some(item => {
     
     
                            if (item.id == val.id) {
     
     
                                item.num = val.num;
                                //     // 终止遍历
                                console.log(item.num)
                                return true;
                            }
                        })
                    } else if (val.type == 'sub') {
     
     
                        // 减一操作
                        this.list.some(item => {
     
     
                            if (item.id == val.id) {
     
     
                                item.num = 1;
                                //     // 终止遍历
                                return true;
                            }
                        })
                    } else if (val.type == 'add') {
     
     
                        // 加一操作
                        this.list.some(item => {
     
     
                            if (item.id == val.id) {
     
     
                                item.num += 1
                                //     // 终止遍历
                                return true;
                            }
                        })
                    }


                },
                delCart: function (id) {
     
     
                    // 根据id删除list中对应的数据
                    // 1.根据id 所对应数据的索引
                    var index = this.list.findIndex(item => {
     
     
                        return item.id == id;
                    });
                    // 2.根据索引删除对应的数据
                    this.list.splice(index, 1)
                }
            }
        })
        var vm = new Vue({
     
     
            el: '#app',
            data: {
     
     

            }
        })
    </script>

Automotivación

No hay un camino recto en la vida. Cuando te sientas confundido o perdido, busca algunas películas llenas de energía positiva, siéntate y disfrútalas en silencio para descubrir las cosas realmente importantes de la vida.

Supongo que te gusta

Origin blog.csdn.net/weixin_50001396/article/details/112869192
Recomendado
Clasificación