从零开始搭建群众权益平台(六)

简介: 从零开始搭建群众权益平台(六)

本篇博客我们将继续完善处理错误,显示加载指示器,实现表单验证,处理跨域请求等。

错误处理:

在前端代码中,我们应当为所有网络请求添加错误处理逻辑。例如,如果后端返回了一个错误码,我们应当在前端捕获到这个错误,并向用户显示一个错误消息。

这里是一个简单的错误处理的例子:

async function handleSubmit(event) {
  event.preventDefault();
  try {
    const response = await axios.post('/api/login', { username, password });
    setToken(response.data.token);
  } catch (error) {
    console.error(error);
    if (error.response) {
      // 服务器返回了错误响应
      alert(`Login failed: ${error.response.data.message}`);
    } else {
      // 网络请求失败
      alert('Login failed: network error');
    }
  }
}

加载指示器:

如果一个操作需要花费一些时间来完成,例如网络请求,那么我们应该在这个操作进行期间显示一个加载指示器。

下面是如何在请求过程中显示一个加载指示器的例子:

function LoginPage() {
  const [loading, setLoading] = useState(false);
  // ...
  async function handleSubmit(event) {
    event.preventDefault();
    setLoading(true);
    try {
      const response = await axios.post('/api/login', { username, password });
      setToken(response.data.token);
    } catch (error) {
      // handle error...
    }
    setLoading(false);
  }
  return (
    <div>
      {loading ? <p>Loading...</p> : null}
      {/* other elements... */}
    </div>
  );
}

表单验证:

我们可以使用各种技术和库来实现表单验证,例如HTML5的内置验证功能,或者yupjoi等库。

这是一个使用HTML5内置验证功能的例子:

<form onSubmit={handleSubmit}>
  <input type="text" value={username} onChange={e => setUsername(e.target.value)} required />
  <input type="password" value={password} onChange={e => setPassword(e.target.value)} required minLength="8" />
  <button type="submit">Log in</button>
  {/* other elements... */}
</form>

跨域请求:

如果你的前端和后端部署在不同的域名下,你需要配置后端服务器来允许跨域请求。如果你的后端服务器是Express,你可以使用cors中间件来实现这个功能。

这是配置Express服务器允许所有跨域请求的代码

const cors = require('cors');
app.use(cors());

状态管理库:

如果你的应用的状态变得复杂,你可能需要引入一个状态管理库来帮助你管理状态。Redux和Vuex是两个流行的选择。

在Redux中,你创建一个或多个reducer来处理各种action,然后使用createStore函数来创建一个store。你可以使用store.dispatch来发送一个action,然后使用store.getState来获取当前的状态。你还可以使用react-redux库来连接你的React组件和Redux store。

在Redux中,创建一个简单的reducer和store的例子如下:

import { createStore } from 'redux';
function reducer(state = { token: null }, action) {
  switch (action.type) {
    case 'SET_TOKEN':
      return { ...state, token: action.payload };
    default:
      return state;
  }
}
const store = createStore(reducer);

然后你可以在你的组件中使用 react-redux 提供的 Providerconnect 函数来连接你的 React 组件和 Redux store。

import { Provider } from 'react-redux';
import { connect } from 'react-redux';
function LoginPage({ token, setToken }) {
  // ...
}
// 这个函数定义了如何将 Redux store 的状态映射到你的组件的 props
function mapStateToProps(state) {
  return { token: state.token };
}
// 这个函数定义了如何将 dispatch 函数映射到你的组件的 props
function mapDispatchToProps(dispatch) {
  return {
    setToken: token => dispatch({ type: 'SET_TOKEN', payload: token })
  };
}
// 使用 connect 函数连接你的组件和 Redux store
const ConnectedLoginPage = connect(mapStateToProps, mapDispatchToProps)(LoginPage);
// 在你的应用中使用 Provider 组件来提供 store
function App() {
  return (
    <Provider store={store}>
      <ConnectedLoginPage />
    </Provider>
  );
}

这只是 Redux 的基础使用。在实际的项目中,你可能还需要处理异步 action,组合多个 reducer,以及其他更复杂的用例。你可以查阅 Redux 的文档来了解更多信息。

Context 和 Hooks:

如果你不想使用状态管理库,或者你的项目不大到需要使用状态管理库,那么 Context 和 Hooks 是一个好的选择。在 React 中,你可以使用 Context 来在组件树中传递数据,而不需要通过每一层的 props 来手动传递。而 Hooks 可以让你在函数组件中使用状态和其他 React 特性。

下面是一个使用 Context 和 Hooks 的例子:

import React, { createContext, useState, useContext } from 'react';
const TokenContext = createContext();
function LoginPage() {
  const [token, setToken] = useContext(TokenContext);
  // ...
}
function App() {
  const tokenState = useState(null);
  return (
    <TokenContext.Provider value={tokenState}>
      <LoginPage />
    </TokenContext.Provider>
  );
}

注意,这只是一种基本的使用方法。在实际的项目中,你可能需要创建多个 context,或者使用更复杂的 hooks,例如 useEffectuseReduceruseCallback,等等。你可以查阅 React 的文档来了解更多信息。

目录
相关文章
|
7月前
|
人工智能 C# C++
在 Visual Studio 上体验腾讯云 AI 代码助手
本文介绍如何在 Visual Studio 2022 中安装和使用腾讯云 AI 代码助手。首先,通过扩展管理器搜索并安装插件,重启 VS 完成安装。接着,在工具栏的“工具”中找到并启动助手,快捷键为 ALT + T。测试时输入问题如冒泡排序,助手会生成 C# 代码并可直接运行。建议优化默认代码语言为 C#、增加代码插入功能,并统一显示位置以提升用户体验。
383 1
replaceAll 的用法总结
replaceAll 的用法总结
|
10月前
|
存储 前端开发 搜索推荐
淘宝 1688 API 接口助力构建高效淘宝代购集运系统
在全球化商业背景下,淘宝代购集运业务蓬勃发展,满足了海外消费者对中国商品的需求。掌握淘宝1688 API接口是构建成功代购系统的關鍵。本文详细介绍如何利用API接口进行系统架构设计、商品数据同步、订单处理与物流集成,以及用户管理和客户服务,帮助你打造一个高效便捷的代购集运系统,实现商业价值与用户满意度的双赢。
|
Web App开发 前端开发 JavaScript
超实用的Chrome DevTools调试技巧
超实用的Chrome DevTools调试技巧
264 0
|
Linux API C++
音视频windows安装ffmpeg6.0并使用vs调试源码笔记
音视频windows安装ffmpeg6.0并使用vs调试源码笔记
491 0
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之在进行全量同步时,遇到checkpoint超时或保存失败如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
204 1
|
SQL 机器学习/深度学习 分布式计算
大数据平台之Spark
Apache Spark 是一个开源的分布式计算系统,主要用于大规模数据处理和分析。它由UC Berkeley AMPLab开发,并由Apache Software Foundation维护。Spark旨在提供比Hadoop MapReduce更快的处理速度和更丰富的功能,特别是在处理迭代算法和交互式数据分析方面。
331 0
|
机器学习/深度学习 监控 算法框架/工具
使用ViT进行图像分类
使用ViT进行图像分类
484 0
|
前端开发 开发者 容器
CSS进阶-盒模型调整:box-sizing
【6月更文挑战第14天】`box-sizing`属性在CSS中调整盒模型行为,让元素宽度和高度包含内容、内边距和边框。默认是`content-box`,仅计算内容区,而`border-box`则包含所有。不一致的布局、预期尺寸不符和复杂计算错误是常见问题。使用`* { box-sizing: border-box; }`可简化布局,确保元素尺寸直观一致。了解和正确使用`box-sizing`能提升布局效率和准确性。
272 0
|
网络协议 Ubuntu Unix
Go语言TCP Socket编程(上)
Go语言TCP Socket编程
284 0