3
respostas

problema ao declarar variável

Boa tarde pessoal, estou fazendo um projeto de CRUD usando ReactJS, porém, estou com um problema em uma variável e não estou entendendo o porque ?

Segue o código a baixo.

import React, {Component} from 'react';
import './App.css';
import { act } from 'react-dom/test-utils';
//import api from './api';

class App extends Component{

  constructor(props){
    super(props);
    this.state={
      title:'Desafio CRUD Leste Telecom',
      act: 0,
      index:'',
      datas:[]
    }
  }

  componentDidMount(){
    this.refs.name.focus();
  }

  fSubmit = (e) =>{
    e.preventDefault();
    console.log('clicou')

    let datas = this.state.datas;
    let nome = this.refs.name.value;
    let sobrenome = this.refs.sobrenome.value;
    let email = this.refs.email.value;
    let masculino = this.refs.masculino.value;
    let feminino = this.refs.feminino.value;
    let idioma = this.refs.idioma.value;
    let dataAniv = this.refs.dataAniv.value;

    if(this.state.act === 0){
      let data = {
        nome, sobrenome,email,masculino,feminino,idioma,dataAniv
      }
      datas.push(data);
    }else{
      let index = this.state.index;
      datas[index].nome = nome;
      datas[index].sobrenome = sobrenome;
      datas[index].email = email;
      datas[index].masculino = masculino;
      datas[index].feminino = feminino;
      datas[index].idioma = idioma;
      datas[index].dataAniv = dataAniv;
    }

    this.setState({
      datas: datas,
      act: 0
    });

    this.refs.myForm.reset();
    this.refs.name.focus();

  }

  fRemove = (i) =>{
    let datas = this.state.datas;
    data.splice(i,1);
    this.setState({
      datas: datas
    });

    this.refs.myForm.reset();
    this.refs.name.focus();
  }
  fEdit = (i) =>{
    let data = this.state.datas[i];
    this.refs.nome.value = data.name;
    this.refs.sobrenome.value = data.sobrenome;
    this.refs.email.value = data.email;
    this.refs.masculino.value = data.masculino;
    this.refs.feminino.value = data.feminino;
    this.refs.idioma.value = data.idioma;
    this.refs.dataAniv.value = data.dataAniv;

    this.setState({
      act:1,
      index: i
    });
  }

  render(){
    let datas = this.state.datas;
    return(
      <div className="App">

    <h2>{this.state.title}</h2>

    <form ref="myForm" className="myForm">
        <input type="text" ref="nome" placeholder="Digite seu nome" className="formField"/>
        <input type="text" ref="sobrenome" placeholder="Digite seu sobrenome" className="formField"/>
        <input type="text" ref="email" placeholder="Digite seu E-mail" className="formField"/>
        <input type="radio" value="masculino" name="gender"/> Masculino
        <input type="radio" value="feminino" name="gender"/> Feminino
        <input type="text" ref="idioma" placeholder="Digite seu idioma" className="formField"/>
        <input type="date" ref="dataAniv" placeholder="Digite a data do seu aniversario" className="formField"/>
        <button onClick={(e)=>this.fSubmit(e)} className="myButton">Enviar</button>
    </form>

    <pre>
      {datas.map((data, i) =>
      <li key={i} className="myList">

        {i+1}. {data.nome}, {data.sobrenome}, {data.email}, {data.masculino}, {data.feminino}, {data.idioma},{data.dataAniv}
        <button onClick={()=>this.fRemove(i)} className="myListButton">Remover</button>
        <button onClick={()=>this.fEdit(i)} className="myListButton">Editar</button>


      </li>
      )}
    </pre>

      </div>
    );
  }

}

export default App;

O problema que está sendo apresentado e este;

./src/App.js Line 63:5: 'data' is not defined no-undef

Search for the keywords to learn more about each error.

3 respostas
    let datas = this.state.datas;
    data.splice(i,1);

Essa "data" do splice não está declarada.

Tem uma "data" declarada anteriormente, mas morre no escopo/contexto em que foi criada (chave do if):


    if(this.state.act === 0){
      let data = {
        nome, sobrenome,email,masculino,feminino,idioma,dataAniv
      }
      datas.push(data);
    }

https://imasters.com.br/desenvolvimento/escopos-em-javascript

Olá Cristiano, bom dia ! Obrigado pela a ajuda, mas queria tirar outra dúvida, nesse caso aonde eu teria que declarar a nova variável ? Pois após o render() já tem uma variável declarada (acho eu) let data = this.state.datas. Seria possivel eu criar essa variável como global ?

Renato,

No render você tem "datas":

  render(){
    let datas = this.state.datas;

Já no fEdit você tem "data":

  fEdit = (i) =>{
    let data = this.state.datas[i];

Sugiro que revise o código para determinar onde é "data" e onde é "datas".

Comece pelo lugar que está dando erro. Aqui era para ser data.splice mesmo ou datas.splice?

  fRemove = (i) =>{
    let datas = this.state.datas;
    data.splice(i,1);
    this.setState({
      datas: datas
    });

Se ainda precisar declarar variáveis fora do contexto aqui você tem um bom material sobre declarações de variáveis e uso de "var" e "let":

https://www.it-swarm.dev/pt/javascript/qual-e-diferenca-entre-usar-let-e-var-para-declarar-uma-variavel-em-javascript/957923539/

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software