5
respostas

Como atualizar o estado do GRUD?

Como faço para atualizar o estado ?

Como faço para clicar em cadastrar e atualizar a tela na hora, e quando clicar no X ele deletar e também atualizar na hora a pagina. Não estou conseguindo, tenho que atualizar a pagina manual.

Pessoal a API é um arquivo json e foi usado o json-server para simular. O exercício também precisa usar TypeScript.

segue o código.

import React, { useEffect, useRef, useState } from 'react';
import './App.css';
import axios from 'axios'

function App() {

  const [usuarios, setUsuarios] = useState<any>([])

  const inputNome = useRef<HTMLInputElement>(null)
  const inputIdade = useRef<HTMLInputElement>(null)
  const inputEmpresa = useRef<HTMLInputElement>(null)
  const inputTelefone = useRef<HTMLInputElement>(null)

  const mostraUsuarios = () => {
    axios.get("http://localhost:4000/usuarios")
      .then(resposta => setUsuarios(resposta.data))
  }

  const enviarCadastro = () => {

    const requisicao = {
      name: inputNome.current?.value,
      age: inputIdade.current?.value,
      company: inputEmpresa.current?.value,
      phone: inputTelefone.current?.value
    }

    axios.post("http://localhost:4000/usuarios", requisicao)
    mostraUsuarios()
  }

  useEffect(() => {
    mostraUsuarios()
  }, [])

  const deletarUsuario = (id: any) => {
    axios.delete(`http://localhost:4000/usuarios/${id}`)
    mostraUsuarios()
  }

  return (
    <div className="App">
      <input type="text" placeholder="Nome" ref={inputNome} />
      <input type="text" placeholder="Idade" ref={inputIdade} />
      <input type="text" placeholder="Empresa" ref={inputEmpresa} />
      <input type="text" placeholder="Telefone" ref={inputTelefone} />
      <button onClick={enviarCadastro}>Cadastrar</button>

      <br/>

      <ul>

        { usuarios !== null && 
          usuarios.map((item: any) => (
            <li key={item.id}>{item.name}  <button onClick={() => deletarUsuario(item.id)}>X</button></li>
          ))
        }
      </ul>
    </div>
  );
}

export default App;
5 respostas

Fala ai Daniel, tudo bem? Nesse caso você precisa ouvir as respostas da API com sucesso para ambos os casos e dentro de cada resposta você atualiza o estado interno do componente, seja para remover ou adicionar.

axios.post("http://localhost:4000/usuarios", requisicao)
    .then(resposta => {
        setUsuarios(usuariosAntigos => [...usuariosAntigos, resposta.body])
    })
axios.delete(`http://localhost:4000/usuarios/${id}`)    
    .then(() => {
        setUsuarios(usuariosAntigos => usuariosAntigos.filter(usuario => usuario.id !== id)
    })

Seria algo mais ou menos assim, no caso do cadastro a API deve retornar como resposta o novo usuário cadastrado.

Espero ter ajudado.

Obrigado Matheus.

Eu agora estou com um duvida em um projeto com Redux, que você faz a tela do Instagram, porem eu tentei na hora de fazer o pach atualizar o estado global para renderizar a pagina e mostrar a contagem do like e a postagem nova quando for feita. Porem não estou conseguindo e também não sei como postar o código aqui porque é enorme, cheio de componentes além da parte de Redux. Mas precisava de uma ajuda porque não estou conseguindo.

Fala Daniel, vamos la:

Precisa ver o que você está fazendo, nesse caso, quando o patch ter sucesso, ou seja, cair no .then você precisa disparar a ação que será responsável por ouvir e atualizar a quantidade de likes de uma foto.

Isso pode ser feito no reducer que gerencia a lista de fotos.

Você vai precisar encontrar a foto no array, incrementar a contagem de like e depois substituir noarray.

Espero ter ajudado.

Obrigado Matheus.

Você conseguiria me ajudar nesse outro problema:

  • Eu quero fazer uma aplicação que tem dois produtos. Vamos supor comprar suco e refrigerante.
  • tanto no suco como no refrigerante tem dois botões + e - para adicionar a quantidade de cada um.
  • Porem no topo do site tem o carrinho geral que mostra o total.
  • O estado que fiz mostra a mesma quantidade para todos os produtos e geral.
  • Tentei criar um estado total para mostrar a quantidade geral, separada da quantidade de cada produto, como no código abaixo:

Aqui é o código que estou fazendo e gerando o erro

const initialStatePost: ItemCarrinho  = {
  carrinho: 0,
 total: 0
}

Porem ele começa dar erro no arquivo STORE.TS

  • ERRO: "No overload matches this call. Overload 1 of 2"

Eu acredito que deve ser erro do TypeScript, porque o projeto exige.

Segue um exemplo mínimo do código :

REDUCE.TS

import {ItemCarrinho, TypesCarrinho} from './types'

const initialStatePost: ItemCarrinho  = {
  carrinho: 0
}

function reducerCarrinho(state = initialStatePost, action: any) {

    switch(action.type) {
      case TypesCarrinho.ADD_CARRINHO:
        return {
          carrinho: state.carrinho + 1
        }

      case TypesCarrinho.DECREASE_CARRINHO:
        return{
          carrinho: state.carrinho - 1
        }

      default: 
        return state
    }
}

export default reducerCarrinho

STORE.TS

import { createStore } from 'redux'
import { composeWithDevTools } from 'redux-devtools-extension'

import reducerCarrinho from './ducks/carrinho/reduce'


const store = createStore(reducerCarrinho, composeWithDevTools())


export { store }

TYPES.TS

export enum TypesCarrinho {
  ADD_CARRINHO = 'ADD_CARRINHO',
  DECREASE_CARRINHO = 'DECREASE_CARRINHO',
}

export interface ItemCarrinho{
  carrinho: number 
}

ACTION.TS

import { action } from 'typesafe-actions'
import { TypesCarrinho } from '../../ducks/carrinho/types'

export const soma = () => action(TypesCarrinho.ADD_CARRINHO)

export const subtracao = () => action(TypesCarrinho.DECREASE_CARRINHO)

Segue aqui o erro completo:

No overload matches this call. Overload 1 of 2, '(reducer: Reducer<ItemCarrinho, any>, enhancer?: StoreEnhancer<unknown, unknown> | undefined): Store<ItemCarrinho, any>', gave the following error. Argument of type '(state: ItemCarrinho | undefined, action: any) => ItemCarrinho | { carrinho: number; }' is not assignable to parameter of type 'Reducer<ItemCarrinho, any>'. Type 'ItemCarrinho | { carrinho: number; }' is not assignable to type 'ItemCarrinho'. Property 'totalc' is missing in type '{ carrinho: number; }' but required in type 'ItemCarrinho'. Overload 2 of 2, '(reducer: Reducer<ItemCarrinho, any>, preloadedState?: { carrinho: number;

Fala Daniel, acho que na sua interfaceItemCarrinhofaltou informar também ototal: number`.

Espero ter ajudado.