Ich bin ziemlich neu in React JS und ich habe diese einfache Benutzeroberfläche, die ich erstellen muss. Ich habe grundsätzlich eine Liste von Kategorien und wenn ich auf eine Kategorie klicke, wird eine Liste von Elementen unter dieser Kategorie angezeigt. Es wird die Liste der Elemente ausblenden, wenn ich auf eine andere Kategorie klicke.So zeigen Sie verschiedene Liste von Elementen an, wenn Sie auf eine Kategorie klicken
Ich wurde zwei APIs zur Verfügung gestellt, eine mit dem JSON der Kategorien und eine andere mit den Elementen.
Ich habe es geschafft, die Daten von den APIs zu holen und sie auf dem DOM auszuspucken. Allerdings finde ich es schwierig, die Komponente zusammenzusetzen, um nur die richtigen Elemente anzuzeigen, wenn auf die Kategorie geklickt wurde.
Ich benutze Babel, um meine JSX-Syntax zu transpilieren und verwendet Axios, um die Daten zu holen. Im Moment spuckt meine Seite nur alle Gegenstände und alle Kategorien aus. Den Zustand zu verstehen ist schwierig für mich.
Irgendwelche Tipps für einen Neuling Reactjs schlanker? Vielen Dank!
Meine zwei APIs können in meinem Code gefunden werden, da ich nicht genügend Rep-Punkte zum Posten von Links habe.
Mein JSX:
var React = require('react');
var ReactDOM = require('react-dom');
var axios = require('axios');
var NavContainer = React.createClass({
getInitialState: function() {
return {
category: [],
items: []
}
},
// WHAT IS CURRENTLY SELECTED
handleChange(e){
this.setState({data: e.target.firstChild.data});
},
componentDidMount: function() {
// FETCHES DATA FROM APIS
var th = this;
this.serverRequest =
axios.all([
axios.get('https://api.gousto.co.uk/products/v2.0/categories'),
axios.get('https://api.gousto.co.uk/products/v2.0/products?includes[]=categories&includes[]=attributes&sort=position&image_sizes[]=365&image_sizes[]=400&period_id=120')
])
.then(axios.spread(function (categoriesResponse, itemsResponse) {
//... but this callback will be executed only when both requests are complete.
console.log('Categories', categoriesResponse.data.data);
console.log('Item', itemsResponse.data.data);
th.setState({
category: categoriesResponse.data.data,
items : itemsResponse.data.data,
});
}));
},
componentWillUnmount: function() {
this.serverRequest.abort();
},
render: function() {
return (
<div className="navigation">
<h1>Store Cupboard</h1>
<NavigationCategoryList data={this.state.category} handleChange={this.handleChange}/>
<NavigationSubCategoryList data={this.state.category} subData={this.state.items} selected_category={this.state.data} />
</div>
)
}
});
var NavigationCategoryList = React.createClass({
render: function() {
var handleChange = this.props.handleChange;
// LOOPS THE CATEGORIES AND OUTPUTS IT
var links = this.props.data.map(function(category) {
return (
<NavigationCategory title={category.title} link={category.id} handleChange={handleChange}/>
);
});
return (
<div>
<div className="navigationCategory">
{links}
</div>
</div>
);
}
});
var NavigationSubCategoryList = React.createClass({
render: function() {
var selected = this.props.selected_category;
var sub = this.props.subData.map(function(subcategory) {
if(subcategory.categories.title === selected)
return (
<NavigationSubCategoryLinks name={subcategory.title} link={subcategory.link} />
);
});
return (
<div className="subCategoryContainer">
{sub}
</div>
);
}
});
var NavigationSubCategoryLinks = React.createClass({
render: function() {
return (
<div className="navigationSubCategory" id={this.props.name}>
{this.props.name}
</div>
);
}
});
var NavigationCategory = React.createClass({
render: function() {
var handleChange = this.props.handleChange;
return (
<div className="navigationLink">
<a href={this.props.link} onClick={handleChange}>{this.props.title}</a>
</div>
);
}
});
ReactDOM.render(<NavContainer />, document.getElementById("app"));
Hier ist ein Screenshot von dem, was ich auf meiner Webseite haben so weit. Alles wird nur auf dem Bildschirm angezeigt. Die Links in Blau sind die Kategorien.
Screenshot of current web page
Haben Sie es jemals herausgefunden? – montrealist
Ich werde versuchen, später eine spezifische Antwort auf Ihre Frage zu schreiben, aber schauen Sie sich dieses jsbin an, das etwas zeigt, das dem ähnlich ist, was Sie versuchen zu tun. Notieren Sie den 'items.filter (...)' ungefähr in der Mitte durch. Dies ist der Schlüssel zum Filtern einer Reihe von Ergebnissen und nur zum Auswählen bestimmter Ergebnisse. Sie müssen eine Funktion schreiben, die die 'ID' jedes Elements überprüft und diese mit der 'selectedCategoryId' vergleicht und nur diejenigen auswählt, die übereinstimmen. http://jsbin.com/yotucu/1/embed?html,js,output – jaybee
Danke @dannyid; irgendwelche Gedanken zu Best Practice React-Weg, um Code basierend auf einer vorhandenen Reihe von Kategorien und Elementen (Viele-zu-viele-Beziehung) zu organisieren, die vom Server kommen? – montrealist