返回

React生态下的 dva + umi 购物车案例实现

前端

前言

在前端开发中,我们经常需要构建一些复杂的数据驱动的应用。为了管理这些应用中的数据,我们需要使用一些状态管理框架。dva和umi就是两个非常流行的状态管理框架。

dva是基于Redux的状态管理框架,它提供了丰富的API和插件,可以帮助我们轻松地管理应用中的数据。umi是一个基于dva的应用框架,它集成了路由、数据请求、状态管理等功能,可以帮助我们快速地构建前端应用。

dva + umi购物车的实现

在这个案例中,我们将使用dva和umi来构建一个简单的购物车应用。这个应用的主要功能是:

  • 展示商品列表
  • 将商品添加到购物车
  • 从购物车中移除商品
  • 计算购物车的总价格

我们首先需要创建一个新的umi项目。可以使用以下命令来创建一个新的umi项目:

npx create-umi my-app

然后,我们需要在项目中安装dva。可以使用以下命令来安装dva:

npm install dva

接下来,我们需要在项目中创建models、services、routes等文件。

models

src/models/products.js
import { queryProducts } from '../services/products';
import { message } from 'antd';

export default {
  namespace: 'products',

  state: {
    list: [],
  },

  effects: {
    *fetchProducts(_, { call, put }) {
      const response = yield call(queryProducts);
      yield put({
        type: 'saveProducts',
        payload: response.data,
      });
    },
  },

  reducers: {
    saveProducts(state, action) {
      return {
        ...state,
        list: action.payload,
      };
    },
  },
};

services

src/services/products.js
import request from '../utils/request';

export async function queryProducts() {
  return request('/api/products');
}

routes

src/routes/index.js
import React from 'react';
import { Route, Switch } from 'umi';
import Products from './Products';
import ShoppingCart from './ShoppingCart';

export default function Index() {
  return (
    <Switch>
      <Route path="/products" component={Products} />
      <Route path="/shopping-cart" component={ShoppingCart} />
      <Route path="/" component={Products} />
    </Switch>
  );
}

components

src/pages/Products/index.js
import React, { useEffect } from 'react';
import { connect } from 'dva';
import { Button, Col, Row } from 'antd';
import ProductItem from '../../components/ProductItem';

function Products({ products, dispatch }) {
  useEffect(() => {
    dispatch({
      type: 'products/fetchProducts',
    });
  }, []);

  return (
    <div>
      <Row gutter={16}>
        {products.list.map((product) => (
          <Col key={product.id} span={6}>
            <ProductItem product={product} />
          </Col>
        ))}
      </Row>
    </div>
  );
}

export default connect(({ products }) => ({ products }))(Products);
src/pages/ShoppingCart/index.js
import React, { useEffect, useState } from 'react';
import { connect } from 'dva';
import { Button, Col, Row, Table } from 'antd';

function ShoppingCart({ products, dispatch }) {
  const [cartItems, setCartItems] = useState([]);

  useEffect(() => {
    dispatch({
      type: 'products/fetchProducts',
    });
  }, []);

  const handleAddToCart = (product) => {
    const newCartItems = [...cartItems, product];
    setCartItems(newCartItems);
  };

  const handleRemoveFromCart = (product) => {
    const newCartItems = cartItems.filter((item) => item.id !== product.id);
    setCartItems(newCartItems);
  };

  const columns = [
    {
      title: 'Name',
      dataIndex: 'name',
      key: 'name',
    },
    {
      title: 'Price',
      dataIndex: 'price',
      key: 'price',
    },
    {
      title: 'Quantity',
      dataIndex: 'quantity',
      key: 'quantity',
    },
    {
      title: 'Action',
      key: 'action',
      render: (product) => (
        <Button onClick={() => handleRemoveFromCart(product)}>Remove</Button>
      ),
    },
  ];

  return (
    <div>
      <Row>
        <Col span={12}>
          <Table columns={columns} dataSource={cartItems} />
        </Col>
        <Col span={12}>
          <Button>Checkout</Button>
        </Col>
      </Row>
    </div>
  );
}

export default connect(({ products }) => ({ products }))(ShoppingCart);

总结

在这个案例中,我们使用了dva和umi来构建了一个简单的购物车应用。在这个应用中,我们使用了dva来管理应用中的数据,使用umi来构建应用的结构和路由。通过这个案例,我们学习了如何使用dva和umi来构建前端应用,以及如何使用dva和umi来进行数据请求和购物车管理。