Как я могу передать `username` в качестве подпорки от функционального родителя без состояния другому функциональному ребенку без состояния другому ребенку с состоянием? - PullRequest
0 голосов
/ 05 февраля 2019

Как я могу передать username как реквизит от функционального родителя без состояния другому ребенку без состояния другому ребенку с состоянием?

В настоящее время он показывает undefined как у Первого ребенка, так и у Второго ребенка.

Родительский компонент:

  let userName = 'Some UserName';

  export default function App() {
   return (
    <Router>
  <div>
    <AuthButton />
    <Route path="/" render={() => (
      <Redirect to="/auth" />
    )} />
    <Route path="/auth" component={Login} />
    <PrivateRoute
      path='/home'
      component={Home}
      render={(props) => <Home userName={props.userName} />}
    />
  </div>
</Router>
 )
}  

Первый дочерний компонент:

 function Home(props) {

let userName = props.userName

console.log(userName);   // SHOWS UNDEFINED!

return (
    <Router>
        <div>
            <Header />
            <Switch>
                <div className="row cont">
                        <div className="card">
                            <div className="card-header">
                                Messages
                        </div>
                            <div className="card-body">
                                <MessengerApp userName={props.userName} />
                            </div>
                        </div>
                </div>
            </Switch>
            <Footer />
        </div>
    </Router >


   );
 }

Второй дочерний компонент:

class MessengerApp extends React.Component {
 constructor(props) {
    super(props);
   // set the initial state of the application
    this.state = { username: this.props.userName };

 console.log(this.state.username)  // SHOWS UNDEFINED!  

 }

 render(){
     // JSX
  }

Я хочу, чтобы все компоненты были зарегистрированыимя пользователя как Some UserName

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Я действительно выяснил причину, по которой он не работал.Из-за того, что PrivateRoute был настроенным компонентом Маршрута, он не распознал render как метод для передачи props.Мне пришлось переместить render props к фактическому тегу Route внутри этой функции PrivateRoute.Пожалуйста, смотрите ниже:

let userName = 'Some UserName';


  const PrivateRoute = ({ component: Component, ...rest }) => (
      <Route {...rest} render={(props) => (
       authFunc.isAuthenticated === true
          ? <Component {...props} userName={userName}/>
         : <Redirect to={{
           pathname: '/auth',
           state: { from: props.location }
          }} />
      )} />
     )

export default function App(props) {
   return (
    <Router>
        <div>
            <AuthButton />
            <Route path="/" render={() => (
              <Redirect to="/auth" />
            )} />
            <Route path="/auth" component={Login} />
            <PrivateRoute
              path='/home'
              component={Home}
            />
          </div>
    </Router>
 )
}
0 голосов
/ 05 февраля 2019

Вы не правильно передаете имя пользователя проповеди в Home из компонента App.Функция обратного вызова рендеринга для Route предоставляет реквизиты маршрутизатора, а не реквизиты компонента

let userName = 'Some UserName';

export default function App(props) {
   return (
    <Router>
        <div>
            <AuthButton />
            <Route path="/" render={() => (
              <Redirect to="/auth" />
            )} />
            <Route path="/auth" component={Login} />
            <PrivateRoute
              path='/home'
              component={Home}
              render={(routerProps) => <Home {...routerProps} userName={userName} />}
            />
          </div>
    </Router>
 )
}  
...