Reactjs 排序和筛选反应上下文
我做了一点研究,但我发现旧的例子通常是Redux或一个主要组件,无法理解逻辑 我可以从API获取数据,但我确实需要对这些数据进行搜索、排序、筛选等(即使是在同一时间)。我知道我不应该直接改变状态,所以在这种情况下,我将有两个不同的状态集,如Filteredata、Sortedata等。但是,我要传递给播放器组件的状态是什么?排序功能将如何处理过滤后的数据?我非常困惑 我想把我的状态和状态相关的逻辑放在一个上下文中,但如果这看起来有问题或错误,那么我可以尝试你的方法 上下文Reactjs 排序和筛选反应上下文,reactjs,Reactjs,我做了一点研究,但我发现旧的例子通常是Redux或一个主要组件,无法理解逻辑 我可以从API获取数据,但我确实需要对这些数据进行搜索、排序、筛选等(即使是在同一时间)。我知道我不应该直接改变状态,所以在这种情况下,我将有两个不同的状态集,如Filteredata、Sortedata等。但是,我要传递给播放器组件的状态是什么?排序功能将如何处理过滤后的数据?我非常困惑 我想把我的状态和状态相关的逻辑放在一个上下文中,但如果这看起来有问题或错误,那么我可以尝试你的方法 上下文 const Conte
const ContextProvider = ({ children }) => {
const [data, setData] = useState([]);
const [filteredData, setFilteredData] = useState([]);
const [sortedData, setSortedData] = useState([]);
useEffect(() => {
fetch('URL HERE')
.then(data => data.json())
.then(data=> setData(data));
}, []);
const handleSearch = e => {
let value = e.target.value;
const filteredData = data.filter(player=>
player.name.includes(value)
);
setFilteredData(filteredData);
};
const handleSort = e => {
let value = e.target.value;
// I am trying to sort FILTERED DATA?
const sortedData = filteredData.sort((a, b) => {
if (a[value] < b[value]) {
return 1;
} else {
return -1;
}
});
setSortedData(sortedData);
};
return (
<Context.Provider
value={{ data, handleSearch, handleSort, filteredData, sortedData}}
>
{children}
</Context.Provider>
);
};
const ContextProvider=({children})=>{
const[data,setData]=useState([]);
常量[Filteredata,setFilteredata]=useState([]);
常量[sortedData,setSortedData]=useState([]);
useffect(()=>{
fetch('URL HERE')
.then(data=>data.json())
。然后(data=>setData(data));
}, []);
常量handleSearch=e=>{
设值=e.target.value;
常量filteredData=data.filter(播放器=>
player.name.includes(值)
);
设置过滤数据(过滤数据);
};
常量handleSort=e=>{
设值=e.target.value;
//我正在尝试对过滤后的数据进行排序?
const sortedData=filteredData.sort((a,b)=>{
如果(a[值]
搜索
const Search = () => {
const { handleSearch, handleSort } = useContext(Context);
return (
<div className='row'>
<Input
type='search'
name='search'
onChange={handleSearch}
></Input>
<Input
type='select'
name='select'
onChange={handleSort}
>
<option value='name'>Name</option>
<option value='team'>Team</option>
</Input>
</div>
);
};
const Search=()=>{
const{handleSearch,handleSort}=useContext(Context);
返回(
名称
团队
);
};
玩家
const Player = () => {
const {data, filteredData, sortedData} = useContext(Context);
return (
<ul>
//{data or filteredData or sortedData will be mapped?}
<li>// not sure what to do</li>
</ul>
);
};
constplayer=()=>{
const{data,filteredData,sortedData}=useContext(上下文);
返回(
//{将映射数据或Filteredata或Sortedata?}
- //不知道该怎么办
);
};
我非常欣赏有一些解释的代码示例。有很多方法可以做到这一点 我的建议是:-
const[filteredData,setFilteredData]=useState(数据)
(这不起作用)。因此,请在Player
中使用effect()更新filteredata
,然后:-setFilteredata()更新
- 如果用户对
,则返回包含故障输入不做任何操作
数据的
过滤器数据
- 如果用户执行
输入,则执行搜索
搜索过滤
(使用过滤数据
)设置过滤数据()
- 如果用户执行
输入,则在排序
上执行filteredData
(使用排序
)setFilteredData()
- 如果用户同时执行
和搜索
输入,则对排序
执行这两个操作(使用过滤数据
)设置过滤数据()
Player
中,您可以返回filteredData
const ContextProvider=({children})=>{
const[data,setData]=useState([]);
常量[Filteredata,setFilteredata]=useState([]);
const[searchKey,setSearchKey]=useState(“”);
const[sortKey,setSortKey]=useState([]);
useffect(()=>{
fetch('URL HERE')
.then(data=>data.json())
。然后(data=>setData(data));
}, []);
常量handleSearch=()=>{
常量filteredData=filteredData.filter(播放器=>
player.name.includes(搜索键)
);
设置过滤数据(过滤数据);
};
常量handleSort=()=>{
const sortedData=filteredData.sort((a,b)=>{
if(a[sortKey]
搜寻
const Search=()=>{
常数{
搜索键,设置搜索键,
排序键,设置排序键
}=使用上下文(上下文);
返回(
setSearchKey(e.target.value)}
>
setSortKey(e.target.value)}
>
名称
团队
);
};
玩家
constplayer=()=>{
常数{
数据,
过滤数据,设置过滤数据,
搜索键,排序键。
handleSearch,handleSort
}=使用上下文(上下文);
//设置过滤器数据
useffect(()=>{
setFIlteredData(数据)
},[])//应在已装载的计算机上运行一次
//搜索
//应取决于搜索输入状态(因此您需要一个状态来保存搜索所需的值)
useffect(()=>{
handleSearch()
},[searchKey])//仅当searchState更改时才会激发/运行
//分类
//应取决于排序输入状态(因此您需要一个状态来保存排序所需的值)
useffect(()=>{
handleSort()
},[sortKey])//仅在sortingState更改时激发/运行
返回(
{filteredData.map(数据=>(
{/*显示数据信息*/}
))}
);
};
或者您可以引入一个新的状态,默认情况下该状态将包含数据,const[finalData,setFInalData]=useState(data)
。如果你有sortedData
或filteredData
想在之后显示,只需更新setFinalData(toWhatDataSetYouWant)
更新:我正在等待一个简单的解决方案,根本不使用上下文API。我刚刚做了一个工作。希望有帮助。首先,filteredData
在安装组件后返回一个空数组。如果我先搜索一些东西,那么我也可以在屏幕上看到玩家,排序逻辑在这种方法中似乎不起作用。我已经更新了上面的答案。顺便说一下,处理搜索和排序应该更准确,如果你处理它的话,这是有意义的
useEffect(() => {
setFilteredData(data)
}, [])
const ContextProvider = ({ children }) => {
const [data, setData] = useState([]);
const [filteredData, setFilteredData] = useState([]);
const [searchKey, setSearchKey] = useState('');
const [sortKey, setSortKey] = useState([]);
useEffect(() => {
fetch('URL HERE')
.then(data => data.json())
.then(data=> setData(data));
}, []);
const handleSearch = () => {
const filteredData = filteredData.filter(player=>
player.name.includes(searchKey)
);
setFilteredData(filteredData);
};
const handleSort = () => {
const sortedData = filteredData.sort((a, b) => {
if (a[sortKey] < b[sortKey]) {
return 1;
} else {
return -1;
}
});
setFilteredData(sortedData);
};
return (
<Context.Provider
value={{
data, filteredData, searchKey, sortKey,
setFilteredData, setSearchKey, setSortKey,
handleSearch,
handleSort,
}}
>
{children}
</Context.Provider>
);
};
const Search = () => {
const {
searchKey, setSearchKey,
sortKey, setSortKey
} = useContext(Context);
return (
<div className='row'>
<Input
type='search'
name='search'
value={searchKey}
onChange={e => setSearchKey(e.target.value)}
></Input>
<Input
type='select'
name='select'
value={sortKey}
onChange={e => setSortKey(e.target.value)}
>
<option value='name'>Name</option>
<option value='team'>Team</option>
</Input>
</div>
);
};
const Player = () => {
const {
data,
filteredData, setFilteredData,
searchKey, sortKey.
handleSearch, handleSort
} = useContext(Context);
// set filteredData
useEffect(() => {
setFIlteredData(data)
}, []) // should run once on mounted
// do search
// should be dependent on search input state (so you need a state to hold value need for searching)
useEffect(() => {
handleSearch()
}, [searchKey]) // will only fired/run if searchState changes
// do sorting
// should be dependent on sorting input state (so you need a state to hold value need for sorting)
useEffect(() => {
handleSort()
}, [sortKey]) // will only fired/run if sortingState changes
return (
<ul>
{filteredData.map(data => (
{/* display data info */}
))}
</ul>
);
};