How do I re do my get request when I click on a button ?
import axios from "axios";
import React,{useState} from 'react';
import ReactDOM from 'react-dom';
import '../node_modules/bootstrap/dist/css/bootstrap.min.css';
export default function App(){
const [randomQuote,setRandomQuote] = useState('');
React.useEffect(
() => {
axios.get(baseURL)
.then((res)=> {
setRandomQuote(res.data);
});
}, []
);
if (!randomQuote) return null;
return (
<div>
<QuoteCard
quote={randomQuote.content}
author={randomQuote.author}
handleClick={}
/>
</div>
)
}
My QuoteCard ponent has a 'generate' button, that when on clicked will generate another random quote from api.
function QuoteCard(props){
return(
<div id="quoteCard" className="card shadow p-3">
<div className="text-center quoteText">
<h3 className="bold lead" style={props.textStyles}>{props.quote}</h3>
</div>
<div className="quoteAuthor">
<p className="float-end" style={props.textStyles}>- {props.author}</p>
</div>
<div className="buttons d-flex justify-content-between">
<div className="social-buttons d-flex justify-content-between">
<button className="btn btn-secondary m-1">
<i className="fab fa-twitter"></i>
</button>
<button className="btn btn-secondary m-1">
<i className="fab fa-instagram"></i>
</button>
</div>
<div>
<button className="btn btn-secondary" onClick={props.handleClick}>Generate</button>
</div>
</div>
</div>
);
}
ReactDOM.render(<App/>,document.getElementById('root'));
I'm quite new to using hooks in functions instead of lifecycle methods, so I'm not sure how to re-trigger the get request on the 'handleClick' prop.
How do I re do my get request when I click on a button ?
import axios from "axios";
import React,{useState} from 'react';
import ReactDOM from 'react-dom';
import '../node_modules/bootstrap/dist/css/bootstrap.min.css';
export default function App(){
const [randomQuote,setRandomQuote] = useState('');
React.useEffect(
() => {
axios.get(baseURL)
.then((res)=> {
setRandomQuote(res.data);
});
}, []
);
if (!randomQuote) return null;
return (
<div>
<QuoteCard
quote={randomQuote.content}
author={randomQuote.author}
handleClick={}
/>
</div>
)
}
My QuoteCard ponent has a 'generate' button, that when on clicked will generate another random quote from api.
function QuoteCard(props){
return(
<div id="quoteCard" className="card shadow p-3">
<div className="text-center quoteText">
<h3 className="bold lead" style={props.textStyles}>{props.quote}</h3>
</div>
<div className="quoteAuthor">
<p className="float-end" style={props.textStyles}>- {props.author}</p>
</div>
<div className="buttons d-flex justify-content-between">
<div className="social-buttons d-flex justify-content-between">
<button className="btn btn-secondary m-1">
<i className="fab fa-twitter"></i>
</button>
<button className="btn btn-secondary m-1">
<i className="fab fa-instagram"></i>
</button>
</div>
<div>
<button className="btn btn-secondary" onClick={props.handleClick}>Generate</button>
</div>
</div>
</div>
);
}
ReactDOM.render(<App/>,document.getElementById('root'));
I'm quite new to using hooks in functions instead of lifecycle methods, so I'm not sure how to re-trigger the get request on the 'handleClick' prop.
Share Improve this question asked Sep 23, 2021 at 7:12 Esam OlwanEsam Olwan 3622 gold badges6 silver badges22 bronze badges 1-
3
Create a function inside your app function like
function update() { axios(...)... }
and useuseEffect(update, []);
instead. Now just call update() again at any point. – user5734311 Commented Sep 23, 2021 at 7:17
3 Answers
Reset to default 2As Chris mentioned you have to create a function with name like update
and paste axios up there:
import axios from "axios";
import React, { useState, useEffect } from 'react';
import ReactDOM from 'react-dom';
import '../node_modules/bootstrap/dist/css/bootstrap.min.css';
export default function App() {
const [randomQuote, setRandomQuote] = useState('');
const update = () => {
axios
.get(baseURL)
.then((res) => {
setRandomQuote(res.data);
});
};
useEffect(update, []);
if (!randomQuote) return null;
return (
<div>
<QuoteCard
quote={randomQuote.content}
author={randomQuote.author}
handleClick={update}
/>
</div>
)
}
do it like this:
const handleButtonClick = () => {
axios.get(baseURL)
.then((res)=> {
setRandomQuote(res.data);
});
}
// then pass it to QuoteCard
<div>
<QuoteCard
quote={randomQuote.content}
author={randomQuote.author}
handleClick={handleButtonClick}
/>
</div>
//then in QuoteCard
<div>
<button className="btn btn-secondary" onClick={props.handleClick}>Generate</button>
</div>
You can create a function like this:
const getQuote = () => {
axios.get(baseURL)
.then((res)=> {
setRandomQuote(res.data);
});
}
To fetch it for the first time when the ponent mounts do this:
useEffect(getQuote, [])
And then pass the function to your ponent through handleClick
prop like this:
<QuoteCard
quote={randomQuote.content}
author={randomQuote.author}
handleClick={getQuote}
/>
So your whole ponent will look like this:
import axios from "axios";
import React,{useState} from 'react';
import '../node_modules/bootstrap/dist/css/bootstrap.min.css';
export default function App(){
const [randomQuote,setRandomQuote] = useState('');
const getQuote = () => {
axios.get(baseURL)
.then((res)=> {
setRandomQuote(res.data);
});
}
React.useEffect(getQuote, []);
if (!randomQuote) return null;
return (
<div>
<QuoteCard
quote={randomQuote.content}
author={randomQuote.author}
handleClick={getQuote}
/>
</div>
)
}