返回

剖析基于React.js的后台管理系统开发过程(三)

前端

继续我们的基于 React.js 的后台管理系统开发全过程之旅,我们来到第三部分。这一部分,我们将探讨代码库结构、路由配置、HTTP 请求、数据交互、组件复用、单元测试和部署上线等方面。准备好在 React.js 的世界中大展身手了吗?那就开始吧!

代码库结构

一个井井有条的代码库结构是开发项目的基石。对于我们的 React.js 后台管理系统,我们将采用经典的目录结构:

  • src :存放所有源代码,包括组件、样式表和脚本
  • public :存放静态资源,如图像、字体和图标
  • node_modules :存放依赖包
  • package.json :项目配置信息,包括依赖项、脚本和元数据
  • README.md :项目文档,介绍项目目的、安装说明和使用指南

路由配置

路由是单页应用程序中不可或缺的一部分。它允许我们在不重新加载页面的情况下,在不同页面之间导航。在我们的项目中,我们将使用 React Router,一个流行的路由库,来管理路由。

我们首先在 src 目录下创建一个 App.js 文件,作为应用的入口。在 App.js 中,我们导入必要的组件和库,并配置路由:

import React, { useState } from "react";
import { BrowserRouter as Router, Switch, Route } from "react-router-dom";

// 导入组件
import Home from "./pages/Home";
import About from "./pages/About";
import Contact from "./pages/Contact";

function App() {
  return (
    <Router>
      <Switch>
        <Route exact path="/" component={Home} />
        <Route path="/about" component={About} />
        <Route path="/contact" component={Contact} />
      </Switch>
    </Router>
  );
}

export default App;

这段代码配置了三个路由:根路由 / 对应 Home 组件,/about 路由对应 About 组件,/contact 路由对应 Contact 组件。当用户访问这些路由时,相应的组件将被渲染。

HTTP 请求

在后台管理系统中,HTTP 请求是必不可少的。我们需要与服务器进行通信,获取和更新数据。在我们的项目中,我们将使用 Axios,一个流行的 HTTP 请求库,来处理 HTTP 请求。

我们首先在 src 目录下创建一个 api.js 文件,作为 HTTP 请求的封装:

import axios from "axios";

const API_URL = "http://localhost:8000/api";

export const getProducts = () => {
  return axios.get(`${API_URL}/products`);
};

export const getProduct = (id) => {
  return axios.get(`${API_URL}/products/${id}`);
};

export const createProduct = (product) => {
  return axios.post(`${API_URL}/products`, product);
};

export const updateProduct = (id, product) => {
  return axios.put(`${API_URL}/products/${id}`, product);
};

export const deleteProduct = (id) => {
  return axios.delete(`${API_URL}/products/${id}`);
};

这段代码封装了五个 HTTP 请求:获取所有产品、获取单个产品、创建产品、更新产品和删除产品。这些函数接受必要的参数,并返回一个 Promise 对象,以便在组件中使用 async/await 语法。

数据交互

在 React.js 中,组件之间的通信是至关重要的。我们需要在组件之间传递数据,以便实现交互。在我们的项目中,我们将使用 Redux,一个流行的状态管理库,来管理数据。

我们首先在 src 目录下创建一个 store.js 文件,作为 Redux store:

import { createStore, combineReducers } from "redux";

const initialState = {
  products: [],
};

const rootReducer = combineReducers({
  products: (state = initialState.products, action) => {
    switch (action.type) {
      case "GET_PRODUCTS":
        return action.payload;
      case "CREATE_PRODUCT":
        return [...state, action.payload];
      case "UPDATE_PRODUCT":
        return state.map((product) => (product.id === action.payload.id ? action.payload : product));
      case "DELETE_PRODUCT":
        return state.filter((product) => product.id !== action.payload);
      default:
        return state;
    }
  },
});

const store = createStore(rootReducer);

export default store;

这段代码创建了一个 Redux store,并定义了一个名为 products 的 reducer。reducer 是一个纯函数,它接受 state 和 action,并返回新的 state。在我们的例子中,reducer 负责管理产品数据。

接下来,我们在组件中使用 Redux 的 connect() 方法,将组件连接到 Redux store。这使得组件可以访问 Redux store 中的数据,并可以 dispatch action 来修改数据。

组件复用

在 React.js 中,组件复用是提高代码可维护性和可重用性的关键。我们可以通过创建可复用的组件,并在不同的位置使用它们,来实现组件复用。

在我们的项目中,我们将创建一些可复用的组件,如 HeaderFooterProductCardProductForm。这些组件可以被不同的页面使用,从而减少代码重复。

单元测试

单元测试是确保代码质量和可靠性的重要手段。在 React.js 中,我们可以使用 Jest,一个流行的单元测试框架,来编写单元测试。

我们首先在 package.json 文件中添加 Jest 的依赖:

{
  "devDependencies": {
    "jest": "^28.0.1"
  }
}

然后,我们在 src 目录下创建一个 __tests__ 目录,并在其中创建一个 ProductCard.test.js 文件,作为 ProductCard 组件的单元测试:

import React from "react";
import { render, screen } from "@testing-library/react";
import ProductCard from "../components/ProductCard";

test("renders product card", () => {
  const product = {
    id: 1,
    name: "Product 1",
    price: 100,
    image: "product1.jpg",
  };

  render(<ProductCard product={product} />);

  const productCard = screen.getByTestId("product-card");
  expect(productCard).toBeInTheDocument();

  const productName = screen.getByTestId("product-name");
  expect(productName).toHaveTextContent("Product 1");

  const productPrice = screen.getByTestId("product-price");
  expect(productPrice).toHaveTextContent("$100");

  const productImage = screen.getByTestId("product-image");
  expect(productImage).toHaveAttribute("src", "product1.jpg");
});

这段代码使用 Jest 和 @testing-library/react 来测试 ProductCard 组件。它渲染组件,并使用 screen API 来查询 DOM 元素。然后,它断言这些元素存在并具有正确的内容。

部署上线

当我们的项目开发完成后,我们需要将其部署到生产环境,以便用户可以访问它。在我们的项目中,我们将使用 Netlify,一个流行的静态网站托管平台,来部署我们的项目。

首先,我们在 Netlify 网站上创建一个账户,并创建一个新的项目。然后,我们将项目的构建产物上传到 Netlify。Netlify 将自动将我们的项目部署到生产环境,并提供一个 URL,以便用户可以访问它。

至此,我们已经完成了基于 React.js 的后台管理系统开发全过程。我们已经学习了如何构建代码库结构、配置路由、处理 HTTP 请求、管理数据、复用组件、编写单元测试和部署项目。希望这些知识能帮助你开发出更强大的 React.js 应用