繁体   English   中英

如何在 React.js 中将状态/数据从一个组件传递到另一个组件(特别是 riot api)

[英]How to pass state/data from one component to another in React.js (riot api specifically)

我试图从一个组件的 API 调用中提取信息,然后在另一个组件的另一个 API 调用中使用该数据。 但是,我不确定如何导出和使用第二个组件中第一个 API 调用中的数据。

应用程序.js

import './App.css';
import FetchMatch from './fetch-match/fetch.match';
import FetchPlayer from './fetch-player/fetch.player';

function App() {
  return (
    <div className="App">
        <h1>Hello world</h1>
        <FetchPlayer></FetchPlayer>
        <FetchMatch></FetchMatch>
        
    </div>
  );
}

export default App;

fetch.player 然后进行第一个 API 调用以获取用户特定 ID,该 ID 将在第二个 API 调用中使用,也获取用户匹配历史记录。

fetch.player.js

import React, { useEffect, useState } from 'react';
import axios from 'axios';

const FetchPlayer = () => {

  const [playerData, setPlayerData] = useState([]);
  
  const userName = 'users name';
  const userTagLine = '1234';
  const apiKey = '???';
  
  useEffect( () => {
    axios.get(`https://americas.api.riotgames.com/riot/account/v1/accounts/by-riot-id/${userName}/${userTagLine}?api_key=${apiKey}`)
    .then(response => {
      console.log(response.data)
      setPlayerData([response.data])
    })
    .catch(error => console.log(error))
  }, []);


  return (
    <div>
      {playerData.map( data => (
        <div>
          <p>{data.puuid}</p>
          <p>{data.gameName}#{data.tagLine}</p>
        </div>
      ))}
    </div>
    )
}

export default FetchPlayer;

这里不多,但以防万一......

fetch.match.js

import React, { useState } from 'react';

// Somehow take in the puuid set in the state of fetch.player to make a second API call below
const FetchMatch = () => {

  const [matchData, setMatchData] = useState([]);

  return (
    <div>
      // players match list goes here
    </div>
    )
}

export default FetchMatch;

我不确定是否应该创建一个单独的 function 来代替,这将允许我创建 const 来处理单个文件中的两个 API 调用。 或者,如果有一种方法可以将 fetch.player 中的 state 作为道具传递给 App.js 中的 fetch.match。 我曾尝试做前者,但它要么不起作用,要么我弄乱了语法(很可能是这个)

如果您在父组件中并行渲染这两个组件,则它们称为兄弟组件。

兄弟组件中的数据共享可以通过多种方式(Redux、Context 等)完成,但最简单和最简单的方式(没有第三方 API 的最基本方式)涉及使用 parent 作为中间组件。

首先,您在父组件中创建 state 并将其作为道具提供给需要来自其兄弟姐妹的数据的子组件(在您的情况下是FetchMatch )。

import React from 'react';
import './App.css';
import FetchMatch from './fetch-match/fetch.match';
import FetchPlayer from './fetch-player/fetch.player';

function App() {
  const [data,setData] = React.useState();

  return (
    <div className="App">
        <h1>Hello world</h1>
        <FetchPlayer></FetchPlayer>
        <FetchMatch data={data} ></FetchMatch>
        
    </div>
  );
}

export default App;

提供 function 到 setData 作为子组件的道具,它将获取初始 API (在您的情况下是FetchPlayer

<FetchPlayer onPlayerLoad={(data) => setData(data)} />

然后,在该子组件中,当您完成调用 API 并获得结果后,将该结果传递给onPlayerLoad function,它将调用 setData function,并将结果作为参数。 这将导致 state 更改和重新渲染第二个FetchMatch组件,并使用 API 结果提供道具数据。

import React, { useEffect, useState } from 'react';
import axios from 'axios';

const FetchPlayer = ({onPlayerLoad}) => {

  const [playerData, setPlayerData] = useState([]);
  
  const userName = 'users name';
  const userTagLine = '1234';
  const apiKey = '???';
  
  useEffect( () => {
    axios.get(`https://americas.api.riotgames.com/riot/account/v1/accounts/by-riot-id/${userName}/${userTagLine}?api_key=${apiKey}`)
    .then(response => {
      console.log(response.data)
      setPlayerData([response.data])
      onPlayerLoad(response.data)
    })
    .catch(error => console.log(error))
  }, []);

return <></>;

来到FetchMatch ,您将在第二次渲染中获得数据。

import React, { useState } from 'react';

// Somehow take in the puuid set in the state of fetch.player to make a second API call below
const FetchMatch = ({data}) => {

  const [matchData, setMatchData] = useState([]);

  //console.log(data);
  return (
    <div>
      // players match list goes here
    </div>
    )
}

export default FetchMatch;

现在,您可以对第二个组件中的共享数据执行任何操作,在您的情况下是触发匹配 API。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM