#javascript #reactjs
Вопрос:
Я создаю приложение, ориентированное на отображение репозиториев и информации github пользователя. В компоненте «Раздел» я извлекаю эти хранилища и отображаю их на экране. В другом компоненте «Меню» я хотел, чтобы он посчитал эти репозитории и отобразил их. Должен ли я использовать реквизит в этом случае?
Раздел Компонент
import React, { useState } from 'react'
import axios from 'axios'
import { Square, Wrapper, Input, Button } from './Section.styled'
export default function Section() {
const [username, setUsername] = useState("");
const [loading, setLoading] = useState(false);
const [repos, setRepos] = useState([]);
const searchRepos = () => {
setLoading(true);
axios({
method: "get",
url: `https://api.github.com/users/${username}/repos`,
}).then(res => {
setLoading(false);
setRepos(res.data);
})
}
const handleSubmit = (e) => {
e.preventDefault();
searchRepos()
}
const renderRepo = (repo)=>{
return(
<Square>
{repo.name}
</Square>
)
}
return (
<>
<Wrapper>
<Input
placeholder="Usuário"
value={username}
onChange={e => { setUsername(e.target.value) }}
/>
<Button
onClick={handleSubmit}
type="submit">
{loading ? "Buscando..." : "Buscar"}
</Button>
{repos.map(renderRepo)}
</Wrapper>
</>
)
}
Компонент меню
import React from "react";
import { bool } from "prop-types";
import { StyledMenu } from "./Menu.styled";
const Menu = ({ open, ...props }) => {
const isHidden = open ? true : false;
const tabIndex = isHidden ? 0 : -1;
return (
<>
<StyledMenu open={open} aria-hidden={!isHidden} {...props}>
<a href="/" tabIndex={tabIndex}>
Repositories:
</a>
<a href="/" tabIndex={tabIndex}>
Followeres:
</a>
<a href="/" tabIndex={tabIndex}>
Following:
</a>
</StyledMenu>
</>
);
};
Menu.propTypes = {
open: bool.isRequired,
};
export default Menu;
Комментарии:
Ответ №1:
Эти решения могут быть возможны в этом случае, когда мы получили данные в одном компоненте и хотим, чтобы они появились в другом компоненте.
- Передайте функцию
searchRepos
в качестве реквизита отparent
компонента обоихsection
иmenu
компонента кsection
компоненту, вызовите функциюsection
, это введет данныеparent
и отправит данные вmenu
компонент в качестве реквизитов , т. е. называется поднятием состояния. - Если компоненты находятся далеко (глубоко вложены или имеют несвязанного родителя, ветвь), вы можете просто использовать контекстное хранилище
3. Последний способ-сохранить данные вызываемого API компонента section
в локальном хранилище браузера и использовать их в menu
компоненте. (НЕ РЕКОМЕНДУЕТСЯ)