my parent layout component:
function MainPage() {
return(
<div>
<MLayout children={<MNavbar custOrFalse={false} />} />
</div>
);
}
export default MainPage;
my child navbar component:
const Navbar = ({...props},{children}) => {
const [grid, makeGrid] = useState(false); //whatever is inside the parenthesis is the starting value
const [publish, makePublish] = useState(false);
const [research, makeResearch] = useState(false);
const [custOrFalse, makeCustToggle] = useState(props.custOrFalse);
const [custCount,setCount] = useState(0);
function CustToggle(){
makeCustToggle(prevVal=>!prevVal); //useState is an async function, so need to use the previous value.
}
//can set this navbar to be cust based or not
var custButton='cust page'
if ( custOrFalse===true ) {
custButton='cust login'
};
var countFirst = (custCount == 0);
console.log(countFirst)
// useEffect(()=>{
// console.log(custCount);
// },[custOrFalse]);
console.log(custCount);
return (
<div>
<nav className = {`${styles.page__menu} ${styles.page__custom_settings} ${styles.menu}`} >
<ul className = {`${styles.menu__list} ${styles.r_list}`} >
<CustomNavButtonLeft navbutton='the grid' />
<CustomNavButtonLeft navbutton='publish' />
<CustomNavButtonLeft navbutton='research' />
<CustomNavButtonRight navbutton={custButton} onClick={CustToggle,()=> setCount(custCount + 1)} />
</ul>
</nav>
{custOrFalse&&<Registration/>}
{countFirst&&!custOrFalse&&<DLogin/>}
</div>
);
};
export default Navbar;
i'm trying to get the button on the navbar to toggle between texts as well as toggle between components it renders - BUT have the first rendering not show a component that i havent created yet, so in effect, show nothing.
when i run this code, the console log displays:
true
0
false
i was under the impression it would simply display true, but for some reason the count is made as soon as the component is rendered it seems?
from research what i understand, useEffect is an async function - but i'm not sure how that impacts the flow here
updated to show that once the counter is added, the toggle stops working
if you're trying to call both the methods onClick you should do
onClick={()=> {
CustToggle();
setCount(custCount + 1)
}}
``` instead of your current syntax
Since you are using old value of custCount your state setter should accept a callback argument (state updates may be asynchronous in React).
()=> setCount(count=> count+1).
Also, you are initializing a state from props. This is an antipattern in React.
const [custOrFalse, makecustToggle] = useState(props.custOrFalse);
See this medium article:
Personally, I'd rewrite your Navbar component as follows, to use getDerivedStateFromProps :
class Navbar extends React.Component {
constructor(props) {
super(props);
this.state = {grid:false, publish: false, research: false, custOrFalse: false, custCount: 0};
}
static getDerivedStateFromProps(props, state) {
return {custOrFalse: props.custOrFalse};
}
custToggle = ()=>{
this.setState(oldState=> {
return {custToggle: !oldState.custToggle, custCount: oldState.custCount+1};
});
}
render() {
// .....
}
}