when I try to dispatch an event on logout function it shows me an error I think the way I am connecting Redux is wrong but I'm not sure can anyone solve this?
Logout Function
Auth.logout(() => {
Firebase.auth().signOut().then(() => {
this.props.updateState();
});
})
Dispatch
const mapDispatchToProps = dispatch => {
return{
updateState: () => dispatch({type: 'UPDATE_REDUX_STATE'})
}
}
Export with connect and withRouter
export default withRouter(connect(null, mapDispatchToProps)(Navigation))
Navigation Component
class Navigation extends Component {
logoutHander(){
Auth.logout(() => {
Firebase.auth().signOut().then(() => {
this.props.updateState();
});
})
}
render(){
return(
<div className="custom-container-fluid">
<nav className="navbar navbar-expand-md text-center">
<div className="container">
<a className="navbar-brand" href="/">FG</a>
<button className="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span className="navbar-toggler-icon"></span>
</button>
<div className="collapse navbar-collapse" id="navbarNav">
{
Auth.isAuthenticated() === true ?
<ul className="navbar-nav ml-auto">
<li className="nav-item">
<Link className="nav-link" to="/home"><i className="fas fa-home" style={{marginRight: '3px'}}></i>Home</Link>
</li>
<li className="nav-item">
<Link className="nav-link" to="/myrecipe"><i className="fas fa-stream" style={{marginRight: '3px'}}></i>My Recipes</Link>
</li>
<li className="nav-item" onClick={this.logoutHander}>
<Link className="nav-link" to="/"><i className="fas fa-user" style={{marginRight: '3px'}}></i>Logout</Link>
</li>
<li className="nav-item upload-nav">
<Link className="nav-link" to="/uploadRecipe"><i className="fas fa-upload" style={{marginRight: '3px'}}></i>Upload Recipe</Link>
</li>
</ul>
:
<ul className="navbar-nav ml-auto">
<li className="nav-item">
<Link className="nav-link" to="/login"><button className="btn nav-btn-signup"><i className="fas fa-user" style={{marginRight: '3px'}}></i>Login</button></Link>
</li>
</ul>
}
</div>
</div>
</nav>
</div>
);
}
Error I am getting is Cannot read property 'props' of undefined
This reference not possessed inside the firebase method,
can you pass this instance value to some other variable, Current instance will be copied when the function till complete
constructor(props) {
super(props);
}
logoutHander(){
const self = this;
Auth.logout(() => {
Firebase.auth().signOut().then(() => {
self.props.updateState();
});
})
}
Related
My version of Bootstrap is 5.2.
navbar.jsx
import React, { Component } from "react";
import { NavLink, Link } from "react-router-dom";
class Navbar extends Component {
state = {};
render() {
return (
<nav className="navbar navbar-dark mb-2 navbar-expand-lg bg-dark">
<div className="container">
<Link className="navbar-brand" to="#">
Vidly
</Link>
<button
className="navbar-toggler"
type="button"
data-toggle="collapse"
data-target="#navbarNavAltMarkup"
aria-controls="navbarNavAltMarkup"
aria-expanded="false"
aria-label="Toggle navigation"
>
<span className="navbar-toggler-icon" />
</button>
<div className="collapse navbar-collapse" id="navbarNav">
<ul className="navbar-nav ms-auto">
<li className="nav-item">
<NavLink className="nav-link" aria-current="page" to="/movies">
Movies
</NavLink>
</li>
<li className="nav-item">
<NavLink className="nav-link" to="/rentals">
Rentals
</NavLink>
</li>
<li className="nav-item">
<NavLink className="nav-link" to="/customers">
Customers
</NavLink>
</li>
<li className="nav-item">
<NavLink className="nav-link" to="/login">
Login
</NavLink>
</li>
</ul>
</div>
</div>
</nav>
);
}
}
export default Navbar;
Above is my code here on top navbar-toggle is not working.
I tried more things and read more documents about it but I'm unable to find a solution - kindly need your help.
Thanks in advance <3
I think "bootstrap" and "react-bootstrap" are different.
you can refer to this link
https://react-bootstrap.github.io
I have a react component called NavBar. It gets a variable from another component (App.js) which specifies if the page is in dark mode or not. The variable is called "pageMode". I want to change the class of the navBar from navbar-light to navbar-dark depending of the value of the "pageMode" var.
Here´s the code
import React from 'react';
class NavBar extends React.Component{
render(){
if(this.props.pageMode === "dark"){
//Here I want to do something to render the component using navbar-dark class
}
else{
//Render using navbar-light class
}
return <nav className="navbar navbar-expand-lg [navbar-light] bg-light">
<a className="navbar-brand NavBar-title-fix" href="#">Inicio</a>
<button className="navbar-toggler" type="button" data-toggle="collapse" data-
target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-
expanded="false" aria-label="Toggle navigation">
<span className="navbar-toggler-icon"></span>
</button>
<div className="collapse navbar-collapse" id="navbarSupportedContent">
<ul className="navbar-nav mr-auto">
<li className="nav-item active">
<a className="nav-link" href="#">Proyectos</a>
</li>
<li className="nav-item">
<a className="nav-link" href="#">Sobre mi</a>
</li>
</ul>
</div>
</nav>
}
}
export default NavBar;
In the render return state the class between [] is the one that i want to be changed depending of the variable value.
Thanks for reading!
import React from 'react';
class NavBar extends React.Component{
render(){
const themeClass = {
dark: '[navbar-dark]',
light: '[navbar-light]'
}[this.props.pageMode]
return <nav className={`navbar navbar-expand-lg ${themeClass} bg-light`}>
<a className="navbar-brand NavBar-title-fix" href="#">Inicio</a>
<button className="navbar-toggler" type="button" data-toggle="collapse" data-
target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-
expanded="false" aria-label="Toggle navigation">
<span className="navbar-toggler-icon"></span>
</button>
<div className="collapse navbar-collapse" id="navbarSupportedContent">
<ul className="navbar-nav mr-auto">
<li className="nav-item active">
<a className="nav-link" href="#">Proyectos</a>
</li>
<li className="nav-item">
<a className="nav-link" href="#">Sobre mi</a>
</li>
</ul>
</div>
</nav>
}
}
BELOW IS MY CODE : HEADER.JS
When I click on shop button in navigation on homepage -> http://localhost:3000/ then it should go to -> http://localhost:3000/product-listing and should add a bg-black class on nav tag and should stay black background.
IMPORTS---
import React, { useState, useEffect } from "react";
import Loading from "../other/Loading";
import PageNotFound from "../other/PageNotFound";
import { NavLink, useLocation } from "react-router-dom";
const Header = () => {
const [loading, setLoading] = useState(true);
const [headerData, setHeaderData] = useState(null);
const [bgBlack, setBgBlack] = useState("");
const [border, setBorder] = useState("");
const [textColor, setTextColor] = useState("");
const location = useLocation();
console.log(location.pathname);
USE EFFECT---
useEffect(() => {
getHeaderData();
window.addEventListener("scroll", changeBackground);
return () => {
window.removeEventListener("scroll", changeBackground);
};
}, []);
GET HEADER NAVIGATION DATA---
const getHeaderData = async () => {
try {
const response = await fetch("http://localhost:8000/navLinks");
const data = await response.json();
if (data) {
setLoading(false);
setHeaderData(data);
} else {
setHeaderData("DATA NOT FOUND");
}
} catch (err) {
if (err) {
console.log("OOPS... SOMETHING WENT WRONG");
}
}
};
CHANGE NAV BACKGROUND-COLOR---
const changeBackground = () => {
if (window.scrollY > 5) {
setBgBlack("bg-black");
setBorder("border-bottom");
setTextColor("text-white");
} else {
setBgBlack("");
setBorder("");
setTextColor("");
}
};
IF LOADING IS TRUE LOAD LOADING COMPONENT---
if (loading) {
return (
<>
<Loading loadingHeader="Loading Header" />
</>
);
}
// console.log(headerData);
RETURN JSX---
return (
<>
{headerData ? (
<header>
<nav
className={`navbar navbar-expand-lg navbar-light ${bgBlack} fixed-top`}
>
<div className="container">
<div>
<button
className="navbar-toggler"
type="button"
data-toggle="collapse"
data-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent"
aria-expanded="false"
aria-label="Toggle navigation"
>
<span className="text-white">
<i className="fa fa-bars"></i>
</span>
</button>
</div>
<div className="order-lg-0">
<NavLink className="navbar-brand" to="/">
<img
width="50"
src={headerData.logo.url}
className="img-fluid"
alt=""
/>
</NavLink>
</div>
<div className="order-lg-2 d-lg-none">
<span
className="text-white d-flex"
data-toggle="modal"
data-target="#mobileCartModal"
>
<span className="d-inline-block mr-1">
<i className="fa fa-shopping-cart"></i>
</span>
<span className="d-inline-block">0</span>
</span>
</div>
<div
className="collapse navbar-collapse order-lg-1"
id="navbarSupportedContent"
>
<ul className="navbar-nav mr-auto px-3">
{/* <li className="nav-item dropdown">
<a
className="nav-link dropdown-toggle"
href="#"
id="navbarDropdown"
role="button"
data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false"
>
Packages
</a>
<div
className="dropdown-menu"
aria-labelledby="navbarDropdown"
>
<a className="dropdown-item" href="product.html">
Subscriptions
</a>
<a className="dropdown-item" href="product.html">
Value Packs
</a>
</div>
</li>
<li className="nav-item dropdown">
<a
className="nav-link dropdown-toggle"
href="#"
id="navbarDropdown"
role="button"
data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false"
>
Juices
</a>
<div
className="dropdown-menu"
aria-labelledby="navbarDropdown"
>
<a className="dropdown-item" href="product.html">
Juices
</a>
<a className="dropdown-item" href="product.html">
Almond Milks
</a>
<a className="dropdown-item" href="product.html">
Protien Milkshake
</a>
<a className="dropdown-item" href="product.html">
Cleanses
</a>
</div>
</li> */}
<li className="nav-item">
<NavLink
className="nav-link"
to="/product-listing"
data-toggle="modal"
data-target="#loginModal"
>
Shop
</NavLink>
</li>
<li className="nav-item dropdown">
<a
className="nav-link dropdown-toggle"
href="#"
id="navbarDropdown"
role="button"
data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false"
>
Learn
</a>
<div
className="dropdown-menu"
aria-labelledby="navbarDropdown"
>
<a className="dropdown-item" href="#">
Process
</a>
<a className="dropdown-item" href="#">
About Us
</a>
<a className="dropdown-item" href="#">
Blog
</a>
<a className="dropdown-item" href="#">
News
</a>
<a className="dropdown-item" href="#">
Beyond The Bottle
</a>
</div>
</li>
<li className="nav-item">
<a
className="nav-link"
href="#"
data-toggle="modal"
data-target="#loginModal"
>
Login
</a>
</li>
<li className="nav-item">
<a
className="nav-link"
href="#"
data-toggle="modal"
data-target="#signupModal"
>
Sign Up
</a>
</li>
</ul>
<form className="dvSearch my-2 my-lg-0 px-3 position-relative">
<input
className={`form-control mr-sm-2 ${border}`}
type="text"
placeholder="Search"
aria-label="Search"
/>
<button
className="btn my-2 my-sm-0 position-absolute"
type="submit"
>
<i className={`fa fa-search ${textColor}`}></i>
</button>
</form>
</div>
</div>
</nav>
</header>
) : (
<PageNotFound />
)}
</>
);
};
EXPORT DEFAULT HEADER.JS---
export default Header;
I am trying to do responsive navbar by using bootstrap in reactjs.I have update the show in state so as i do like show or hide the element but the toggle button is not trigger.If i use the script link in bootstrap its working but i don't want to use the scripting links and want to update manual.so help me out.
Here is my code:
import React, { Component } from "react";
export default class NavBar extends Component {
constructor(props) {
super(props);
this.state = {
show: true,
};
}
showToggle = () => {
this.setState({
show: false,
});
};
render() {
return (
<div className="container-fluid">
<div className="row">
<div className="col-lg-12 col-md-12 col-sm-12">
<nav className="navbar navbar-expand-lg navbar-dark bg-dark">
<div className="navbar-brand">
<img
alt="logo"
src="./images/or.png"
width="100px"
height="30"
className="d-inline-block align-top img-fluid"
/>
{/* <span className="nav-brand">Ortho Life Hospital</span> */}
</div>
<button
className="navbar-toggler"
type="button"
// data-toggle="collapse"
// data-target="#navbarSupportedContent"
// aria-controls="navbarSupportedContent"
// aria-expanded="false"
// aria-label="Toggle navigation"
onClick={this.showToggle}
>
<span className="navbar-toggler-icon"></span>
</button>
{this.state.show ? (
<div
className="collapse navbar-collapse"
id="navbarSupportedContent"
>
<ul className="navbar-nav ml-auto">
<li className="nav-item ml-5">
<a className="nav-link" href="/">
Home
</a>
</li>
<li className="nav-item ml-5">
<div className="dropdown">
<a
className="nav-link"
href="/about"
id="dropdownMenuButton"
data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false"
>
About Us
</a>
<div
className="dropdown-menu"
aria-labelledby="dropdownMenuButton"
>
<a className="dropdown-item" href="/about/#history">
History
</a>
<a className="dropdown-item" href="/about/#vision">
Vision and Mission
</a>
<a className="dropdown-item" href="/about/#whyortho">
Why Ortho?
</a>
</div>
</div>
</li>
<li className="nav-item ml-5">
<div className="dropdown">
<a
className="nav-link"
href="/department"
id="dropDownDepartment"
data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false"
>
Department
</a>
<div
className="dropdown-menu"
aria-labelledby="dropDownDepartment"
>
<a
className="dropdown-item"
href="/department/#medical"
>
Medical
</a>
<a
className="dropdown-item"
href="/department/#allied"
>
Allied
</a>
</div>
</div>
</li>
<li className="nav-item ml-5">
<a className="nav-link" href="/media">
Media
</a>
</li>
<li className="nav-item ml-5">
<a className="nav-link" href="/contactus">
Contact Us
</a>
</li>
</ul>
</div>
) : null}
</nav>
</div>
</div>
</div>
);
}
}
I can´t pass the parameters from a child component to a parent component using the same event handler.
My components' tree follows this structure:
ProductList
ProductsGrid
PaginationBar
In the ProducList component I have this event handler
handlePagination = (index) => { bla bla bla }
<PaginationBar
OnPagination={(index) => this.handlePagination(index)}
pages={this.state.pages}
/>
In the Pagination Bar when I render the page.
render() {
return (
<nav aria-label="Catalog page navigation">
<ul className="pagination">
<li className={this.navButtonEnabled(0)} key="page-item-0">
<a
className="page-link"
onClick={this.props.OnPagination(0)}
href="#"
aria-label="Previous"
>
<span aria-hidden="true">Previous 3</span>
</a>
</li>
<li className={this.navButtonEnabled(1)} key="page-item-1">
<a
className="page-link"
onClick={this.props.OnPagination(1)}
href="#"
>
<span aria-hidden="true">
{this.navButtonDisplay(this.props.pages.navigation[1])}
</span>
</a>
</li>
<li className={this.navButtonEnabled(2)} key="page-item-2">
<a
className="page-link"
onClick={this.props.OnPagination(2)}
href="#"
>
<span aria-hidden="true">
{this.navButtonDisplay(this.props.pages.navigation[2])}
</span>
</a>
</li>
<li className={this.navButtonEnabled(3)} key="page-item-3">
<a
className="page-link"
onClick={this.props.OnPagination(3)}
href="#"
>
<span aria-hidden="true">
{this.navButtonDisplay(this.props.pages.navigation[3])}
</span>
</a>
</li>
<li className={this.navButtonEnabled(4)} key="page-item-4">
<a
className="page-link"
onClick={this.props.OnPagination(4)}
href="#"
aria-label="Next"
>
<span aria-hidden="true">Next 3</span>
</a>
</li>
</ul>
</nav>
);
}
}
In the onClick event, I call the event handler with the index number (this is the parameter I want to pass), according the button clicked I render correctly the ProductsGrid. But it doesn't work at all, I tried several approaches, I just want to pass a number via a parameter for a lifting up event handler. What am I doing wrong?
This is the error presented in the console.
react_devtools_backend.js:6 Warning: Cannot update during an existing state transition (such as within render). Render methods should be a pure function of props and state.
in Pagination (created by Catalog)
in Catalog (created by App)
in main (created by App)
in App
I am not changing any state during the render process, the event handler changes the status, when the button is clicked. This is not a render process.
Please replace
onClick={this.props.OnPagination(0)}
With
onClick={() => {this.props.OnPagination(0)}}
Here is complete code (I have commented some code so that I can run this easily to my end):
import React from "react";
export default class ProductList extends React.Component {
handlePagination = (index) => {
console.log(index, 'index');
};
render() {
return (
<PaginationBar OnPagination={(index) => this.handlePagination(index)}
// pages={this.state.pages}
/>
);
}
}
class PaginationBar extends React.Component {
render() {
return (
<nav aria-label="Catalog page navigation">
<ul className="pagination">
<li key="page-item-0">
<a
className="page-link"
onClick={() => {this.props.OnPagination(0)}}
href="#"
aria-label="Previous"
>
<span aria-hidden="true">Previous 3</span>
</a>
</li>
<li key="page-item-1">
<a
className="page-link"
onClick={() => {this.props.OnPagination(1)}}
href="#"
>
<span aria-hidden="true">
{/*{this.navButtonDisplay(this.props.pages.navigation[1])}*/}
Previous 2
</span>
</a>
</li>
<li key="page-item-2">
<a
className="page-link"
onClick={() => {this.props.OnPagination(2)}}
href="#"
>
<span aria-hidden="true">
{/*{this.navButtonDisplay(this.props.pages.navigation[2])}*/}
Previous 1
</span>
</a>
</li>
<li key="page-item-3">
<a
className="page-link"
onClick={() => {this.props.OnPagination(3)}}
href="#"
>
<span aria-hidden="true">
{/*{this.navButtonDisplay(this.props.pages.navigation[3])}*/}
Next 2
</span>
</a>
</li>
<li key="page-item-4">
<a
className="page-link"
onClick={() => {this.props.OnPagination(4)}}
href="#"
aria-label="Next"
>
<span aria-hidden="true">Next 3</span>
</a>
</li>
</ul>
</nav>
);
}
}