I created a custom <select>
component in a separate react file dropdown.js
and it should have <option>
children, each with values and labels based on data fetched from the server. Each <option>
should contain name of US States as labels and their respective codes as values for the value
and key
attributes.
E.g.
<select id="voter_state" aria-label="Choose State">
<option defaultValue>Choose State</option>
<option key="6" value=6>California</option>
<option key="36" value=36>New York</option>
...
</select>
The App.js
file should render the select component after it successfully fetched needed data from the server (via axios) with the following custom props
: id
, label
, options
. The first two props are successfully rendered while data for options
is not displaying.
The needed elements are not showing
Server-side requests successfully responds with the needed data and can be displayed via console.log() in the App.js
file. I also logged the updated state allStates
after assigning new values from the GET request method getAll()
of the data service module StateDataService
. Here is my App.js
code
import { Component } from 'react'
import ReactDOM from 'react-dom'
import 'bootstrap/dist/css/bootstrap.min.css'
import StateDataService from './services/states.service'
import Dropdown from './components/dropdown'
function extractValues(o, i) {
let a = Object.values(o)
return a[i]
}
class App extends Component {
constructor(props) {
super(props)
this.state = {
allStates: [],
}
}
componentDidMount() {
var options = []
StateDataService
.getAll()
.then(res => {
res.data.forEach((datum) => {
options.push({
value: extractValues(datum, 0),
label: extractValues(datum, 1)
})
})
})
.then(() => {
this.setState(() => {
return {
allStates: options
}
})
})
.then(() => {
ReactDOM.render(
<Dropdown choices={this.state.allStates} id="voter_state" label="Choose State" />,
document.getElementById("rut")
)
})
.catch(err => {
console.log(err)
})
}
render() {
return (
<div>
<div id="rut"></div>
</div>
)
}
}
export default App
Here is the code for the dropdown.js
component
import 'bootstrap/dist/css/bootstrap.min.css'
function Dropdown(props) {
const choices = props.choices
const dropdownItems = choices.forEach((choice) =>
<option key={choice.value.toString()} value={choice.value}>{choice.value}</option>
)
return (
<select className={props.id} aria-label={props.label}>
<option defaultValue>{props.label}</option>
{dropdownItems}
</select>
)
}
export default Dropdown