首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为每个嵌套子对象分配样式和道具

为每个嵌套子对象分配样式和道具
EN

Stack Overflow用户
提问于 2019-12-18 15:26:34
回答 2查看 553关注 0票数 1

我想有选择地将一些道具传递给每个子元素,并对每个元素进行样式设置。

代码语言:javascript
复制
const Burger = ({children, ...rest}) => (
  <>
   <p>I'm a burger...</p>
   {children}
  </>
)
const Meat = ({type}) => <span>with {type?type:'no'} meat</span>
const Sauce = ({flavor}) => <span>with {flavor?flavor:'no'} sauce</span>
const Veggie = ({green}) => <span>with {green?green:'no'} greens</span>

const App = () => (
  // reach-router nesting
  <Router>
    <Burger path='burger' {...props}>
      <Sauce path='sauce' />
      <Veggie path='veggie' />
      <Meat path='meat' />
    </Burger>
  </Router>
)

我注意到我不能简单地遍历并将道具传递给每个孩子。

代码语言:javascript
复制
const Burger = ({children, ...rest}) => (
   <p>I'm a burger... </p>
   {children.map(Child => <Child {...rest} />) } // error
)

<router>中使用呈现函数是不起作用的。它打破了嵌套的路线,如果孩子的数量是不确定的,我不喜欢手动输入每个孩子的道具。

代码语言:javascript
复制
...
  <Router>
    <Burger path='burger' {...props}>
    {someStyle => (
      <>
        <Sauce path='sauce' style={someStyle}/>
        <Veggie path='veggie' style={someStyle}/>
        <Meat path='meat' style={someStyle}/>
      </>
    )}
    </Burger>
  </Router>
...

接下来,我继续尝试使用css- in -js解决方案(情感)来选择和设置<Burger/>的每个直系后代的样式,但这在这种情况下似乎也不起作用。

代码语言:javascript
复制
const styleAllChild = css`
  & > * : {
    margin-bottom: 10px;
  }
`
代码语言:javascript
复制
...
  <Router>
    <Burger path='burger' css={styleAllChild} {...props}>
      <Sauce path='sauce' />
      <Veggie path='veggie' />
      <Meat path='meat' />
    </Burger>
  </Router>
...

最后,我发现结合使用children.map和React.cloneElement的解决方案并不令人满意,因为如果每个子对象太大或太嵌套,就会有一些性能影响。

有没有其他方法来实现我想要的东西?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-18 15:49:24

你的第一个解决方案应该是有效的。您只需在return语句中使用一个组件。所以我添加了<> (片段的简写)。您应该使用双花括号进行解构(第一个用于在jsx中使用js代码,第二个用于对象解构语法)。

代码语言:javascript
复制
const Burger = ({children, ...rest}) => (
  <>
   <p>I'm a burger... </p>
   {children.map(Child => <Child {{...rest}} />) } // error
  </>
)
票数 1
EN

Stack Overflow用户

发布于 2019-12-18 16:37:37

我用彼得的答案解决了这个问题,但用的是React.Children

代码语言:javascript
复制
const Parent = ({children, myProps}) => (
  <>
  ...
  {React.Children.map(children || null, (child, index) => {
    return (
      <child 
        {...child.props}
        key={index}
        myProps={myProps}
        style={someStyle} 
      />
    );
  })}
  ...
  <>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59387271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档