実務で学んだReactのデザインパターンとTips
はじめに
この記事は、ボク自身が開発しているプロジェクトで学んだ Reactのデザインパターン,JavaScriptの機能や Tipsの備忘録として、残しておきます。
props に関して
default props
コンポーネントの引数に初期値を定義することができます。
type Props = {
color: string,
text: string
}
const Button: React.VFC<Props> = ({ color = "red", text = 'text something here' }) => {
return (
<button style={color}>
{text}
</button>
)
}
スプレッド構文とレスト構文
スプレッド構文とレスト構文は、JavaScriptの機能で、とても頻出です。
Reactのビルドインを理解するよりも、JavaScriptの理解を深めていく事が、実装での迷いを失くせるかもしれませんね。
1.スプレッド構文とは
スプレッド構文を使うと、関数呼び出しでは 0 個以上の引数として、Array リテラルでは 0 個以上の要素として、Object リテラルでは 0 個以上の key-value のペアとして、Array や String などの iterable オブジェクトをその場で展開します。
引用先: MDN Web Docs
2.レスト構文とは
分割代入 (Destructuring assignment) 構文は、配列から値を取り出して、あるいはオブジェクトからプロパティを取り出して別個の変数に代入することを可能にする JavaScript の式です。
引用先: MDN Web Docs
type ButtonProps = React.HTMLAttributes<HTMLButtonElement>
type Props = {
color: string
} & ButtonProps;
const Button: React.FC<Props> = ({ color = "red", ...buttonProps }) => {
return <button style={{ color }} {...buttonProps}>{children}</button>
}
props getters
ReactはCustom Hook
があり、それを応用してprops
を渡します。
jsx
に直接、aria属性(aria-expanded) や Event属性(onClick)を記述するのではなく、 getter関数
で複数のprops
を渡すようにします。
useState
で状態を定義し、getToggleProps関数
で button
タグのpropsを割り当てます。引数に...otherProps
を渡している理由は、この関数に新たにprops
を増やしたい場合、関数に変更せずに呼び出した側でprops
を引数に入れるためですね。
import { useState } from "react";
function useButton () {
const [isOepn, setisOpen] = useState(false)
const toggle = () => setisOpen(!isOepn)
const getToggleProps = ({ onClick, ...otherProps } = {}) => ({
'aria-expanded': isOpen,
onClick: () => {
onClick && onClick(isOpen)
toggle(isOepn)
},
...otherProps,
})
return {
isOepn,
getTogglerProps,
};
}
Custom Hook
を読み込み、buttonタグに渡しています
import { useButton} from "./useButton";
function Usage() {
const {isOpen, getToggleProps} = useButton();
return (
<>
<button {...getToggleProps()}>
{isOpen ? "OPEN" : "CLOSE"}
</button>
<button {...getToggleProps({ disabled: true })}>
</button>
</>
);
}
export { Usage };
さいごに
まだまだ実務で学んだことが沢山あるので、まとめていきたいなと思っています。
もしよければ、いいねを押してもらえると記事の執筆のモチベーションになりますので、ハートマークをクリックして欲しいです!
Discussion