【发布时间】:2021-04-10 15:51:28
【问题描述】:
我遇到了一个奇怪的问题,即 petData 最初以未定义的形式记录到控制台,稍后会填充数据数组。我认为这与获取数据然后通过上下文发送数据所花费的时间有关。问题是应用程序崩溃并出现错误“TypeError:无法访问属性“name”,petData[0] 未定义”我尝试使用 setTimeout 但这没有帮助。有什么解决办法吗?
function SearchPage() {
const { petData } = useContext(PetDataContext);
console.log(petData[0].name);
const [filter, setFilter] = useState("");
const filteredData = useMemo(() => {
if (filter == "") return petData;
return petData.filter(
(item) =>
item.name.toLowerCase().includes(filter) ||
item.breed.toLowerCase().includes(filter)
);
}, [petData, filter]);
return (
<>
<SearchBar onSearch={(searchTerm) => setFilter(searchTerm)} />
<div className="d-flex flex-wrap sp-body">
<DogCardsDisplayed petData={filteredData} />
</div>
</>
);
}
export default SearchPage;
App.js
function App() {
const [petData, setPetData] = useState([]);
useEffect(() => {
axios
.get(`${BACK_PORT}/data`)
.then(function (response) {
setPetData(response.data);
})
.catch(function (error) {
console.log(error);
Swal.fire("Oops...", error.response.data, "error");
});
}, []);
console.log(petData);
return (
<div className="App">
<PetDataContext.Provider value={{ petData }}>
<BrowserRouter>
<NavBar />
<Switch>
<Route path="/" component={MainSignedOut} exact />
<Route path="/mainsignedin" component={MainSignedIn} />
<Route path="/searchpage" component={SearchPage} />
<Route path="/mypets" component={MyPets} />
<Route path="/admin" component={Admin} />
<Route exact path="/pets/:id" component={PetPage} />
<Route component={err404} />
</Switch>
</BrowserRouter>
</PetDataContext.Provider>
</div>
);
}
上下文.js
import { createContext } from "react";
const PetDataContext = createContext([]);
export default PetDataContext;
【问题讨论】:
-
您有多大把握需要上下文 API 来完成您想要完成的任务?
-
您正试图在
petData包含任何数据之前访问和记录petData[0].name。您希望编写您的组件以不尝试访问不存在的数据,并可能重写它以处理这种情况并呈现某种回退 UI,直到它有数据要呈现。 -
那么最好不要使用上下文吗?
-
除非必要,否则 React 文档不鼓励使用它,因为它增加了复杂性和一些性能考虑。见"Before You Use Context" from the React docs。
标签: reactjs axios fetch react-context use-context