Skip to content

Instantly share code, notes, and snippets.

@Ryomasao
Last active July 16, 2020 04:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Ryomasao/b9de1f74c1cb05b5e2ea90b5eaf2fa7b to your computer and use it in GitHub Desktop.
Save Ryomasao/b9de1f74c1cb05b5e2ea90b5eaf2fa7b to your computer and use it in GitHub Desktop.
React HOC

いろいろ忘れた

HOCの考え方を忘れた。 https://frontarm.com/james-k-nelson/4-ways-pass-children-react-elements/

ラップしたコンポーネントを返すパターン

ChildをParentでラップするだけ。 propsとしてコンポーネントを渡してる。 hooksあるからあれだけど、クラス型とかであれば、ライフサイクル系とかstateをparentに持ってあげたりする。

App

import React from "react";

import Parent from "./Parent";
import Child from "./Child";

export default function App() {
  return <Parent component={Child} />;
}

Parent

import React from "react";

export default function Parent(props) {
  const Component = props.component;

  return (
    <div>
      <h1>Hello</h1>
      {Component && <Component />}
    </div>
  );
}

このとき、props.componentはただの関数。 関数をのような形式で書くことでJSXとしてコンパイルされる。

そして、JSXは、React.createElementにすぎない。

https://ja.reactjs.org/docs/jsx-in-depth.html

JSX とは、つまるところ React.createElement(component, props, ...children) の糖衣構文にすぎません

これをprops.componentとして渡しても問題ない

const child = () => React.createElement(
  'div',
  {className: 'sidebar'}
)

Child

import React from "react";

export default function Child(props) {
  return (
    <div>
      <h1>Child</h1>
    </div>
  );
}

子にpropsを渡したいときは単純。

Parent

import React from "react";

export default function Parent(props) {
  const Component = props.component;

  return (
    <div>
      <h1>Hello</h1>
      {Component && <Component enhancedProps="hello"/>}
    </div>
  );
}

childrenパターン

パターンって書いたけど、propsで渡そうが、childrenとして渡そうがあんまかわらなかった。

App

import React from "react";
import "./styles.css";

import Parent from "./Parent";
import Child from "./Child";

export default function App() {
  return (
    <Parent>
      <Child />
    </Parent>
  );
}

普通はこう書く。

Parent

import React from "react";

export default function Parent(props) {
  return (
    <div>
      <h1>Hello</h1>
      {props.children}
    </div>
  );
}

結局これでもいける。

App

import React from "react";
import "./styles.css";

import Parent from "./Parent";
import Child from "./Child";

export default function App() {
  return <Parent>{Child}</Parent>;
}
import React from "react";

export default function Parent(props) {
  const Component = props.children;

  return (
    <div>
      <h1>Hello</h1>
      <Component enhanced="eeee"/>
    </div>
  );
}

関数を渡しているんであれば、でJSX化 JSXを渡しているんであれば、そのまま使える。

renderProps

趣旨がちょっと違うけど。もう忘れてもいいけど。 JSXを返す関数をpropsとして渡す。

export default function App() {
  return (
    <Parent
      render={(value) => {
        return <div>{value} aaaa</div>;
      }}
    >
      {Child}
    </Parent>
  );
}
import React from "react";

export default function Parent(props) {
  return (
    <div>
      <h1>Hello</h1>
      {props.render("enhanced")}
    </div>
  );
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment