2
respostas

[Desafio] Exercício de react : autores e livros

Como foi pedido na aula de react, estava tentando resolver sozinho o problema de criar a tabela de autores e livro para serem renderizados dinamicamente em uma roda específica que lista-os.

A classe autores:

import React, { Fragment, Component } from 'react';
import Header from './Header';
import TableInfo from './TableInfo';

class Autores extends Component {

  state = {
    autores: [
      {
        nome: 'Paulo',
        livro: 'React',
        preco: '1000'
      },
      {
        nome: 'Daniel',
        livro: 'Java',
        preco: '99'
      },
      {
        nome: 'Marcos',
        livro: 'Design',
        preco: '150'
      },
      {
        nome: 'Bruno',
        livro: 'DevOps',
        preco: '100'
      },
      {
        nome: 'Teste',
        livro: 'Full Stack',
        preco: '1000'
      }
    ]
  }

  render() {
    return (
      <Fragment>
        <Header />
        <h1>Lista de Autores</h1>
        <TableInfo autores={this.state.autores}/>
      </Fragment>
    );
  }
}
export default Autores;

TableInfo:

import React from 'react';

const TableInfo = props => {

    let linhas = props.infos.map((elem) => 
        <tr key={elem.id}>
            {props.nome.map((autor) => {
                <td key={`${elem.id} ${elem[autor]}`}>{elem[autor]}</td>
            })}
        </tr>
    );
    return(
        <tbody>
            {linhas}
        </tbody>
    );
}

export default TableInfo;

A ideia foi semelhante à resolução do professor. Criar um render genérico, já que autores e livros são bem semelhantes. Porém recebo este erro:

" Expected an assignment or function call and instead saw an expression"

Gostaria de saber o que foi feito de errado e uma solução que desenvolva a partir dessa lógica. (isso se a lógica estiver certa)

2 respostas

Boa tarde, Antonio! Como vai?

O que eu percebi foi que vc fez o map() a partir de uma propriedade chamada infos. Mas na utilização do componente TableInfo vc fez <TableInfo autores={this.state.autores}/> utilizando uma propriedade autores. Experimente fazer <TableInfo infos={this.state.autores}/> e veja se resolve o seu problema.

Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!

Me tire das trevas Prof Gabriel kkkk

fiz a alteração que falou

return (
      <Fragment>
        <Header />
        <h1>Autores</h1>
        <TableInfo infos={this.state.autores}/>
      </Fragment>
    );
const TableInfo = props => {
    let linhas = props.infos.map((elem) => 
        <tr key={elem.id}>
            {props.nome.map((autor) => {
                <td key={`${elem.id} ${elem[autor]}`}>{elem[autor]}</td>
            })}
        </tr>
    );
    return(
        <tbody>
            {linhas}
        </tbody>
    );
}

Continuo com o mesmo problema.. estive analisando melhor depois do erro que cometi e pensei... Já que eu quero passar o nome de cada autor para a

da tabela, não seria mais fácil eu declarar ela na props por exemplo:
<TableInfo infos={this.state.autores} nomeAutor={['nome']}/>

e fazer a seguinte alteração

  let linhas = props.infos.map((elem) =>
    <tr key={elem.id}>
      {props.nomeAutor.map((autor) =>
        <td key={`${elem.id}${elem[autor]}`}>{elem[autor]}</td>)}
    </tr>);

Dessa forma conseguir fazer com que a tabela fique dinâmica, exibindo apenas o nome do autores. Usei da mesma lógica já que é genérica para a listagem de livros...

Curiosidade: Tem alguma forma de acessar o "nome" de cada autor sem precisar declarar na prop? Tipo diretamente pelo "state.autores"...