Estou com um problema com o meu comboBox Dinamico em React.js.
Minha tela de CRUD está quase completa, consigo cadastrar dados no banco, visualizar os dados cadastrados, excluir, mostrar os dados em uma tabela, e consigo editar, porém na minha tela de edição, não consigo trazer os valores já cadastrados no meu comboBox:
Segue o código:
import React, { Component } from 'react';
class Select extends Component {
render() {
return (
<div className="form-row">
<label className="labelCombo">{this.props.nome}</label>
<select id={this.props.idSelect} className="form-control" onChange={this.props.onChange}
value={this.props.selectedValue} >
<option >Selecione</option> {
this.props.dados.map(
row => <option value={row._id} key={row._id}>{row.valor}</option>
)
}
</select>
</div>
);
}
}
export default Select;
ComboBox:
export default class ComboBoxEndereco extends Component {
constructor(props) {
super(props);
this.state = ({
option: []
});
Api.ListarEndereco()
.then((list) => {
this.setState({
option: list
});
})
.catch((err) => { console.log(err) }
);
}
render() {
return (
<div >
<Select dados={this.state.option} nome="Endereço" idSelect="endereco"
onChange={this.props.onChange} selectedValue={this.props.selectedValue}
/>
</div>
);
}
}
Classe Edit:
export default class Edit extends Component {
constructor(props) {
super(props);
this.state = {
_id_endereco: this.props._id_endereco,
endereco: this.props.endereco,
_id_departamento: this.props._id_departamento,
departamento: this.props.departamento,
_id_categoria: this.props._id_categoria,
categoria: this.props.categoria,
usuario: this.props.usuario,
host: this.props.host,
marca: this.props.marca,
service_tag: this.props.service_tag,
processador: this.props.processador,
hard_disk: this.props.hard_disk,
so: this.props.so,
so_versao: this.props.so_versao,
qtd_monitores: this.props.qtd_monitores,
fim_garantia: this.props.fim_garantia,
memoria: this.props.memoria,
mac_address: this.props.mac_address,
arquitetura: this.props.arquitetura,
service_pack: this.props.service_pack,
ip: this.props.ip,
senha_bios: this.props.senha_bios,
softwares: this.props.softwares,
valor: this.props.valor,
item: []
}
console.log("Params => " + this.props.arquitetura);
}
componentDidMount() {
this.exibirDados();
}
onChangeCombo = (e) => {
e.preventDefault();
//this.setState({ [e.target.id]: e.target.value });
var index = e.nativeEvent.target.selectedIndex;
if (e.target.id === "endereco") {
this.setState({ "_id_endereco": e.target.value,
"endereco": e.nativeEvent.target[index].text });
}
if (e.target.id === "departamento") {
this.setState({ "_id_departamento": e.target.value,
"departamento": e.nativeEvent.target[index].text });
}
if (e.target.id === "categoria") {
this.setState({ "_id_categoria": e.target.value ,
"categoria": e.nativeEvent.target[index].text });
}
}
onChange = (e) => {
e.preventDefault();
this.setState({ [e.target.id]: e.target.value });
}
onSubmit = (e) => {
e.preventDefault();
const { _id_endereco, endereco, _id_departamento, departamento,
_id_categoria, categoria, usuario, host, marca, service_tag, processador, hard_disk,
so, so_versao, qtd_monitores, fim_garantia, memoria, mac_address, arquitetura,
service_pack, ip, senha_bios, softwares } = this.state;
let obj = {
"enderecos": {
"_id": _id_endereco,
"endereco": endereco
},
"departamentos": {
"_id": _id_departamento,
"departamento": departamento
},
"usuario": usuario,
"host": host,
"marca": marca,
"service_tag": service_tag,
"processador": processador,
"categorias": {
"_id": _id_categoria,
"categoria": categoria
},
"hard_disk": hard_disk,
"so": so,
"so_versao": so_versao,
"qtd_monitores": qtd_monitores,
"fim_garantia": fim_garantia,
"memoria": memoria,
"mac_address": mac_address,
"arquitetura": arquitetura,
"service_pack": service_pack,
"ip": ip,
"senha_bios": senha_bios,
"softwares": softwares,
"valor_processador": 8,
"valor_memoria": 9,
"valor_hd": 5
}
axios.put(url + this.props.match.params.id, obj)
.then(res => console.log(res.data));
this.setState({
_id_endereco: '',
endereco: '',
_id_departamento: '',
departamento: '',
_id_categoria: '',
categoria: '',
usuario: '',
host: '',
marca: '',
service_tag: '',
processador: '',
hard_disk: '',
so: '',
so_versao: '',
qtd_monitores: '',
fim_garantia: '',
memoria: '',
mac_address: '',
arquitetura: '',
service_pack: '',
ip: '',
senha_bios: '',
softwares: ''
})
this.props.history.push('/index');
window.location.reload();
}
exibirDados() {
axios.get(url + this.props.match.params.id)
.then(response => {
this.setState({ item: response.data });
console.log(response.data)
})
.catch(() => { console.log('Erro ao recuperar os dados'); });
}
render() {
return (
<div className="container" style={{ marginTop: 30 }}>
<h1 align="center">Editar</h1>
{this.state.item.map((item, _id) => {
return (
<form id="formulario" onSubmit={this.onSubmit} key={item._id} >
<hr /><br />
<div className="row">
<ComboBoxEndereco onChange={this.onChangeCombo} selectedValue={item.enderecos._id} />
<ComboBoxDepartamento onChange={this.onChangeCombo} selectedValue={item.departamentos._id} />
<ComboBoxCategoria onChange={this.onChangeCombo} selectedValue={item.categorias._id} />
<br /> <br /> <br />
<Input divClass="form-row" id="usuario" labelClass="labelUsuario"
label="Usuário" onChange={this.onChange} value={item.usuario} />
<Input divClass="form-group" id="host"
label="Host" onChange={this.onChange} value={item.host} />
<Input divClass="form-group" id="marca"
label="Marca" onChange={this.onChange} value={item.marca} />
<Input divClass="form-group" id="service_tag"
label="Service Tag" onChange={this.onChange} value={item.service_tag} />
<Input divClass="form-group" id="processador"
label="Processador" onChange={this.onChange} value={item.processador} />
<Input divClass="form-group" id="hard_disk" label="Hard disk"
onChange={this.onChange} value={item.hard_disk} />
<Input divClass="form-group" id="so"
label="S.O" onChange={this.onChange} value={item.so} />
<Input divClass="form-group" id="so_versao" label="Versão"
onChange={this.onChange} value={item.so_versao} />
<InputFormatado divClass="form-group" id="qtd_monitores"
label="Monitor" onChange={this.onChange} format="#" value={item.qtd_monitores} />
<InputFormatado divClass="form-group" id="fim_garantia" label="Garantia"
onChange={this.onChange} format="##/##/####" value={item.fim_garantia} />
<Input divClass="form-group" id="memoria"
label="Memória" onChange={this.onChange} value={item.memoria} />
<Input divClass="form-group" id="mac_address"
label="Mac Address" onChange={this.onChange} value={item.mac_address} />
<InputFormatado divClass="form-group" id="arquitetura"
label="arquitetura" onChange={this.onChange} format="##" value={item.arquitetura} />
<Input divClass="form-group" id="service_pack"
label="Service Pack" onChange={this.onChange} value={item.service_pack} />
<Input divClass="form-group" id="ip"
label="IP" onChange={this.onChange} value={item.ip} />
<Input divClass="form-group" id="senha_bios" label="Bios"
onChange={this.onChange} value={item.senha_bios} />
</div>
<div className="form-group">
<Textarea labelClass="software-class" nomeLabel="Softwares" TextClass="form-control"
id="softwares" onChange={this.onChange}
value={item.softwares} />
<br />
<Botao tipo="btn btn-secondary" texto="Atualizar" id="botao-enviar" /><br></br>
</div>
</form>
)
}
)}
</div>
)
}
}
Sempre que eu vou editar algo, mesmo que seja só um campo do meu input, o meu combox é enviado com o valor ‘vazio’, e tenho que voltar na tela de edição para selecionar o meu ComboBox novamente porém ele não permite que eu faça um onchange nele.
Preciso saber como faço para pegar o valor desse ComboBox e realizar o onchange correto nele.