5

我正在尝试映射片段的子级,而片段又是组件的子级。例如:

const Frag = () => (
  <React.Fragment key="test-key">
    <div>test1</div>
    <div>test2</div>
  </React.Fragment>
);

const Outer = ({ children }) => (
  <div>
    {
      React.Children.map(children, (child) => (
        <a>
          {child}
        </a>
      ))
    }
  </div>
);

// Usage
<Outer>
  <Frag />
</Outer>

a即使片段内部有多个 div,这也会产生单个标记。文档(https://reactjs.org/docs/react-api.html#reactchildrenmap)似乎表明这应该与键控片段一起使用,我认为我正在正确地创建键控片段(https://reactjs.org /docs/fragments.html#keyed-fragments)。任何帮助,将不胜感激!

4

1 回答 1

4

是的,但据我所知 - 你正在迭代Outer孩子。尝试

React.Children.map(children[0].props.children, (child) => (

但是,仔细查看您的链接 - 我看到文档在这里说错了

该函数永远不会被传递给容器对象

这是一个例子,它清楚地表明容器被传递给函数:

<script src="https://unpkg.com/@babel/standalone/babel.js"></script>
<script src="https://unpkg.com/react@16.2.0/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16.2.0/umd/react-dom.development.js"></script>
<div id="root" />
<script type="text/babel">
  const Frag = () => (
    <>
      <div>test1</div>
      <div>test2</div>
    </>
  ); 
  
  const Outer = ({ children }) => (
    <div>
      { 
        React.Children.map(children, (child) => console.log(`Child type is ${child.type.name || child.type.toString()}`) || (
        <a>
          {child}
        </a> )) 
      }
    </div>
  ); 
  
  
  ReactDOM.render((
    <div>
      <Outer>
        <>
          <div>test1</div>
          <div>test2</div>
        </>
      </Outer>
      <Outer>
        <Frag />
      </Outer>
    </div>
  ), document.getElementById('root'));
</script>

于 2018-02-09T22:47:02.443 回答