Ich habe eine Redux-Komponente, die JSON (im unteren Teil) analysiert, aber ich kann nicht herausfinden, wie die verschachtelten untergeordneten Objekte greifen. Ich glaube nicht, dass ich richtig verstehe, wie mapStateToProps funktioniert.React/Redux mapStateToProps mit verschachtelten JSON
Das Konsolenprotokoll Dumping die untergeordneten Objekte, aber wenn ich versuche services.name ich zugreifen
"Cannot read property 'name' of undefined"
Kann mir jemand helfen zu verstehen, wie Eigenschaften hier abzubilden? Ich habe ein Beispiel für den JSON aufgenommen, den ich unten aus der API ziehe.
Dienste-list.js
import React, { Component } from 'react';
import { connect } from 'react-redux';
import * as actions from '../actions';
class ServicesList extends Component {
componentDidMount(){
this.props.fetchServices();
}
render() {
//console.log('render called in ServicesList component');
return (
<table className='table table-hover'>
<thead>
<tr>
<th>Service Name</th>
</tr>
</thead>
<tbody>
{this.props.services.map(this.renderServices)}
</tbody>
</table>
);
}
renderServices(data) {
console.log(data.services);
const name = data.services.name;
return(
<tr key={name}>
<td>{name}</td>
</tr>
);
}
}
function mapStateToProps({services}) {
return { services };
}
export default connect(mapStateToProps, actions)(ServicesList);
Meine JSON wie folgt aussieht:
{
"services": [
{
"name": "redemption-service",
"versions": {
"desired": "20170922_145033",
"deployed": "20170922_145033"
},
"version": "20170922_145033"
}, {
"name": "client-service",
"versions": {
"desired": "20170608_094954",
"deployed": "20170608_094954"
},
"version": "20170608_094954"
}, {
"name": "content-rules-service",
"versions": {
"desired": "20170922_130454",
"deployed": "20170922_130454"
},
"version": "20170922_130454"
}
]
}
Schließlich habe ich eine Aktion, die die axios.get hier aussetzt:
import axios from 'axios';
const ROOT_URL=`http://localhost:8080/services.json`;
export const FETCH_SERVICES = 'FETCH_SERVICES';
export function fetchServices(){
const url = `${ROOT_URL}`;
const request = axios.get(url);
return{
type: FETCH_SERVICES,
payload: request
};
}
Ihre 'const name = data.services.name;' 'sollte const name = data.name sein;' – Panther
Das bcoz ist, Ihre kartieren über 'services' und für jeden loop erhalten Sie einen einzigen 'service' in der' renderServices' Funktion. – Panther
Richtig, es ruft renderServices genau einmal auf. Was ich nicht verstehe, ist, wie man das nächste Objekt abbildet, wenn es nicht benannt ist. –