Sono abbastanza nuovo per React JS e ho questa semplice interfaccia utente che ho bisogno di compilare. Fondamentalmente ho una lista di categorie e se clicco su una categoria, una lista di elementi verrà mostrata sotto quella categoria. Nasconderà la lista degli oggetti se clicco su un'altra categoria.Come visualizzare un elenco diverso di elementi quando si fa clic su una categoria
Sono state fornite due API, una contenente il JSON delle categorie e un'altra contenente gli elementi.
Sono riuscito a recuperare i dati dalle API e sputarli sul DOM. Tuttavia trovo difficile mettere insieme il componente per visualizzare solo gli elementi giusti quando si fa clic sulla categoria.
Sto usando Babel per traspondere la mia sintassi JSX e usa gli assi per recuperare i dati. Al momento la mia pagina sputa solo tutti gli oggetti e tutte le categorie. Capire lo stato è difficile per me.
Qualche consiglio per un principiante Reactjs più snello? Grazie!
Le mie due API possono essere trovate nel mio codice poiché non ho abbastanza punti Rep per postare link.
mio 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"));
Ecco uno screenshot di quello che ho sulla mia pagina web finora. Tutto semplicemente scarica sullo schermo. I collegamenti in blu sono le categorie.
Screenshot of current web page
Hai mai capito? – montrealist
Proverò a scrivere una risposta specifica per la tua domanda in seguito, ma controlla questo jsbin che mostra qualcosa di simile a ciò che stai cercando di fare. Prendere nota di 'items.filter (...)' a metà strada. Questa è la chiave per filtrare attraverso una serie di risultati e selezionarne solo specifici. Avrai bisogno di scrivere una funzione che controlli l'ID di ogni elemento e lo paragoni a 'SelectedCategoryId' e seleziona solo quelli che corrispondono. http://jsbin.com/yotucu/1/embed?html,js,output – jaybee
Grazie @dannyid; Qualche idea sulla migliore pratica React-way per organizzare il codice in base a un gruppo esistente di categorie e elementi (relazione molti-a-molti) provenienti dal server? – montrealist