【发布时间】:2019-09-19 09:02:14
【问题描述】:
您好,我创建了一个带有多重过滤器的搜索栏,它可以工作,但功能过于依赖彼此。这里的问题是这些函数正在处理多种情况。 是否可以通过链接它们来减轻每个功能以及如何减轻?我真的没有得到链接方法。 谢谢
import React, { useState, useEffect } from "react";
import Search from "./Search";
import Anime from "./Anime";
import "./App.css";
const KIJAN_API_URL = "https://api.jikan.moe/v3/top/anime/1/upcoming";
const App = () => {
const [animes, setAnimes] = useState([]);
const [sortedAnimes, setSortedAnimes] = useState([]);
const [searchValue, setSearchValue] = useState("")
const [filterByType, setFilterByType] = useState("");
const [filterByYear, setFilterByYear] = useState("");
useEffect(() => {
fetch(KIJAN_API_URL)
.then(response => {
if (response.ok) {
return response.json();
} else {
throw new Error("Something went wrong");
}
})
.then(jsonResponse => {
setAnimes(jsonResponse.top);
})
.catch(error => {
console.log(error);
});
}, []);
useEffect(() => {
const callFilterByType = result => {
if (filterByType === "") {
callFilterByYear(result);
console.log(result);
} else {
result = result.filter(anime => anime.type === filterByType);
callFilterByYear(result);
console.log(result);
}
};
const callFilterByYear = result => {
if (filterByYear === "") {
setSortedAnimes(result);
} else {
const regex = new RegExp(`${filterByYear}`, "gi");
result = result.filter(anime => regex.test(anime.start_date));
setSortedAnimes(result);
console.log(result);
}
};
if (searchValue === "") {
callFilterByType(animes);
} else {
const regex = new RegExp(`${searchValue}`, "gi");
console.log("search : ", searchValue);
const result = animes.filter(anime => regex.test(anime.title));
callFilterByType(result);
console.log(result);
}
}, [searchValue, animes, filterByType, filterByYear]);
return (
<div className="App">
<Search
searchValue={searchValue}
setSearchValue={setSearchValue}
filterByType={filterByType}
setFilterByType={setFilterByType}
filterByYear={filterByYear}
setFilterByYear={setFilterByYear}
/>
{sortedAnimes.length > 0 ? (
sortedAnimes.map((anime, index) => {
return <Anime key={index} anime={anime} />;
})
) : (
<span>Aucune correspondance</span>
)}
</div>
);
};
export default App;
【问题讨论】:
-
参见this other question,只需将逻辑的每个部分分离成自己的
useEffect。 -
您好@Alvaro 感谢您的洞察力,但我不认为我无法管理具有 3 种不同 useEffect 的数据,即使它们监控不同的输入。主要问题是函数必须通过协同工作或单独工作来给出结果。如果我在同一个数组上工作,UseEffect 将设置值未定义,因此我不能在其他必须使用该值的 useEffects 中使用它们
-
@ArBabacar_ 也许重构代码会有所帮助。使用
useState和useEffect。很难确切地说出是怎么回事,因为我们不知道searchValue, animes, setSortedAnimes来自哪里。 -
抱歉@Alvaro searchValue 来自我的 SearchBar 组件,animes 来自 API,并且 setSortedAnimes 在您应用过滤器时更新了数组动画
-
你能分享完整的组件吗?我问是因为我不确定
setSortedAnimes是否属于useState,或者它如何修改获取的动画。
标签: reactjs react-hooks chaining