Reputation: 5236
I'm making my first react project. I'm new in JS, HTML, CSS and even web app programming.
What I'm trying to do is to display some information on button click.
I have my main default component, App.js
. It looks like this:
import React, { Component } from "react";
import Navbar from "./Components/Navbar";
import "./Styles/App.css";
import ProjectsList from "./Components/Projects/ProjectsList";
import axios from "axios";
class App extends Component {
state = {
projects: [], //i get it from api on Didmount();
showProjects: true //hardcoded var to shows projects list
};
componentDidMount() {
//i get projects here from axios and my api, it works ok!
}
render() {
return (
<div>
<Navbar />
{this.state.showProjects && (
<ProjectsList projects={this.state.projects} />
)}
</div>
);
}
}
export default App;
As you can see, I can manipulate my ProjectLists
visibility by hard-coded showprojects
boolean. It works ok. When false it is not visible and when true it is visible, pretty simple.
How to transfer that showProjects
variable to my Navbar.js
component and trigger it by clicking on Navbar item?
My Navbar.js
:
import React, { Component } from "react";
import { Navbar } from "react-bootstrap";
class NavBar extends Component {
render() {
return (
<Navbar inverse collapseOnSelect>
<Navbar.Collapse>
<Navbar.Form>
<Navbar.Brand> Projects </Navbar.Brand> //button click here, how to?
</Navbar.Form>
</Navbar.Collapse>
</Navbar>
);
}
}
export default NavBar;
And view look like this:
I want to have option to click on Projects
on my Navbar, then my ShowProjects
will be set to true and projects will be visible. How to do that?
Thanks for any advices!
EDIT:
If it will help, my ProjectsList.js
component:
import React, { Component } from "react";
import Project from "./Project";
import { ListGroup } from "react-bootstrap";
class ProjectsList extends Component {
render() {
return (
<ListGroup>
{this.props.projects.map(project => {
return <Project project={project} key={project.id} />;
})}
</ListGroup>
);
}
}
export default ProjectsList;
Upvotes: 0
Views: 8938
Reputation: 1241
First create a state change function in the parent component:
toggleShowProjects = () => {
this.setState(prevState => ({
showProjects: !prevState.showProjects
}))
}
Than pass the function to your Navbar component:
import React, { Component } from "react";
import Navbar from "./Components/Navbar";
import "./Styles/App.css";
import ProjectsList from "./Components/Projects/ProjectsList";
import axios from "axios";
class App extends Component {
state = {
projects: [], //i get it from api on Didmount();
showProjects: true //hardcoded var to shows projects list
};
componentDidMount() {
//i get projects here from axios and my api, it works ok!
}
toggleShowProjects = () => {
this.setState(prevState => ({
showProjects: !prevState.showProjects
}))
}
render() {
return (
<div>
<Navbar
toggleProjects={this.toggleShowProjects} />
{this.state.showProjects && (
<ProjectsList
projects={this.state.projects} />
)}
</div>
);
}
}
export default App;
Upvotes: 2