代码之家  ›  专栏  ›  技术社区  ›  user3378165

用道具把零件传下去

  •  0
  • user3378165  · 技术社区  · 6 年前

    我的主要 Home 组件根据条件呈现不同的内容。

    我需要 <SearchPanel /> user 作为道具但我也需要 用户 中的数据 Layout 组件。

    用户 两倍于道具。 我怎样才能改变?

    export default class Home extends React.Component {
      render() {
        return (
          <AuthConsumer>
            {({ user }) => {
              if (!user) {
                return <ErrorPage />;
              }
              if (!user.roles.includes('Admin') && !user.roles.includes('Observer')) {
                return <Layout pageContent={<NoAccessPanel />} user={user} />;
              }
              return <Layout pageContent={<SearchPanel user={user}/>} user={user} />; //not sure about this
            }}
          </AuthConsumer>
        );
      }
    }
    

    布局

    export default function Layout({ pageContent, user }) {
      return (
        <div css={bodyWrap}>
          <Header appName="Test" user={user} />
          {pageContent}
          <Footer />
        </div>
      );
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Estus Flask    6 年前

    如果有许多组件应该接收用户上下文,那么它们应该是上下文使用者。这是高阶组件的用例:

    const withUser = Comp => props => (
      <AuthConsumer>
        {({ user }) => <Comp user={user} ...props/>}
      </AuthConsumer>
    );
    

    Home , Header SearchPanel 应该会增加 withUser(...) 接受 user 这样支撑,例如:

    头模块.js

    export class Header ... 
    
    export default withUser(Header);
    

    Layout

        2
  •  0
  •   Fraction    6 年前

    为什么你不在 Layout 组件?:

    Home 组成部分:

    export default class Home extends React.Component {
      render() {
        return (
          <AuthConsumer>
            {({ user }) => {
              if (!user) {
                return <ErrorPage />;
              }
              return <Layout user={user} />
            }}
          </AuthConsumer>
        );
      }
    }
    

    布局

    export default function Layout({ user }) {
      return (
        <div css={bodyWrap}>
          <Header appName="Test" user={user} />
          {
            (!user.roles.includes('Admin') && !user.roles.includes('Observer'))
            ? <NoAccessPanel />
            : <SearchPanel user={user}/>
          }
          <Footer />
        </div>
      );
    }