Mam pewne dane zwane stacjami, które są tablicą zawierającą obiekty.
stations : [
{call:'station one',frequency:'000'},
{call:'station two',frequency:'001'}
]
Chciałbym wyrenderować składnik interfejsu użytkownika dla każdej pozycji tablicy. Póki co mogę pisać
var stationsArr = []
for (var i = 0; i < this.data.stations.length; i++) {
stationsArr.push(
<div className="station">
{this.data}
</div>
)
}
A następnie renderuj
render(){
return (
{stationsArr}
)
}
Problem w tym, że wszystkie dane są drukowane. Zamiast tego chcę po prostu pokazać klucz w stylu, {this.data.call}
który nic nie drukuje.
Jak mogę przejrzeć te dane i zwrócić nowy element interfejsu użytkownika dla każdej pozycji tablicy?
javascript
reactjs
thatgibbyguy
źródło
źródło
stationsArr
zamiaststations
wewnątrzrender
funkcji.Odpowiedzi:
Możesz zmapować listę stacji do ReactElements.
Z React> = 16, możliwe jest zwrócenie wielu elementów z tego samego komponentu bez potrzeby dodatkowego opakowania elementu HTML. Od 16.2 dostępna jest nowa składnia <> do tworzenia fragmentów. Jeśli to nie działa lub nie jest obsługiwane przez IDE, możesz użyć
<React.Fragment>
zamiast tego. Między 16.0 a 16.2 możesz użyć bardzo prostego wypełnienia dla fragmentów.Spróbuj wykonać następujące czynności
// Modern syntax >= React 16.2.0 const Test = ({stations}) => ( <> {stations.map(station => ( <div className="station" key={station.call}>{station.call}</div> ))} </> ); // Modern syntax < React 16.2.0 // You need to wrap in an extra element like div here const Test = ({stations}) => ( <div> {stations.map(station => ( <div className="station" key={station.call}>{station.call}</div> ))} </div> ); // old syntax var Test = React.createClass({ render: function() { var stationComponents = this.props.stations.map(function(station) { return <div className="station" key={station.call}>{station.call}</div>; }); return <div>{stationComponents}</div>; } }); var stations = [ {call:'station one',frequency:'000'}, {call:'station two',frequency:'001'} ]; ReactDOM.render( <div> <Test stations={stations} /> </div>, document.getElementById('container') );
Nie zapomnij o
key
atrybucie!https://jsfiddle.net/69z2wepo/14377/
źródło
render
funkcja musi zwracać jeden element.stations.map((station,index) => { })
działa dobrze dla mnieMam odpowiedź, która może być nieco mniej myląca dla początkujących, takich jak ja. Możesz po prostu użyć
map
w ramach metody renderowania komponentów.render () { return ( <div> {stations.map(station => <div key={station}> {station} </div>)} </div> ); }
źródło
key
rekwizytu actjs.org/docs/lists-and-keys.html#keysthis.data
prawdopodobnie zawiera wszystkie dane, więc musiałbyś zrobić coś takiego:var stations = []; var stationData = this.data.stations; for (var i = 0; i < stationData.length; i++) { stations.push( <div key={stationData[i].call} className="station"> Call: {stationData[i].call}, Freq: {stationData[i].frequency} </div> ) } render() { return ( <div className="stations">{stations}</div> ) }
Lub możesz użyć
map
funkcji i strzałek, jeśli używasz ES6:const stations = this.data.stations.map(station => <div key={station.call} className="station"> Call: {station.call}, Freq: {station.frequency} </div> );
źródło
return stations;
( codepen.io/pawelgrzybek/pen/WZEKWj )Istnieje kilka sposobów, z których można skorzystać.
const stations = [ {call:'station one',frequency:'000'}, {call:'station two',frequency:'001'} ]; const callList = stations.map(({call}) => call)
Rozwiązanie 1
<p>{callList.join(', ')}</p>
Rozwiązanie 2
<ol> { callList && callList.map(item => <li>{item}</li>) } </ol>
Oczywiście dostępne są również inne sposoby.
źródło