Как я могу экспортировать состояние из родительского файла в дочерний файл в React js?

У меня есть родительский файл в React, в котором я выполняю множественную выборку API с помощью хука useState. Вот код:

const [species, setSpecies] = useState([]);

useEffect(() => {
    axios
    .get(`https://pokeapi.co/api/v2/pokemon-species/${name}`)
    .then((results) => {
        return results.data;
    })
    .then((results) => {
        setSpecies(results);
    });
}, [name]);

А вот фрагмент моего кода в дочернем элементе:

<li className='pokemon_data_container_list_desc'>
    {species?.flavor_text_entries?.map((sf) => 
        sf?.language?.name === 'en' && sf?.version?.name === game && 
            <>
                {sf?.flavor_text?.replace('\u000c', ' ')}
            </>
    )}
</li>

Я хотел бы знать, как я могу экспортировать «виды» от родителя к ребенку.

Обновлено: спасибо за ответ (извините за глупый вопрос). Это мой первый раз, когда я использую React, и я никогда раньше не использовал реквизит (я пытаюсь превратить огромные компоненты в несколько маленьких компонентов).

Передать его дочернему компоненту в качестве реквизита?

David 17.03.2022 20:51

Мы передаем значения между компоненты, а не файлами. В конце концов, они все в одном пакете файлов.

isherwood 17.03.2022 20:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
2
31
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это простой ответ, мы используем реквизит.

В дочернем компоненте вы можете принимать реквизиты следующим образом:

function childComponent(props) {
  props.props.species // species will be sent over like an object
}

передать реквизит childComponent

<childComponent props = {species} />
Ответ принят как подходящий

Вы можете просто передать значение в качестве реквизита дочернему элементу. Это определенно одна из основных частей начала работы с React, поэтому я настоятельно рекомендую прочитать документация по компонентам и пропсам.

Вот как это может выглядеть в вашем примере:

function Parent() {
  const [species, setSpecies] = useState([]);

  useEffect(() => {
    axios
      .get(`https://pokeapi.co/api/v2/pokemon-species/${name}`)
      .then((results) => {
        return results.data;
      })
      .then((results) => {
        setSpecies(results);
      });
  }, [name]);

  return (
    <>
      // ...
      <Child species = {species} />
    </>
  );
}

function Child({ species }) {
  return (
    <>
      // ...
      <li className='pokemon_data_container_list_desc'>
        {species?.flavor_text_entries?.map((sf) => 
          sf?.language?.name === 'en' && sf?.version?.name === game && 
            <>
              {sf?.flavor_text?.replace('\u000c', ' ')}
            </>
        )}
      </li>
    </>
  );
}

Вам нужно передать виды дочернему компоненту в качестве реквизита. Вот пример того, как это сделать. https://codesandbox.io/s/falling-surf-2sxdln?file=/src/App.js:0-434

// App.js
import React, { useEffect, useState } from "react";
import axios from "axios";
import SpeciesList from "./SpeciesList";

export default function App() {
  const [species, setSpecies] = useState([]);

  useEffect(() => {
    axios
      .get(`https://pokeapi.co/api/v2/pokemon-species/${name}`)
      .then((results) => setSpecies(results.data.results));
  }, []);

  return <SpeciesList species = {species} />;
}

// SpeciesList.js
import React from "react";

export default function SpeciesList({ species = [] }) {
  return (
    <ul>
      {species.map((s) => (
        <li key = {s.name}>{s.name}</li>
      ))}
    </ul>
  );
}

Другие вопросы по теме

Многократный повторный рендеринг проблемы с дочерним компонентом
Как бы вы сгруппировали поле в таблице, чтобы оно не отображало дубликаты - реагируйте
Обновить вложенный объект состояния с массивом внутри
Как стилизовать компонент, в который вложены `styled-components`?
Cors: строгое происхождение при перекрестном происхождении: реагировать + nginx + elasticsearch
Как запустить цикл внутри набора строк jsx, используя опасноSetInnerHTML
Реагировать на сохранение состояния в LocalStorage с помощью useEffect
Django, JWT, React перенаправляют на другую базу страниц в другой группе после входа в систему
Реагировать на ввод, я определил состояние в начальное состояние, но все равно получаю предупреждение о смене неконтролируемого на контролируемый ввод
Redux useselector возвращает неопределенное значение, когда я пытался найти значение из массива состояний redux в соответствии с идентификатором useParams