I have to pass an icon and text to a button, and this button is in a component, and that component name is ReusableButton in my project. My problem is I have two more buttons with same button style, but the icon and text are different. So If I know how to pass an icon and text to a button, then I can resume that button component. I will share my code so please go through it once. Still, if I am not clear with my doubt please put comment
This is App.js
import React from 'react';
import './App.css';
import Navbar from './Navbar/Navbar'
import Button from './Button/Button'
function App() {
return (
<div className="App">
<Navbar></Navbar>
<Button></Button>
</div>
);
}
export default App;
This is App.css
I didn't apply any css in App.css
This is Navbar.js
import React, { Component } from 'react';
import './Navbar.css';
class Navbar extends Component {
render() {
return (
<div className='container-fluid'>
<div className='row'>
<div className='col-6'>
<nav className="logoclass navbar navbar-expand-lg navbar-light">
<a className='hyperlinkStyle' href='www.facebook.com'>
<img className='logoStyle' src='assets/images/logo.png' alt='logo'></img>
</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>
</nav>
</div>
</div>
</div>
);
}
}
export default Navbar
This is Navbar.css
/* logoStyle css starts here */
.logoStyle {
width:103px;
margin-top: -4%;
margin-left: 88%;
}
/* logoStyle css ends here */
/* this css used to remove dots in li of ul, starts here */
li {
list-style-type: none;
}
/* ends here */
/* helpStyle css starts here */
.helpStyle {
color: #00b2d6;
cursor: pointer;
font-size: .75rem;
font-family: 'Roboto', sans-serif;
}
/* helpStyle css ends here */
.lione {
display: inline-block;
}
.litwo {
display: inline-block;
}
.lithree {
display: inline-block;
}
.border {
background-color: transparent;
border-radius: 1%;
}
.english {
color: #524c61;
font-size: .75rem;
font-family: 'Roboto', sans-serif;
font-size: .75rem;
}
.flagStyle {
height:.75rem;
margin-left: .5em;
margin-right: .25em;
margin-top:-2.5%;
}
.rupeeStyle {
margin-left: .5em;
color: #b2aebd;
font-size: .75rem;
}
.buttonStyle {
background-color: transparent;
}
This is Button.js
import React, { Component } from 'react';
import './Button.css'
import ReusableButton from '../ReusableButton/ReusableButton';
class Button extends Component {
render() {
return(
<div className='container'>
<div className='row'>
<div className='col-12'>
<ReusableButton></ReusableButton>
</div>
</div>
</div>
)
}
}
export default Button
This is Button.css
I didn't apply any css in Button.css
I created this component to reuse, This is ReusableButton.js
import React, { Component } from 'react'
import './ReusableButton.css';
class ReusableButton extends Component {
render() {
return(
<div className='button'>
<button type='button' class='btn-primary buttonStyle'>Click here</button>
</div>
)
}
}
export default ReusableButton
This is ReusableButton.css
.buttonStyle {
border: none;
}
My Goal is to pass Icon and text to a button.
You can pass anything you want as a render prop as long as it is a valid dom node (so wrapped in a single html element). Usually, render props are used to avoid handling edgecases in a component. Indeed, you don't want to pass props such as isDisabled, onIconClick, etc.
You can simply use props
for this.
In your Button.js
, pass the text you want to put in your reusable button like this
<ReusableButton btnText="yourText"></ReusableButton>
Then suppose your icons are images (not bootstrap glyphicons), you import all of them first and create a switch condition that will render the right icon according to your passed text.
import React, { Component } from 'react';
import './ReusableButton.css';
//import your icons here
import Icon1 from './dir/icon1.png';
import Icon2 from './dir/icon2.png';
import Icon3 from './dir/icon3.png';
class ReusableButton extends Component {
//this function will identify what icon to render
renderIcon = () => {
switch(this.props.btnText) {
case 'yourText1': return <Icon1 />;
case 'yourText2': return <Icon2 />;
case 'yourText3': return <Icon3 />;
}
}
render() {
return(
<div className='button'>
<button type='button' class='btn-primary buttonStyle'>
{this.renderIcon} {this.props.btnText}
</button>
</div>
)
}
}
export default ReusableButton;
Another way is pass the icon and text from the parent Button
component as children like this
//import your icons at Button.js
import Icon1 from './dir/icon1.png';
import Icon2 from './dir/icon2.png';
import Icon3 from './dir/icon3.png';
Then pass it as children to your reusable button like this
<ReusableButton><Icon1 /> YourText1 </ReusableButton>
<ReusableButton><Icon2 /> YourText2 </ReusableButton>
<ReusableButton><Icon3 /> YourText3 </ReusableButton>
Then in your ReusableButton.js
Use it like this
render() {
return(
<div className='button'>
<button type='button' class='btn-primary buttonStyle'>
{this.props.children}
</button>
</div>
)
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With