0
I have a component that was class-based, and I’m now passing it on to be function-based. The only problem I’m having is that, before, I used the component DidMount() to start the component with some information taken from the backend, and now, when I try to use useEffect to do this, it’s giving as Undefined. I would also like your help to know if I am doing the migration the right way, as I am a beginner in React.
Here’s my Functional Component:
import React, { useState } from 'react'
import axios from 'axios'
import './NewsData.scss'
const baseUrl = 'http://localhost:3001/news'
const NewsData = () => {
const [list, setList] = useState([])
const [order, setOrder] = useState('')
// componentDidMount() {
// axios(baseUrl).then(resp => {
// this.setState({ list: resp.data })
// })
// }
useEffect(() => {
fetch(baseUrl)
.then(resp => resp.json())
.then(data => setList({ list: data }))
})
const renderCard = () => {
return list.map((news, index) => {
return (
<div className="container" key={index}>
<div className="post">
<div className="header_post">
<img src={news.file} alt="posted-by-user" />
</div>
<div className="body_post">
<div className="post_content">
<h1>{news.title}</h1>
<p>{news.description}</p>
<div className="container_infos">
<div className="postedBy">
<span>author</span>
{news.author}
</div>
<div className="container_tags">
<span>Subject:</span>
<div className="tags">
<ul>
<li>{news.subject}</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
)
})
}
let displayOrder = renderCard()
if (order === "older-ones")
displayOrder = renderCard().sort().reverse()
const changeSelect = (e) => {
setOrder({ order: e.target.value })
}
return (
<div className="news">
<select name="order" className="order-select" onChange={(e) => changeSelect(e)}>
<option value="new-ones" defaultValue >Order by the older ones</option>
<option value="older-ones">Order by the new ones</option>
</select>
{displayOrder}
</div>
)
}
export default NewsData
And here’s my old class-based component:
import React, { Component } from 'react'
import axios from 'axios'
import './NewsData.scss'
const baseUrl = 'http://localhost:3001/news'
class NewsData extends Component {
state = { list: [], displayOrder: '' }
componentDidMount() {
axios(baseUrl).then(resp => {
this.setState({ list: resp.data })
})
}
renderCard() {
return this.state.list.map((news, index) => {
return (
<div className="container" key={index}>
<div className="post">
<div className="header_post">
<img src={news.file} alt="posted-by-user" />
</div>
<div className="body_post">
<div className="post_content">
<h1>{news.title}</h1>
<p>{news.description}</p>
<div className="container_infos">
<div className="postedBy">
<span>author</span>
{news.author}
</div>
<div className="container_tags">
<span>Subject:</span>
<div className="tags">
<ul>
<li>{news.subject}</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
)
})
}
alterarSelect(e) {
this.setState({ displayOrder: e.target.value })
}
render() {
let displayOrder = this.renderCard()
if (this.state.displayOrder === "older-ones")
displayOrder = this.renderCard().sort().reverse()
return (
<div className="news">
<select name="order" className="order-select" onChange={(e) => this.alterarSelect(e)}>
<option value="new-ones" defaultValue >Order by the older ones</option>
<option value="older-ones">Order by the new ones</option>
</select>
{displayOrder}
</div>
)
}
}
export default NewsData
Thank you for your attention and help.
Thank you for the reply :)
– PiviaN