useState, useEffectの他に、カスタムフックを自作することもできる
カスタムフックのメリット
– UIと切り離したロジック抽出
– コンポーネント関数の肥大化抑制
– 複数のフック呼び出しを理論的単位でまとめられる
<script src="https://unpkg.com/@popperjs/core@2"></script> <script src="https://unpkg.com/tippy.js@6"></script> <script type="text/babel"> function useTooltip(id, content){ React.useEffect(() => { tippy(`#${id}`, {content}); }, [id, content]); } function App(){ useTooltip('myButton', 'Hello world!'); useTooltip('myParagraph', 'This is another tooltip.'); return( <> <button id="myButton">Hover me</button> <p> <span id="myParagraph">Hover me too!</span> </p> </> ); } const root = document.getElementById('root'); ReactDOM.render(<App />, root); </script>
APIからJSONデータを取得
const API = 'https://randomuser.me/api/?results=5&nat=us&inc=gender,name,email'; function useUsers(){ const [users, setUsers] = React.useState([]); React.useEffect(() => { (async () => { const response = await fetch(API).then(res => res.json()); setUsers(response.results); })(); },[]); return users; } function App(){ const users = useUsers(); return( <table> <thead> <tr> <td>Name</td> <td>Gender</td> <td>Email</td> </tr> </thead> <tbody> {users.map(user=>( <tr key={user.email}> <td>{user.name.title}. {user.name.first} {user.name.last}</td> <td>{user.gender}</td> <td>{user.email}</td> </tr> ))} </tbody> </table> ); }