React跨组件同步API数据:如何用搜索组件返回结果更新展示组件状态
核心解决思路
将共享的玩家数据状态、接口请求逻辑提升到两个组件的公共父组件中,通过props向Search组件传递搜索触发回调,向Player组件传递渲染用的玩家数据,即可实现搜索结果联动更新,全程使用服务端返回的筛选数据,不需要前端过滤全量数据。
具体实现代码
1. 公共父组件(以App.js为例,即同时渲染return (<Search />)
和return (<Player />)
的组件)
return (<Search />)return (<Player />)import { useState, useEffect } from 'react'; import axios from 'axios'; import Search from './SearchBar'; import Player from './PlayerData'; function App() { const [playerData, setPlayerData] = useState([]); // 初始加载全量数据 useEffect(() => { axios.get("http://localhost:3001/api/get") .then((res) => setPlayerData(res.data)) .catch(err => console.log(err)) }, []); // 搜索触发函数,传给Search组件调用 const handleSearch = (searchTerm) => { // 空搜索可按需求返回全量前100条,或者提示输入内容 if (!searchTerm.trim()) { axios.get("http://localhost:3001/api/get") .then((res) => setPlayerData(res.data)) .catch(err => console.log(err)) return; } axios.get(`http://localhost:3001/api/getSearchName/${searchTerm}`) .then((res) => setPlayerData(res.data)) .catch(err => console.log(err)) }; return ( <div className="App"> <Search onSearch={handleSearch} /> <Player playerData={playerData} /> </div> ); } export default App;
2. 修改后的SearchBar.js
import { useState } from "react"; const Search = ({ onSearch }) => { const [searchTerm, setSearchTerm] = useState(""); return ( <div className="Search"> <input className="InputField" type="text" placeholder="Enter Username:" onChange={e => setSearchTerm(e.target.value)} // 可选:支持回车触发搜索 onKeyDown={e => e.key === 'Enter' && onSearch(searchTerm)} /> <span className="SearchButton" onClick={() => onSearch(searchTerm)}> Search </span> </div> ) }; export default Search;
3. 修改后的PlayerData.js
import React from 'react'; const Player = ({ playerData }) => { return ( <> {playerData.map((data, id) => { return <div className="Player" key={id}> <span className="Username"> { data.name } </span> <span className="Crystals"> { data.balance } </span> <span className="DateModi"> {Object.keys(JSON.parse(data.items)).length} </span> </div> })} </> ) }; export default Player;
补充说明
如果你的组件嵌套层级很深,逐层传递props过于繁琐,也可以使用useContext实现全局状态共享,不需要修改中间层级组件即可实现跨组件通信。如果需要实现输入实时搜索,建议给handleSearch方法添加防抖逻辑,避免输入过程中频繁调用接口。
内容的提问来源于stack exchange,提问作者Tizzy Cat
相关产品推荐
相关产品推荐

