2017-07-26 46 views
0

我有兩個問題,第一個是關於在組件之間傳遞數據,第二個是關於組件層次結構。反應 - 在兄弟之間傳遞數據並迭代它

眼下,在Data組件我想設置name屬性,並將其傳遞給迭代應該基於API請求ListItem組件。我嘗試了許多沒有成功的事情。我究竟做錯了什麼?設置新狀態時是否需要重複數據?我是否正確傳遞?

基本僞

  • 閱讀來自API的數據
  • 集數據組件狀態
  • 創建一個基於存儲的數據的兄弟姐妹組件
  • 渲染組件

第二問題是關於組件的層次結構。我一直在網上閱讀,數據請求應設置在頂部並分開。有了這個,其他組件將從這些數據中提供並執行。最後,App組件將相應地呈現所有這些組件。從下面的例子中,我會走向正確的軌道嗎?我是否正確地創建了特定於數據請求的組件?或者應該在App組件中完成此操作嗎?

我明白這些問題可能是基本的,但這是我真正努力去理解的東西,如果有人能夠幫助我理解或指向我可以消化的基本示例,我將不勝感激。

預先感謝您。 (對不起,我有兩個以上的問題。)

class App extends React.Component { 
    render() { 
    return (
     <ul> 
     <ListItem name={this.state.name} /> 
     </ul> 
    ) 
    } 
} 


class Data extends React.Component { 
    constructor(props) { 
    super(props) 
    this.state = { 
     name: '', 
     requestFailed: false, 
    } 
    } 

    componentDidMount() { // Executes after mouting 


    fetch('https://api.tfl.gov.uk/BikePoint') 
    .then((response) => { 
     return response.json() 
    }).then((d) => { 
     console.log('parsed json', d[0].commonName) 
     this.setState({ 
      name: d.commonName 
     }); 
    }).catch(function(ex) { 
     console.log('parsing failed', ex) 
     this.setState({ 
      requestFailed: true 
     }) 
    }) 
    } 

    render() { 

    if(this.state.requestFailed) return <p>Request failed.</p> 
    if(!this.state.name) return <p>Loading</p> 

    const namesList = names.map(function(name, index){ 
     return <ListItem key={index} name={this.state.name} /> 
    }) 

    return <ul>{ namesList }</ul> 
    } 
} 

class ListItem extends React.Component { 
    render() { 
    return <li> { this.props.name } </li> 
    } 
} 

ReactDOM.render(<App />, document.getElementById('app')); 

CodePen

回答

1

從哪裏開始 -

首先,你App組件需要渲染Data組件。 React以父元素總是呈現子元素的方式工作,而不呈現的元素不存在。

然後,您需要重新映射對名稱的響應,如果這是您想要做的 - 我不確定。

在渲染方法中,您希望從映射函數中取出名稱,而不是從狀態中取出名稱。我也刪除了名字狀態,你真的想保留名字而不是一個名字。有很多小東西需要調整才能使其工作,因此我只需在此處發佈工作代碼筆,以便您可以看到需要完成的工作。

https://codepen.io/anon/pen/eEmqxX?editors=0010

+0

在此先感謝您Oliver。我會盡快研究它,並在稍後評論。對不起,如果我的解釋是混淆。 –

+0

這是okey,如果您有任何關於此代碼的問題,只需發表評論,我將盡力幫助:) –

+0

再次感謝Oliver,所以我在代碼中添加了一些初始評論。請讓我知道如果它不明確[CodePen](https://codepen.io/diegooriani/pen/EvjxBp?editors=0010) –