reactjs - Hur konverterar man ReactNode till en array?


Jag försöker skapa en komponent där vissa HTMLElements eller ReactComponents passerar till den på detta sätt:

<ContentList>
   <span>Hi</span> // Passed child No. 1
   <span>Hi2</span> // Passed child No. 2
   <CustomComponent prop1={}></CustomComponent> // Passed child No. 3
</ContentList>

Då kommer det att rendera de passerade barnen i denna struktur:

render() {
    let content: React.ReactNode = this.props.children;
    //----------------------
    //Desired Process goes here
    //----------------------
    return (
      <>
        <section className={styles.list}></section>
        <section className={styles.contentPanel}></section>
      </>
    );
}

Där den första sektionen ska vara en innehållsförteckning och den andra sektionen kommer att vara de renderade React-komponenterna och HTML-elementen. Min fråga är Hur ska jag arbeta med props.children (även kallat innehåll) som en array? Jag försökte söka efter det online men det finns ingen solid guide där ute. I princip vill jag göra något som detta:

let content: React.ReactNode = this.props.children;

// Creating relevant anchor for each content
let list = content.map((child, i) => {
  return (<a className="content-link" href={"#"+child.id}>{child.title}</a>)
});

// Rendering each content after wrapping them inside proper div
let contents = content.map((child, i) => {
  return (<div className="content">{child}</div>)
});

return (
  <>
    <section className={styles.list}>{list}</section>
    <section className={styles.contentPanel}>{contents}</section>
  </>
);

Svar #1

class App(){
  // Creating relevant anchor for each content
  function list(){
    return this.props.children.map((child, i) => {
      return (<a className="content-link" href={"#"+child.id}>{child.title} </a>)
    });
  }  

  // Rendering each content after wrapping them inside proper div
  function contents(){
    return this.props.children.map(...)
  }

  render() {
    return (
      <>
        <section className={styles.list}>{list()}</section>
        <section className={styles.contentPanel}>{contents()}</section>
      </>
    )
  }
}

Svar #2

Typescript-kompilatorn är superstrikt på variabeltyp vid deklaration och tilldelning, men jag lyckades få det att fungera genom följande process:

render() {
  let content: React.ReactNode = this.props.children;
  let list: Array<JSX.Element> = [], // #1
       contents: Array<JSX.Element> = []; // #1
  if (this.props.children !== undefined && this.props.children !== null) {
    if (Array.isArray(content)) { // #2
      let arr: Array<any> = content; // #3
      list = arr.map((child, i) => {
        return (
          <a
           className={styles.contentAnchor}
           href={"#content_" + child.props.id}
          >
            {child.props.title}
          </a>
        );
      });
      contents = arr.map((child, i) => {
        return (
          <div
            id={"content_" + child.props.id}
            className={styles.contentWrapper}
          >
            {child}
          </div>
        );
      });
    }
  }
  return (
    <>
      <section className={styles.list}>{list}</section>
      <section className={styles.contentPanel}>{contents}</section>
    </>
  );
}

De faktiska nyckel-raderna som saknades från början är de jag markerade med #