热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用Go和ReactJS构建聊天系统(三):设计我们的前端

在本节中,我们将着眼于改进前端并充实该应用程序,使其看起来像一个正规的在线聊天应用程序。本节完成后的效果如下:基于组件的方法在React以及所有其他流行的前端框架中,我们倾向于将应






在本节中,我们将着眼于改进前端并充实该应用程序,使其看起来像一个正规的在线聊天应用程序。

本节完成后的效果如下:

Chat Application Screenshot


基于组件的方法

在 React 以及所有其他流行的前端框架中,我们倾向于将应用程序划分为一系列组件。 每个组件通常代表应用程序上的一个元素,例如我们应用程序内的用户列表或聊天记录部分。

这种基于组件的方法有很多优点,并且有效地允许较大的团队处理单个组件,而不必影响其他团队处理应用程序。这些组件为您提供了一定的 系统解耦,并且有效地允许您通过组合构建应用程序,并在逻辑上对目录结构进行分组。


头部组件

让我们从创建一个简单的 Header 组件开始。为此,我们将在 frontend/src/ 目录下创建一个名为 components/ 的目录,并在其中创建 Header/ 目录,该目录将存放 Header 组件的所有文件。

- src/
- - components/
- - - Header/
- - - - Header.jsx
- - - - index.js
- - - - Header.scss

注意 - 未来,无论何时创建新组件,我们都会在 components/ 目录中为其创建新目录,并且通常将在该目录中创建这三个文件。



Header.jsx

让我们在 Header.jsx 文件中实现我们的 function component。这将为我们的网站提供一个简单的标题:

import React from "react";
import "./Header.scss";
const Header = () => (


Realtime Chat App



);
export default Header;

Header.scss

接下来,我们要给它一些样式。ReactJS 项目没有自动提供处理 scss 文件的功能,因此我们首先需要通过在 frontend / 目录中运行以下命令来安装 node-sass

$ yarn add node-sass

而且,安装完后,我们就可以像这样添加样式:

.header {
background-color: #15223b;
width: 100%;
margin: 0;
padding: 10px;
color: white;
h2 {
margin: 0;
padding: 0;
}
}

index.js

最后,我们将要导出 Header 组件,以便应用程序中的其他组件随后可以导入它并在其自己的 render() 函数中进行渲染:

import Header from "./header.jsx";
export default Header;

更新我们的 App.js

现在我们已经创建了新的 Header 组件,让我们尝试将其导入到 App.js 组件中,然后将其添加到我们的 render() 函数中进行显示,如下所示:

// App.js
// 从相对路径导入我们的新组件
import Header from './components/Header/Header';
// ...
render() {
return (





);
}

保存后,前端应用程序应重新编译,并且应该在浏览器页面顶部看到成功渲染新的 Header 组件。


恭喜 —— 您已经成功创建了第一个 React 组件!



聊天记录组件

好的,我们已经成功构建并渲染了一个非常简单的组件,让我们构建更多。

在本节中,我们将创建一个聊天记录组件,该组件将显示从 WebSocket 服务器收到的所有消息。

我们将再一次在 components/ 目录中创建一个新文件夹,但是这次目录名为 ChatHistory/。 创建此目录后,让我们为组件创建三个文件。


ChatHistory.jsx

让我们从 ChatHistory.jsx 文件开始。这次,它将变得稍微复杂些,因为我们将要构建一个 Class 组件,而不是上面用于 Header 组件的 Function 组件。


注意: 我们可以使用 ES6 class 来定义类组件。如果您想详细了解两者之间的差异,建议您在此处查看官方文档: Function 和 Class 组件


您会注意到在这个 Component 组件中有一个 render() 函数。render() 函数的作用是返回我们希望在应用程序中为该特定组件呈现的 jsx

该组件将从其 App.js 函数通过其 props 获取一个聊天消息数组,随后将它们相互呈现。

import React, { Component } from "react";
import "./ChatHistory.scss";
class ChatHistory extends Component {
render() {
const messages = this.props.chatHistory.map((msg, index) => (

{msg.data}


));
return (

Chat History


{messages}

);
}
}
export default ChatHistory;

ChatHistory.scss

让我们在 ChatHistory.scss 文件的 ChatHistory 组件中添加一些样式,这只是简单的背景颜色更改,并且对填充和边距进行了一些更新:

.ChatHistory {
background-color: #f7f7f7;
margin: 0;
padding: 20px;
h2 {
margin: 0;
padding: 0;
}
}

Index.js

最后,我们需要导出新组件,就像我们处理 Header 组件一样,以便可以将其导入 App.js 并进行渲染:

import ChatHistory from "./ChatHistory.jsx";
export default ChatHistory;

App.js 和 api/index.js 的更新

所以,现在我们有了 ChatHistory 组件,我们需要向它提供一些消息。

在本系列的前一部分中,我们建立了双向通信,以回显发送给它的所有内容,因此从技术上讲,每当我们在应用程序中点击 send message 按钮时,我们都会获得一个简单的新消息源。

让我们更新我们的 api/index.js 文件并更新我们的 connect() 函数,以便每当它从 WebSocket 连接接收到新消息时都会触发回调:

let cOnnect= cb => {
console.log("connecting");
socket.Onopen= () => {
console.log("Successfully Connected");
};
socket.Onmessage= msg => {
console.log(msg);
cb(msg);
};
socket.Onclose= event => {
console.log("Socket Closed Connection: ", event);
};
socket.Onerror= error => {
console.log("Socket Error: ", error);
};
};

因此,我们在函数中添加了一个 cb 参数。每当我们收到消息时,就会在 line 10 调用此 cb

进行了这些更改后,无论何时收到新消息,我们都可以更新 App.js 以添加此回调函数并使用 setState 更新状态。

我们将把我们的 connect() 调用从 constructor 移到一个 componentDidMount() 函数中,该函数将在组件生命周期中被自动调用。

// App.js
componentDidMount() {
connect((msg) => {
console.log("New Message")
this.setState(prevState => ({
chatHistory: [...this.state.chatHistory, msg]
}))
console.log(this.state);
});
}

然后,我们要更新我们的 render() 函数并显示我们的 ChatHistory 组件:

render() {
return (






);
}

当我们编译并运行 frontend 和 backend 时,我们应该看到,只要我们点击前端上的 send message 按钮,它就会继续通过 WebSocket 连接向后端发送消息,然后我们的后端回显它返回到前端,并在我们的 ChatHistory 组件中成功渲染!

Chat Application Screenshot


总结

本节,我们成功地改进了前端应用程序,并将其作为聊天应用程序一起使用。在下一节中,我们将重点关注以下内容:


  • 改进前端以添加新的发送消息组件,以允许我们将自定义消息发送回服务器。

  • 改进我们的后端以处理多个客户端和跨客户端通信。


本文译自tutorialedge





推荐阅读
  • 本文介绍了如何在 Vue 3 组合 API 中正确设置 setup() 函数的 TypeScript 类型,以避免隐式 any 类型的问题。 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 利用REM实现移动端布局的高效适配技巧
    在移动设备上实现高效布局适配时,使用rem单位已成为一种流行且有效的技术。本文将分享过去一年中使用rem进行布局适配的经验和心得。rem作为一种相对单位,能够根据根元素的字体大小动态调整,从而确保不同屏幕尺寸下的布局一致性。通过合理设置根元素的字体大小,开发者可以轻松实现响应式设计,提高用户体验。此外,文章还将探讨一些常见的问题和解决方案,帮助开发者更好地掌握这一技术。 ... [详细]
  • Vim 编辑器功能强大,但其默认的配色方案往往不尽如人意,尤其是注释颜色为蓝色时,对眼睛极为不友好。为了提升编程体验,自定义配色方案显得尤为重要。通过合理调整颜色,不仅可以减轻视觉疲劳,还能显著提高编码效率和兴趣。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • Amoeba 通过优化 MySQL 的读写分离功能显著提升了数据库性能。作为一款基于 MySQL 协议的代理工具,Amoeba 能够高效地处理应用程序的请求,并根据预设的规则将 SQL 请求智能地分配到不同的数据库实例,从而实现负载均衡和高可用性。该方案不仅提高了系统的并发处理能力,还有效减少了主数据库的负担,确保了数据的一致性和可靠性。 ... [详细]
  • 在 Vue 应用开发中,页面状态管理和跨页面数据传递是常见需求。本文将详细介绍 Vue Router 提供的两种有效方式,帮助开发者高效地实现页面间的数据交互与状态同步,同时分享一些最佳实践和注意事项。 ... [详细]
  • CSS3 @font-face 字体应用技术解析与实践
    在Web前端开发中,HTML教程和CSS3的结合使得网页设计更加多样化。长期以来,Web设计师受限于“web-safe”字体的选择。然而,CSS3中的`@font-face`规则允许从服务器端加载自定义字体,极大地丰富了网页的视觉效果。通过这一技术,设计师可以自由选择和使用各种字体,提升用户体验和页面美观度。本文将深入解析`@font-face`的实现原理,并提供实际应用案例,帮助开发者更好地掌握这一强大工具。 ... [详细]
  • 使用 `git stash` 可以将当前未提交的修改保存到一个临时存储区,以便在后续恢复工作目录时使用。例如,在处理中间状态时,可以通过 `git stash` 命令将当前的所有未提交更改推送到一个新的储藏中,从而保持工作目录的整洁。此外,本文还将详细介绍如何解决 `git stash pop` 时可能出现的冲突问题,帮助用户高效地管理代码变更。 ... [详细]
  • 在HTML5应用中,Accordion(手风琴,又称抽屉)效果因其独特的展开和折叠样式而广泛使用。本文探讨了三种不同的Accordion交互效果,通过层次结构优化信息展示和页面布局,提升用户体验。这些效果不仅增强了视觉效果,还提高了内容的可访问性和互动性。 ... [详细]
  • TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得
    TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
author-avatar
叶毒手_938
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有