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

Поскольку я новичок в React, мне сложно передавать данные другим компонентам из родительского компонента <App.js>. Я делюсь кодом ниже для справки. Моя цель — передать переменную stocksName другим компонентам, таким как Stocks.js, где в настоящее время она не распознается. Любая помощь будет высоко оценен.

Приложение.js

import React, { useState, useEffect } from 'react'
import Select from 'react-dropdown-select';
import axios from 'axios';
import './App.css'
import StocksView from './components/Stocks'

function App() {

  const [data, setData] = useState([]);
  const [stocksName, setStocksName] = useState([]);
  const [selectvalue, setselectvalue] = useState([]);
  const [message, setMessage] = useState("");

  const handleSubmit = (event) => {
    event.preventDefault();
    console.info(selectvalue);
    axios.post("./getStocks", selectvalue)
      .then((response) => {
        console.info(response);
        const nodeData = JSON.parse(response.data.nodeData);
        setStocksName(nodeData.STOCKS_NAME);
      }).catch((error) => {
        console.info(error);
      });
  };

  useEffect(() => {
    fetch("/listPartitions")
      .then((response) => response.json())
      .then((partition) => {
        const parsed = JSON.parse(partition.nodePartition);
        const partitions = Object.entries(parsed).map(([key, value]) => ({
          label: value,
          value: key
        }));

        // put the partitions data in the state
        setData(partitions);
        console.info(parsed, partitions);
      });
  }, []);

  return (
    <div>
      <form onSubmit = {handleSubmit}>
        <Select
          name = "select"
          options = {data}
          multi
          onChange = {(selected) => setselectvalue(selected.map((item) => item.label))
          }
        />
        <button type = "submit">Submit</button>
        <div className = "message">{message ? <p>{message}</p> : null}</div>
      </form>
      <div>
        <StocksView/>
      </div>
    </div>

  )
}

export default App;

Stocks.js

import React from 'react'
import Graph from 'react-vis-network-graph'

export default function StocksView() {
    const stocks = {
        nodes: [
            {stocksName}
        ]
    }
    
     return (
    <div className='container'>
        <Stocks 
            stocks = {stocks}
        />
    </div>
  )

Чтобы передать данные из родительского компонента в дочерние, вы можете передать их как реквизиты, см. act.dev/learn/passing-props-to-a-comment

dinhit 23.05.2024 09:18

Дружище, пожалуйста, в следующий раз просто погуглите. Это основы. Теперь, что касается проблемы, @dinhit показал вам документацию. ЧИТАЙ ИХ! Что касается передачи данных между компонентами, подумайте об этом очень просто: вы просто указываете в параметрах функции компонента, что вы хотите передать, затем вы просто передаете переменные в качестве значения для параметров, таких как атрибуты HTML, при вызове компонента. , вот и все! Надеюсь, это помогло.

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

Ответы 3

Ответ принят как подходящий

Чтобы передать переменную stocksName из компонента App в компонент StocksView, вы можете просто передать ее как свойство.

Другой способ добиться этого — создать глобальное хранилище, что является более продвинутым методом, подходящим для управления большим количеством состояний. Но на данный момент вы можете приступить к разработке концепции реквизита (см. здесь)

Вот как это можно сделать с помощью реквизита.

Приложение.js:

import React, { useState, useEffect } from 'react'
import Select from 'react-dropdown-select';
import axios from 'axios';
import './App.css'
import StocksView from './components/Stocks'

function App() {

  const [data, setData] = useState([]);
  const [stocksName, setStocksName] = useState([]);
  const [selectvalue, setSelectValue] = useState([]);
  const [message, setMessage] = useState("");

  const handleSubmit = (event) => {
    event.preventDefault();
    console.info(selectvalue);
    axios.post("./getStocks", selectvalue)
      .then((response) => {
        console.info(response);
        const nodeData = JSON.parse(response.data.nodeData);
        setStocksName(nodeData.STOCKS_NAME);
      }).catch((error) => {
        console.info(error);
      });
  };

  useEffect(() => {
    fetch("/listPartitions")
      .then((response) => response.json())
      .then((partition) => {
        const parsed = JSON.parse(partition.nodePartition);
        const partitions = Object.entries(parsed).map(([key, value]) => ({
          label: value,
          value: key
        }));

        // put the partitions data in the state
        setData(partitions);
        console.info(parsed, partitions);
      });
  }, []);

  return (
    <div>
      <form onSubmit = {handleSubmit}>
        <Select
          name = "select"
          options = {data}
          multi
          onChange = {(selected) => setSelectValue(selected.map((item) => item.label))
          }
        />
        <button type = "submit">Submit</button>
        <div className = "message">{message ? <p>{message}</p> : null}</div>
      </form>
      <div>
        <StocksView stocksName = {stocksName}/> {/* Passing stocksName as prop */}
      </div>
    </div>
  )
}

export default App;

Stocks.js:

import React from 'react'
import Graph from 'react-vis-network-graph'

export default function StocksView({ stocksName }) { // Accepting stocksName as a prop
    const stocks = {
        nodes: [
            {stocksName}
        ]
    }
    
     return (
    <div className='container'>
        <Graph // I suppose you meant to use Graph here instead of Stocks
            stocks = {stocks}
        />
    </div>
  )
}

Теперь stocksName из компонента App будет передано в компонент StocksView в качестве свойства, и к нему можно будет получить доступ в StocksView как stocksName.

Дайте мне знать, если у вас есть вопросы :(

Вы можете использовать Context.Provider

У меня та же проблема несколько дней назад

Это мне очень помогло https://es.react.dev/reference/react/createContext

С помощью Context вы можете использовать свои переменные во всех ваших компонентах.

Реквизиты — это аргументы, передаваемые в компоненты React. Прочтите это: https://www.w3schools.com/react/react_props.asp

Этот ответ не дает решения вопроса спрашивающего. Если вы решите ответить, предоставьте полный ответ, включающий решение и подтверждающую информацию, в противном случае оставьте комментарий. См. Meta.stackexchange.com/questions/225370/…

Emma 23.05.2024 16:39

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