React.js:如何将道具传递给组件?

时间:2020-09-10 14:20:04

标签: javascript reactjs

我想使 API调用可重用,并在其他组件中使用它的功能。我正在 Hook / index.js 组件中获取 API 。然后,我要遍历另一个组件中的从API获取的数据,将其作为参数并在其他组件中使用。
我有一个用于 flag(img) Flag / index.js 组件,并且想要获取图像的url作为参数并在 Flag / index中使用。 js 组件。
任何帮助将不胜感激。
Hook / index.js 中,我获取了 API


import React, { useState, useEffect } from "react";

import "./hook.scss";

export default function Hook(){
  const [data, setData] = useState([]);
  const [error, setError] = useState(null);
  const [search, setSearch] = useState("");
 
  const fetchData = () => {
    fetch("https://restcountries.eu/rest/v2/all")
      .then((res) => res.json())
      .then((result) => setData(result))
      .catch((err) => console.log("error"));
  };

  useEffect(() => {
    const searchResult = data && data.filter((item) => item.name.toLowerCase().includes(search));
    setSearch(searchResult);
  }, []);

  useEffect(() => {
    fetchData();
  }, []);


  return [data, error];
}

在App.js中,我正在通过API数据进行映射

import React, { useState }from "react";
import Header from "./components/Header";
import SearchBar from "./components/SearchBar";
import Flag from "./components/Flag";
import useCountries from "./Hooks";

import "./App.scss";

export default function App () => {
  const [data, error] = useCountries();

  
  return (
    <div className="App">
      <SearchBar />
      <Header />
      {data &&
        data.map((country) => (
          <div className="CountryList" key={country.name}>
            <div className="CountryListImg">
              <img src={country.flag} alt="" width="80px" /> if change here to flag={country.flag} I see link in browser
            </div>
            <div className="countryName">{country.name}</div>
            <div className="population">{country.population}</div>
            <div className="region">{country.region}</div>
            <div>
              {country.languages.map((language, languageIndex) => (
                <div key={languageIndex}>{language.name}</div>
              ))}
            </div>
          </div>
        ))}
      <useCountries />
    </div>
  );
  return [data, error]
}

我的 Flag / index.js 组件当然不起作用

import React from "react";

import "./flag.scss";

export default function Flag({flag}) {
  return (
    <div className="">
      <img src={flag} alt="" width="80px" />  
    </div>
  );
};

如何制作工作搜索栏。现在,它说在控制台中未定义

import React, {useState} from "react";


import "./SearchBar.scss";

export default function Searchbar({data}) {
    const [search, setSearch] = useState("");

   function handleChange(e) {
    setSearch(e.target.value);
  } 
console.log(data)
  return (
    <div className="SearchBar">
      <input
        className="input"
        type="text"
        placeholder="search country ..."
        value={data}
        onChange={handleChange}
      />

      {data && data.filter((item) => item.name.toLowerCase().includes(search))}
    </div>
  );
};

3 个答案:

答案 0 :(得分:1)

您需要在App组件内使用Flag组件

    import React, { useState }from "react";
    import Header from "./components/Header";
    import SearchBar from "./components/SearchBar";
    import Flag from "./components/Flag";
    import useCountries from "./Hooks";
    
    import "./App.scss";
    
    export default () => {
      const [data, error] = useCountries();
    
      
      return (
        <div className="App">
          <SearchBar />
          <Header />
          {data &&
            data.map((country) => (
              <div className="CountryList" key={country.name}>
                <div className="CountryListImg">
                   <Flag flag={country.flag}/>
                </div>
                <div className="countryName">{country.name}</div>
                <div className="population">{country.population}</div>
                <div className="region">{country.region}</div>
                <div>
                  {country.languages.map((language, languageIndex) => (
                    <div key={languageIndex}>{language.name}</div>
                  ))}
                </div>
              </div>
            ))}
          <useCountries />
        </div>
      );
      return [data, error]
    }         

答案 1 :(得分:1)

1

我不确定是否能回答这个问题,但是只需在其中添加抽象的Flag类,只需更改以下内容即可:

<img src={country.flag} alt="" width="80px" />

对此:

<Flag flag={country.flag} />

答案 2 :(得分:0)

只需使用<Flag flag={country.flag} />

在线查看:https://stackblitz.com/edit/stackoverflow-63831710?file=src/App.js