Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Erro no select

O valor do autor. nome no select está em branco

var autores = this.props.autores.map(function(autor){

      return <option key={autor.id} value={autor.id}>{autor.nome}</option>;
    });


<select value={ this.state.autorId } name="autorId" onChange={ this.setAutorId }>
             <option value="">Selecione</option>
              {autores}
           </select>
import $ from "jquery";
import InputCustomizado from "./componentes/InputCustomizado"
import React from 'react';
import PubSub from 'pubsub-js';
import TratadorErros from './TratadorErros'

class FormularioLivro extends React.Component {
  constructor(props) {
    super(props);
    this.state = {titulo: '', preco: '', autorId: ''};
    this.setTitulo = this.setTitulo.bind(this);
    this.setPreco = this.setPreco.bind(this);
    this.setAutorId = this.setAutorId.bind(this);   
    this.handleLivroSubmit = this.handleLivroSubmit.bind(this);

  }

  setTitulo(e) {
    this.setState({titulo: e.target.value});
  }

  setPreco(e) {
    this.setState({preco: e.target.value});
  }

  setAutorId(e) {
    this.setState({autorId: e.target.value});
  }


  handleLivroSubmit(e) {
    e.preventDefault();
    var titulo = this.state.titulo.trim();
    var preco = this.state.preco.trim();
    var autorId = this.state.autorId;

    $.ajax({
      url: 'http://cdc-react.herokuapp.com/api/livros',
      contentType: 'application/json',
      dataType: 'json',
      type: 'POST',
      data: JSON.stringify({titulo:titulo,preco:preco,autorId:autorId}),
      success: function(novaListagem) {
          PubSub.publish( 'atualiza-lista-livros',novaListagem);            
          this.setState({titulo:'',preco:'',autorId:''});
          console.log("sucesso!");
      },
      error: function(resposta){
        if(resposta.status === 400){
          new TratadorErros().publicaErros(resposta.responseJSON);
            console.log("erro");
        }
      },
      beforeSend: function(){
        PubSub.publish("limpa-erros",{});
      }            
    });  

    this.setState({titulo: '', preco: '', autorId: ''});
  }

  render() {

    var autores = this.props.autores.map(function(autor){

      return <option key={autor.id} value={autor.id}>{autor.nome}</option>;
    });



    return (
      <div className="autorForm">
        <form className="pure-form pure-form-aligned" onSubmit={this.handleLivroSubmit}>
          <InputCustomizado id="titulo" name="titulo" label="Titulo: " type="text" value={this.state.titulo} placeholder="Titulo do livro" onChange={this.setTitulo} />
          <InputCustomizado id="preco" name="preco" label="Preco: " type="decimal" value={this.state.preco} placeholder="Preço do livro" onChange={this.setPreco} />
          <div className="pure-controls">
            <select value={ this.state.autorId } name="autorId" onChange={ this.setAutorId }>
             <option value="">Selecione</option>
              {autores}
           </select>
          </div>
          <div className="pure-control-group">                                  
            <label></label> 
            <button type="submit" className="pure-button pure-button-primary">Gravar</button>                                    
          </div>          
        </form>             
      </div>
    );
  }
} 

class TabelaLivros extends React.Component {

  render() {
    var livros = this.props.lista.map(function(livro){
      return(
          <tr key={livro.titulo}>
            <td>{livro.titulo}</td>
            <td>{livro.autor.nome}</td>
            <td>{livro.preco}</td>
          </tr>
        );
      });


    return(
      <table className="pure-table">
        <thead>
          <tr>
            <th>Titulo</th>
            <th>Autor</th>
            <th>Preco</th>
          </tr>
        </thead>
        <tbody>
          {livros}
        </tbody>
      </table>
    );
  }
}

E o servidor está ficando fora do dar direto também.

3 respostas

Boa tarde, Caio! Como vai?

Vc está utilizando um servidor local? Se sim, antes de ficar fora, ele emite algum log de erro? Em caso positivo, vc poderia colar o log completo aqui para eu dar uma olhada?

Outra coisa, vc já deu uma conferida no console do navegador para verificar se algum log de erro do front-end é emitido? Se houver um log lá, vc também poderia colá-lo aqui, por favor?

Eu estou usando utilizando o servidor externo, por que a versão do java que eu tenho e a 12, e não consigo rodar o servidor local. E esta dando um erro sim, e fica repetindo varias vezes.

Warning: Encountered two children with the same key, `Os segredos da mente milionária`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted — the behavior is unsupported and could change in a future version.
    in tbody (at Livro.js:115)
    in table (at Livro.js:107)
    in TabelaLivros (at Livro.js:161)
    in div (at Livro.js:159)
    in div (at Livro.js:158)
    in div (at Livro.js:154)
    in LivroBox (created by Route)
    in Route (at src/index.js:19)
    in Switch (at src/index.js:16)
    in div (at App.js:35)
    in div (at App.js:14)
    in App (at src/index.js:15)
    in Router (created by BrowserRouter)
    in BrowserRouter (at src/index.js:14)

E tem outro erro que so repete 2 vezes logo no começo

Warning: Please use `require("history").createBrowserHistory` instead of `require("history/createBrowserHistory")`. Support for the latter will be removed in the next major release.

Fora isso so tem uns 2 avisos

primeiro

./src/App.js
Line 23:  The href attribute requires a valid value to be accessible. Provide a valid, navigable address as the href value. If you cannot provide a valid href, but still need the element to resemble a link, use a button and change it with appropriate styles. Learn more: https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/anchor-is-valid.md  jsx-a11y/anchor-is-valid

segundo

./src/index.js
  Line 9:  'Link' is defined but never used  no-unused-vars
solução!

eu fiz uma breve alteração na variável autores

var autores = this.props.autores.map(function(autor){                                     
      return <option key={autor.id} value={autor.id}>{autor.autor.nome}</option>;
    });

E o nome dos autores apareceram no seletor. Apesar de todos erros do console persistirem.