美文网首页React中购物车功能的实现(简易版)
React 中购物车功能实现(实现总价的动态生成)

React 中购物车功能实现(实现总价的动态生成)

作者: 一只程序元 | 来源:发表于2022-07-30 13:05 被阅读0次

样式代码:

import React, { Component } from 'react'
import "./Page.css"

export default class Page extends Component {
  state = {
    arr: [
      { id: 1, goodName: '杨枝甘露', goodPrice: 20, num: 1 },
      { id: 2, goodName: '森林玫果', goodPrice: 30, num: 1 },
      { id: 3, goodName: '烤奶', goodPrice: 15, num: 1 }
    ],
    allChecked: false,
    totalPrice: 0
  }

  checkNum = 0

  itemChange = (event, e) => {
    const checked = event.target.checked;
    const { arr } = this.state;
    e.checked = checked;
    if (checked) {
      this.checkNum++;
    } else {
      this.checkNum--;
    }
    if (this.checkNum === arr.length) {
      this.setState({
        allChecked: true
      })
    } else {
      this.setState({
        allChecked: false,
        totalPrice: this.calTotal()
      })
    }
  }

  allChose = e => {
    const checked = e.target.checked;
    const { arr } = this.state;
    this.setState({
      allChecked: checked
    })
    arr.map(e => e.checked = checked)

    this.setState({
      arr,
      totalPrice: this.calTotal()
    })
    if (checked) {
      this.checkNum = arr.length;
    } else {
      this.checkNum = 0
    }
  }

  test = () => {
    console.log('');
  }


  addNum = (e) => {
    const { arr } = this.state;
    arr.forEach(k => {
      if (k.id === e.id) {
        k.num = e.num + 1
      }
    })
    this.setState({
      arr,
      totalPrice: this.calTotal()
    })
  }

  subNum = e => {
    const { arr } = this.state;
    arr.forEach(k => {
      if (k.id === e.id && e.num > 1) {
        k.num = e.num - 1
      }
    })
    this.setState({
      arr,
      totalPrice: this.calTotal()
    })
  }


  render() {
    const { arr } = this.state;
    return (
      <div className='Box'>
        <li>
          <input type="checkbox" style={{ marginRight: '10px' }} checked={this.state.allChecked} onChange={this.allChose} />全选
        </li>
        {
          arr.map(e =>
            <li key={e.id}>
              <input type="checkbox" style={{ marginRight: '10px' }} checked={e.checked || false} onChange={(event) => this.itemChange(event, e)} />
              <span>{`商品名称:${e.goodName}`}</span>
              <span>{`单价:${e.goodPrice}`}</span>
              <button onClick={() => this.subNum(e)}>-</button>
              <input type="text" className='num_box' value={e.num} onChange={this.test} />
              <button onClick={() => this.addNum(e)}>+</button>
            </li>
          )
        }
        <div className='foot'>
          <p style={{ fontSize: '18px', textAlign: 'right' }}>{`结算: ¥${this.state.totalPrice}`}</p>
        </div>


      </div>
    )
  }
}

我的实现思路:

1、首先在state状态中增加totalPrice属性,并将它的初值设置为0;
2、创建一个calTotal函数用来计算总价;
   calTotal逻辑:接收一个数据(在这里为数组),并在函数体中判断,如果传入的有数据那么就使用传入的数组,否则将state中的数据拿出进行处理,将数组中checked为true的对象取出处理:numgoodPrice 并赋值给total, 最终函数体返回最终的total*
3、在每一次的加减、选中等操作的最后调用计算calTotal函数


calTotal函数展示如下:

  calTotal = cartList => {
    if (!cartList) {cartList = this.state.arr}
    let total = 0;
    cartList.forEach(e => {
      if (e.checked) {
        total += e.num * e.goodPrice
      }
    })
    return total
  }

4、最后在相应的的操作之后调用这个函数,更新到state最终渲染到页面(具体见样式代码)

终---

相关文章

网友评论

    本文标题:React 中购物车功能实现(实现总价的动态生成)

    本文链接:https://www.haomeiwen.com/subject/xbchwrtx.html