简体   繁体   English

将道具传递给模态组件后无法访问对象内的数组

[英]Can't access an array inside an Object after passed props to a modal component

i'm building this application with the help of the RestCountries Api to be able to show each country with basic details on a grid, and after a click on each box the app will show a modal with more detailed informations.我正在借助 RestCountries Api 构建此应用程序,以便能够在网格上显示每个国家/地区的基本详细信息,单击每个框后,该应用程序将显示具有更详细信息的模式。 That's my code so far:到目前为止,这是我的代码:

class App extends React.Component{
  constructor (props){
    super (props);
    this.state={
      countries : [],
      clickedCountry: {},
      modalOn : false,


    }
  }



  componentDidMount(){
    axios.get(`https://restcountries.eu/rest/v2/all`)
    .then(res => {
      const data = res.data;


      this.setState({
        countries : data

      })


      let countries = this.state.countries
      console.log(countries);

       })



  }


  showInfo = (name) => {
    this.setState({
      clickedCountry : this.state.countries.find(it => it.name===name),
      modalOn : true

    });   
  }



  closeModal =()=>{
    this.setState({
      modalOn : false
    })
  }



  render() {
    return (
      <div  className="container">
      {this.state.countries.map(country=>
 <Country name={country.name}
                 key={country.name} 
                 population ={country.population} 
                 region={country.region}
                 capital={country.capital}
                 flag={country.flag}
                 showInfo={this.showInfo}
                 languages={country.languages}
                 />

      )}
      <div style={{display: this.state.modalOn? "block" : "none"}}>
        <Modal closeModal={this.closeModal} 
               name={this.state.clickedCountry.name} 
               population={this.state.clickedCountry.population}
               region={this.state.clickedCountry.region}
               capital ={this.state.clickedCountry.capital}
               flag={this.state.clickedCountry.flag}
               nativeName ={this.state.clickedCountry.nativeName}
               subregion={this.state.clickedCountry.subregion}
               topLevelDomain={this.state.clickedCountry.topLevelDomain}
               languages={this.state.clickedCountry.languages}
              />
      </div>

      </div>
    )
  }
}

Modal component :模态组件:

const Modal = ({closeModal, name, population, region, capital, flag, languages, nativeName, subregion, topLevelDomain, currencies}) => {
    return (
        <div className="modal">
            <div className="modal-content">
                <span onClick={closeModal}>x</span>
            <div className="img">
               <img src={flag}/>
               </div> 
            <p>{name}</p>
            <p>Native name: {nativeName}</p>
            <p>population: {population}</p>
            <p>Region: {region}</p>
            <p>Sub Region: {subregion}</p>
            <p>Top level domain: {topLevelDomain}</p>
            <p>Capital: {capital}</p>

            </div>
            </div>

    )
}

So far for now i have mapped each country and the modal on click is showing more detailed informations.到目前为止,我已经绘制了每个国家的地图,点击模式显示了更详细的信息。 The problem now is the fact i need to access in the api an array that is nested inside an object:现在的问题是我需要在 api 中访问一个嵌套在对象内的数组:

area: 91
gini: null
timezones: ["UTC-04:00"]
borders: []
nativeName: "Anguilla"
numericCode: "660"
currencies: [{…}]
languages: [{…}]
translations: {de: "Anguilla", es: "Anguilla", fr: "Anguilla", ja: "アンギラ", it: "Anguilla", …}
flag: "https://restcountri

I need to access the languages array.我需要访问语言数组。 Now if i try to map languages inside the country component, i can display the informations.现在,如果我尝试在国家/地区组件内映射语言,我可以显示信息。 But i want to show the langauges only on the modal component, and if i map the clickedCountry state responsible for the modal i will receive the error that "languages" is undefined.但我只想在模态组件上显示语言,如果我映射负责模态的 clickedCountry 状态,我将收到“语言”未定义的错误。 How it comes if is the same object filtered through the find function?如果通过 find 函数过滤了同一个对象,结果如何? Hope i was clear guys, cheers.希望我是清楚的伙计们,干杯。

I know you understood whats happened!, just add this to Modal component我知道你明白发生了什么!,只需将此添加到 Modal 组件

<ul>
{
languages && languages.map(lan=> {return <li>{lan.name}</li>} )
 }
</ul>

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

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