Através de um select preciso filtrar algumas informações, mas como faço para o valor da this.state.lista receber o valor da listaFiltrada? A listaFiltrada já recebe as informações necessárias conforme seleciono as opções do select.
const initialState = {
aluno: { id: 0, ra: '', nome: '', codCurso: 0 },
lista: [],
curso: { id: 0, codCurso: 0, nomeCurso: '', periodo: '' },
listaCurso: []
}
export default class CrudCarometro extends Component {
state = { ...initialState }
componentDidMount() {
axios(urlAPI).then(resp => {
this.setState({ lista: resp.data })
})
axios(urlAPICurso).then(resp => {
this.setState({ listaCurso: resp.data })
})
}
atualizaCampo(event) {
const aluno = this.state.aluno
const curso = this.state.curso
aluno.codCurso = Number(curso.codCurso)
const listaFiltrada = this.state.lista.filter(a => a.codCurso == event)
console.log(listaFiltrada)
}
renderForm() {
return (
<center>
<div className="master" id="master">
<select id="filtro" name="codCurso" onChange={e => this.atualizaCampo(e.target.value)}>
<option value="" disabled="disabled" selected="selected">Filtrar</option>
{this.state.listaCurso.map(curso => (<option key={curso.id} value={curso.codCurso}
>{curso.nomeCurso}</option>))}
</select>
{this.state.lista.map(
(aluno) =>
<div className="card" id="card">
<div className="picture" id="picture">
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/9/95/Mel_Gibson_Cannes_2016_2.jpg/330px-Mel_Gibson_Cannes_2016_2.jpg"></img>
</div>
<h2>{aluno.ra}</h2>
<h2>{aluno.nome}</h2>
<h2>{aluno.codCurso}</h2>
</div>
)}
</div>
</center>
)
}
Você pode manter sua listaFiltrada no state, assim sua função atualizaCampo sempre filtra a lista completa e atualiza o resultado na lista filtrada, e no seu render você utiliza a lista filtrada para montar os cards:
{this.state.listaFiltrada.map(
(aluno) =>
<div className="card" id="card">
<div className="picture" id="picture">
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/9/95/Mel_Gibson_Cannes_2016_2.jpg/330px-Mel_Gibson_Cannes_2016_2.jpg"></img>
</div>
<h2>{aluno.ra}</h2>
<h2>{aluno.nome}</h2>
<h2>{aluno.codCurso}</h2>
</div>
)}
Já havia tentado isso, porém ele retorna alguns erros quando entro na página carometro.
Dando esses erros, a classe inteira está assim:
import React, { Component } from "react"
import axios from "axios"
import './CrudCarometro.css'
const urlAPI = "https://localhost:7008/api/carometro"
const urlAPICurso = "https://localhost:7008/api/curso"
const initialState = {
aluno: { id: 0, ra: '', nome: '', codCurso: 0 },
lista: [],
curso: { id: 0, codCurso: 0, nomeCurso: '', periodo: '' },
listaCurso: []
}
export default class CrudCarometro extends Component {
state = { ...initialState }
componentDidMount() {
axios(urlAPI).then(resp => {
this.setState({ lista: resp.data })
})
axios(urlAPICurso).then(resp => {
this.setState({ listaCurso: resp.data })
})
}
atualizaCampo(event) {
const aluno = this.state.aluno
const curso = this.state.curso
aluno.codCurso = Number(curso.codCurso)
const listaFiltrada = this.state.lista.filter(a => a.codCurso == event)
return listaFiltrada
}
renderForm() {
return (
<center>
<div className="master" id="master">
<select id="filtro" name="codCurso" onChange={e => this.atualizaCampo(e.target.value)}>
<option value="" disabled="disabled" selected="selected">Filtrar</option>
{this.state.listaCurso.map(curso => (<option key={curso.id} value={curso.codCurso}
>{curso.nomeCurso}</option>))}
</select>
{this.state.listaFiltrada.map(
(aluno) =>
<div className="card" id="card">
<div className="picture" id="picture">
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/9/95/Mel_Gibson_Cannes_2016_2.jpg/330px-Mel_Gibson_Cannes_2016_2.jpg"></img>
</div>
<h2>{aluno.ra}</h2>
<h2>{aluno.nome}</h2>
<h2>{aluno.codCurso}</h2>
</div>
)}
</div>
</center>
)
}
render() {
return (
this.renderForm()
)
}
}
Faltou declarar a listaFiltrada no state e popular com o retorno da API, vê se assim da certo:
import React, { Component } from "react"
import axios from "axios"
import './CrudCarometro.css'
const urlAPI = "https://localhost:7008/api/carometro"
const urlAPICurso = "https://localhost:7008/api/curso"
const initialState = {
aluno: { id: 0, ra: '', nome: '', codCurso: 0 },
lista: [],
listaFiltrada: [],
curso: { id: 0, codCurso: 0, nomeCurso: '', periodo: '' },
listaCurso: []
}
export default class CrudCarometro extends Component {
state = { ...initialState }
componentDidMount() {
axios(urlAPI).then(resp => {
this.setState({ lista: resp.data, listaFiltrada: resp.data})
})
axios(urlAPICurso).then(resp => {
this.setState({ listaCurso: resp.data })
})
}
atualizaCampo(event) {
const aluno = this.state.aluno
const curso = this.state.curso
aluno.codCurso = Number(curso.codCurso)
const listaFiltrada = this.state.lista.filter(a => a.codCurso == event)
this.setState({ listaFiltrada: listaFiltrada})
}
renderForm() {
return (
<center>
<div className="master" id="master">
<select id="filtro" name="codCurso" onChange={e => this.atualizaCampo(e.target.value)}>
<option value="" disabled="disabled" selected="selected">Filtrar</option>
{this.state.listaCurso.map(curso => (<option key={curso.id} value={curso.codCurso}
>{curso.nomeCurso}</option>))}
</select>
{this.state.listaFiltrada.map(
(aluno) =>
<div className="card" id="card">
<div className="picture" id="picture">
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/9/95/Mel_Gibson_Cannes_2016_2.jpg/330px-Mel_Gibson_Cannes_2016_2.jpg"></img>
</div>
<h2>{aluno.ra}</h2>
<h2>{aluno.nome}</h2>
<h2>{aluno.codCurso}</h2>
</div>
)}
</div>
</center>
)
}
render() {
return (
this.renderForm()
)
}
}
1 curtida
Muito obrigado, funcionou!
1 curtida