Como passar adereços de componente filho para componente pai para outro componente filho no ReactJS?

julmto

Atualmente estou criando uma barra de pesquisa onde Appé o pai e Header, Homesão os filhos. Estou tentando passar a entrada de Headerpara Homevia Appmas parece que quando tento carregar {this.state.searchValue}não adianta nada.

Estou perdido de onde estou errado no meu código. Também estou usando Routepara rotear os adereços de Headerpara Home.

Aqui está o meu código:

Header.js (filho 1)

class Header extends Component {
  constructor(props) {
    super(props);
    this.state = {
      search: "",
    };
  }

  onChange = (event) => {
    this.setState({ search: event.target.value });
  };

  submitSearch = (event) => {
    event.preventDefault();
    console.log(this.state.search);
    this.props.passSearchData(this.state.search);
  };

  render() {
    return (
      <React.Fragment>
        <nav className="navbar navbar-expand-lg navbar-light bg-light">
          <form className="form-inline">
                <input
                  className="form-control mr-sm-2"
                  type="text"
                  placeholder="Search"
                  onChange={this.onChange}
                />
                <button
                  className="btn btn-danger"
                  type="submit"
                  onClick={this.submitSearch}
                >
                  Search
                </button>
              </form>
        </nav>
      </React.Fragment>
    );
  }
}

export default Header;

App.js (pai)

class App extends Component {
  constructor() {
    super();
    this.state = {
      searchValue: "",
    };
  }

  handleSearchData = (search) => {
    this.setState({ searchValue: search });
  };

  componentDidMount() {
    this.props.getItems();
  }

  render() {
    return (
      <div className="App">
        <Router>
          <Header passSearchData={this.handleSearchData} />
          <Route
            exact
            path="/"
            render={(props) => (
              <Home {...props} searchValue={this.state.searchValue} />
            )}
          />
        </Router>
        <Footer />
      </div>
    );
  }
}

Home.js

class Catalog extends Component {
  constructor(props) {
    super(props);
    this.state = {
    };
  }
render() {
return (
      <div>
        <p>{this.props.searchValue}</p>
      </div>
    );
  }
}
Kaslie

Acho que usar o contexto de reação melhor para esse problema, porque a passagem de estado entre as rotas é bastante dolorosa

Primeiro, você declara que seu próprio Provedor atua como intermediário entre os componentes. O contexto salvará todo o estado do aplicativo. e para consumir em seus componentes, basta usar useContexte passar o Contexto que você deseja usar, neste useCase, eu chamo AppContext. usando o mesmo contexto, seus componentes obtêm o mesmo estado e acionam a atualização imediatamente

A solução que ofereço é o uso de componentes funcionais. Se você estiver usando a classe Component, basta criar um componente funcional e, em seguida, passar o contexto para o componente da classe

import React, { useContext, useState } from 'react'

const AppContext = React.createContext({})

const AppProvider = props => {
  const [currentState, setCurrentState] = useState(null)
  
  const handleState = value => {
    setCurrentState(value)
  }
  
  const contextValue = { handleState, currentState }
  
  return (
    <AppContext.Provider value={contextValue}>
      {props.children}
    </AppContext.Provider>
  )
}

const Child1 = props => {
  const { handleState } = useContext(AppContext)
  
  const handleClick = e => {
    handleState(e.target.values)
  }
  
  return (
    <button onClick={handleClick}>Change State</button>
  )
}

const Child2 = props => {
  const { currentState } = useContext(AppContext)
  
  return (
    <h1>{currentState}</h1>
  )
}

const Parent = props => {
  
  return (
    <Router>
      <AppProvider>
        <Route component={Child1} />
        <Route component={Child2} />
      </AppProvider>
    </Router>
  )
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados