React项目过滤无消息用户及用户消息合并存储方案咨询
实现方案
1. 过滤无收发消息用户的实现
首先注意现有数据的类型差异:users.json中用户id为字符串类型,messages.json中from、to字段为数字类型,对比时需要先统一类型避免匹配失败。
方案A:后端Node.js处理(推荐)
在接口返回数据前完成过滤,减少前端冗余计算和不必要的数据传输:
// Node.js 接口逻辑示例 const fs = require('fs'); // 读取两个JSON文件 const users = JSON.parse(fs.readFileSync('./users.json', 'utf8')); const messages = JSON.parse(fs.readFileSync('./messages.json', 'utf8')); // 收集所有出现过的活跃用户ID const activeUserIds = new Set(); messages.forEach(msg => { activeUserIds.add(String(msg.from)); activeUserIds.add(String(msg.to)); }); // 过滤出有消息记录的用户 const filteredUsers = users.filter(user => activeUserIds.has(user.id)); // 接口返回filteredUsers即可
前端无需修改原有代码,直接请求接口拿到的就是过滤后的用户列表。
方案B:前端直接处理
如果暂时无法修改后端接口,可在前端同时拉取用户和消息数据后过滤:
import React, { useEffect, useState } from "react"; import axios from "axios"; import ShowRecentSingle from "./ShowRecentSingle"; function Showusers() { const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { // 并行请求用户、消息数据,需确保后端提供messages接口 Promise.all([ axios.get("http://localhost:3005/users"), axios.get("http://localhost:3005/messages") ]).then(([userRes, msgRes]) => { const allUsers = userRes.data; const allMessages = msgRes.data; const activeIds = new Set(); allMessages.forEach(msg => { activeIds.add(String(msg.from)); activeIds.add(String(msg.to)); }); setUsers(allUsers.filter(user => activeIds.has(user.id))); setLoading(false); }).catch(err => { console.error(err); setLoading(false); }); }, []); return ( <div> {!loading && users.map((user) => ( // 优化:key使用唯一的user.id,替代map的index,避免列表重排时渲染异常 <ShowRecentSingle key={user.id} user={user} /> ))} <input type="text" name="message" className="message-input" placeholder="type new message....." /> </div> ); } export default Showusers;
2. 合并users和messages存储的方案
不推荐将两类数据直接塞到单个数组中,会产生大量冗余数据,修改用户信息时需要同步更新所有关联的消息条目,维护成本极高。如果确实需要合并存储,可采用嵌套结构:
[ { "id": "1", "name": "Rampal", "sentMessages": [ { "to": "2", "message": "Please call me", "timestamp": 123456789 } ], "receivedMessages": [] } ]
该方案仅适用于数据量极小的简单Demo,生产环境更推荐你当前使用的「分表+ID关联」的存储结构,灵活性更高、维护成本更低。
内容的提问来源于stack exchange,提问作者Puneet Biswas
相关产品推荐
相关产品推荐

