Как передать данные из одного компонента в другой?

145
26 марта 2022, 14:30

Есть код, который выводит посты и по клику на пост показывает его полное содержимое.

import React from "react";

type respX = {
    "id": any,
    "userId": any,
    "title": any,
    "body": any,
}
interface PropsI {
}
interface StateI {
    data: respX[];
    changedBody: string
    changedTitle: string
}
export class ComponentPostList extends React.Component<PropsI, StateI> {
    state: StateI = {data: [], changedBody: '', changedTitle: 'Click to choose article'}
    async getPostById(id: any) {
        const myResponse = await fetch(`https://jsonplaceholder.typicode.com/posts/${id}`);
        const myJson = await myResponse.json();
        this.setState({changedBody: myJson.body, changedTitle: myJson.title});
    }
    async componentDidMount() {
        const response = await fetch(`https://jsonplaceholder.typicode.com/posts/`);
        const json = await response.json();
        this.setState({data: json});
    }

    render() {
        return (
            <div className="About">
                <div className="content">
                    <div className="title">{this.state.changedTitle}</div>
                    <div className="article">{this.state.changedBody}</div>
                </div>
                {this.state.data.map(el => (
                    <li onClick={e => this.getPostById(el.id)} key={el.id}>
                        {el.title}
                    </li>
                ))}
            </div>
        );
    }
}

Как правильно передать данные из одного компонента в другой? Чтобы рендер заголовков постов был в одном компоненте,а уже полное содержимое поста в другом компоненте. Эти компоненты находятся на одном уровне:

<ComponentPostList  data={data} onClick=(getPostById) />
<ComponentArticle post={post} />
Answer 1

Вам необходимо создать родительский компонент, например, Posts, который будет визуализировать компоненты ComponentPostList и ComponentArticle. В компоненте Posts следует реализовать логику загрузки данных и обработки щелчка по посту. Также в состоянии компонента Posts должен храниться текущий отображаемый пост (или значение null, если ничего отображать не надо). Компонент Posts после загрузки данных должен передавать их дочернему компоненту ComponentPostList для визуализации. Также из компонента Posts в компонент ComponentPostList надо передать функцию обработки щелчков. Кроме того, из компонента Posts в компонент ComponentArticle следует передать содержимое отображаемого поста.
Таким образом, код вызова дочерних компонентов из компонента Posts будет похож на следующий:

<ComponentPostList data={data} onClick={() => this.getPostById} />
<ComponentArticle post={post} />
Answer 2

не углубляясь к код, ответ:

  • через общего родителя. он будет хранить состояние, а манипулировать данными можно через всплытие/поднятие состояния. ссылка на документацию здесь.
  • через <Context>. это по сути, такой же подход, как и 1, но более красивее. родитель будет хранить и раздавать своё состояние, а любые дочерние(!) компоненты могут на это состояние подписываться.
  • state management (к примеру, redux). позволяет хранить состояние всего приложение отдельно и независимо от всего

плюс я заметил, что Вы вешаете обработчики событий на все, созданные Вами <li>, элементы. вместо этого можно повесить один обработчик на родителя в целях производительности.

READ ALSO
Вызвать событие &quot;Click&quot;

Вызвать событие "Click"

Я разрабатываю расширения, которые добавляют код js в сторонний сервис и автоматически заполняют форму для клиента

96
Проверка SSL сертификатов в js на django

Проверка SSL сертификатов в js на django

Доброго времени суток изучаю Django пишу форму для заказа такси с сайта мне надо из файла js делать GET и POST запросы к серверу, когда делаю запрос...

207
задача с цифрами в часах

задача с цифрами в часах

Задачу нужно решить следующим образом: нужно с помощью split разделить то что в переменной, потом отнять 45 минут(0:45)от второй части, проблема...

233
тип данных Symbol в JS

тип данных Symbol в JS

Недавно начал изучать JSне могу понять для чего, зачем, почему и как использовать тип данных Symbol

98