1
resposta

[Dúvida] Dificuldade em adicionar um estado dentro de um context

A ideia é de colocar o estado do Input.js dentro do contexto para eu conseguir ter um componente menos acoplado para quando eu fizer manutenção, porém eu não consigo obter os valores dele utilizando o useContext em Footer.js, alguém sabe me dizer o porque?

Obs: Eu abstrai o máximo de código possível do original para deixar apenas o necessário para o entendimento do meu problema.

Footer.js

export default function Footer() {
  const { input } = useContext(ContextInput);

  function onSubmit(event) {
    event.preventDefault();
    // Lógica de guardar mensagem no backend
    // Utilizarei a variável input (contexto) aqui dentro
  }

  return (
    <InputProvider >
        <div className="footer_container">
          <div className="footer_Logo">
            <Link to='/' >Logo </Link>
          </div>
          <form className="footer_form"
            onSubmit={(event) => onSubmit(event)} >
            <Input
              type='text'
              placeholder='Nome' />
            <ButtonAzul text='Enviar mensagem' />
          </form>
        </div>
    </InputProvider>
  )
}

ContextInput.js

export const ContextInput = createContext({});

export function InputProvider({ children }) {
  const [input, setInput] = useState({
    'text': '',
    'email': '',
    'password': '',
    'number': 0
  });
  return (
    <ContextInput.Provider value={{ input, setInput }}>
        { children }
    </ContextInput.Provider>
  )
}

Input.js

export default function Input({ type, placeholder }) {
  const { input, setInput } = useContext(ContextInput);

  function inputHandler(event) {
    const inputValue = event.target.value;

    if (type) {
      // Lógica de enviar as informações via setInput, exemplo:
      setInput({ ...input, 'text': inputValue });
    }
  }

  return (
    <input className="form_input"
      type={type}
      placeholder={placeholder}
      onChange={(event) => inputHandler(event)}
    />
  )
}
1 resposta

Olá Allan, tudo bem?

Entendi que você está com dificuldades em adicionar o estado do Input.js dentro do contexto e obter os valores dele usando useContext em Footer.js.

Pelo código que você compartilhou, notei que você está importando o componente InputProvider dentro do componente Footer, o que pode estar gerando um conflito. Para que você consiga acessar o estado do Input.js em Footer.js utilizando useContext, é necessário que o InputProvider seja importado em um componente pai que englobe ambos, Input e Footer.

Uma opção é criar um novo componente pai que englobe ambos, como no exemplo abaixo:

import { InputProvider } from './ContextInput';
import Input from './Input';
import Footer from './Footer';

export default function App() {
  return (
    <InputProvider>
      <div className="App">
        <Input />
        <Footer />
      </div>
    </InputProvider>
  );
}

Dessa forma, o InputProvider será o componente pai tanto de Input quanto de Footer, permitindo que ambos tenham acesso ao estado compartilhado.

Outra coisa que notei é que você está atualizando o estado do input utilizando apenas uma das chaves do objeto:

setInput({ ...input, 'text': inputValue });

Isso sobrescreve as outras chaves e pode gerar problemas no futuro. Para atualizar o estado de forma correta, é necessário utilizar o spread operator para manter as chaves existentes e atualizar apenas a que você precisa:

setInput({ ...input, text: inputValue });

Com essas alterações, você deve conseguir acessar o estado do Input.js em Footer.js utilizando useContext.

Espero que tenha te ajudado! Bons estudos!