在 ReactJS 中,如何在另一个组件中渲染一个组件?

IT技术 javascript reactjs
2021-05-04 11:12:18

我正在编写一个 ReactJS 应用程序,并希望显示一个登录页面,该页面显示登录表单或注册表单,具体取决于遵循的链接。

到目前为止,我的 App 组件如下所示:

const App = () => (
  <Router>
    <div>
      <Route path={ROUTES.LANDING}  render={(props) => <LandingPage {...props} subPage={SignInPage} />}/>
      <Route path={ROUTES.SIGNIN}   render={(props) => <LandingPage {...props} subPage={SignInPage} />}/>
      <Route path={ROUTES.REGISTER} render={(props) => <LandingPage {...props} subPage={RegisterPage} />}/>
      <Route render={(props) => <LandingPage {...props} subPage={SignInPage} />}/>
    </div>
  </Router>
);

现在,我不确定如何让实际的子页面显示在登录页面中。

在我的登陆页面组件中,我有这个:

class LandingPage extends Component {
  constructor(props) {
    super(props);

    this.state = {props}

  }

  render() {

    return (
      <div className="wrapper">
        <div>{this.state.subPage}</div>
      </div>
    );
  }
}

export default LandingPage;

但是当我转到“登录页面/登录”时它没有显示任何内容。我可以在控制台中看到 this.state.subPage 包含正确的组件,当我更改 Route 以直接显示 SignInPage 时,效果很好,因此 SignInPage 本身肯定可以正常工作。

我的 SignInPage 组件包含:

const SignInPage = () => (
  <div>
    <p>Sign In</p>
    <SignInForm />
  </div>
);

class SignInFormBase extends Component {
  constructor(props) {
    super(props);

  }

  onSubmit = event => {
    // This will handle form submission
  };

  render() {
    return (
      <form onSubmit={this.onSubmit}>
        <input name="email" placeholder="Email Address" />
        <input name="password" type="password" placeholder="Password" />
        <button type="submit">Sign In</button>
      </form>
    );
  }
}
const SignInForm = compose(
  withRouter,
  withFirebase,
)(SignInFormBase);

export default SignInPage;

export { SignInForm };

我猜可能问题在于 SignInForm 是一个组件但 SignInPage 不是?但是我是 React 的新手,所以我不知道如何重新配置​​它们!

接下来我可以尝试什么?

3个回答

由于您将 传递subPageLandingPageas props,因此您可以从 props 中获取该组件并像下面这样渲染它

class LandingPage extends Component {
  constructor(props) {
    super(props);

  }

  render() {
    const SubPage = this.props.subPage;
    return (
      <div className="wrapper">
        <div><SubPage /></div>
      </div>
    );
  }
}

export default LandingPage;

注意:您不需要将props复制到状态

在 App 组件中:

<Route render={(props) => <LandingPage {...props}><SignInPage /></LandingPage>}/>

在登陆页面组件中:

<div className="wrapper">
 <div>{this.props.children}</div>
</div>

您可以将组件嵌套在组件中,而不是显式地将组件传递props组件LandingPageLandingPage

<LandingPage {...props}>
   <SignInPage />
</LandingPage>

SignIn组件将LandingPage作为props传递给组件,并且可以使用props.children

return (
  <div className="wrapper">
    {this.props.children}
  </div>
);

这种方法的一个优点是您可以在组件内嵌套尽可能多的组件,LandingPage并且它们都将LandingPage使用this.props.children

更改后,您的路线将如下所示

<Route path={ROUTES.LANDING} render={(props) => <LandingPage {...props}> <SignInPage/> </LandingPage> }/>
<Route path={ROUTES.SIGNIN} render={(props) => <LandingPage {...props}> <SignInPage/> </LandingPage>}/>
<Route path={ROUTES.REGISTER} render={(props) => <LandingPage {...props}> <RegisterPage/> </LandingPage>}/>
<Route render={(props) => <LandingPage {...props}> <SignInPage/> </LandingPage>}/>