- Objective: - Breadcrumb: # 概念阐释 ## 语义 当代码变得复杂时,将这些值集合到对象或数组中是有意义的。为了让状态看上去更简洁,并易于修改和维护,我们要给不同的状态设定单独的 hooks # 实例 ## 例1 ```jsx import React, { useState } from "react"; //不分离的状态 function Musical() { const [state, setState] = useState({ title: "Best Musical Ever", actors: ["George Wilson", "Tim Hughes", "Larry Clements"], locations: { Chicago: { dates: ["1/1", "2/2"], address: "chicago theater"}, SanFrancisco: { dates: ["5/2"], address: "sf theater" } } }) } // 分离的状态 function MusicalRefactored() { const [title,setTitle] = useState('Best Musical Ever'); const [actors,setActors] = useState(["George Wilson", "Tim Hughes", "Larry Clements"]); const [locations,setLocations] = useState({ Chicago: { dates: ["1/1", "2/2"], address: "chicago theater"}, SanFrancisco: { dates: ["5/2"], address: "sf theater" } }); } ``` ## 例2 ```jsx import React, { useState, useEffect } from 'react'; import { get } from './mockBackend/fetch'; //分离每一项的 state 和 effect export default function SocialNetwork() { const [menu,setMenu] = useState(null); useEffect(()=>{ get('/menu').then((menuResponse)=>{setMenu(menuResponse.data);}); },[]) const [newsFeed,setNewsFeed] = useState(null); useEffect(()=>{ get('/news-feed').then((newsFeedResponse)=>{setNewsFeed(newsFeedResponse.data);}); },[]) const [friends,setFriends] = useState(null); useEffect(()=>{ get('/friends').then((friendsResponse)=>{setFriends(friendsResponse.data);}); },[]) return ( <div className='App'> <h1>My Network</h1> {!menu ? <p>Loading..</p> : ( <nav> {menu.map((menuItem) => ( <button key={menuItem}>{menuItem}</button> ))} </nav> )} <div className='content'> {!newsFeed ? <p>Loading..</p> : ( <section> {newsFeed.map(({ id, title, message, imgSrc }) => ( <article key={id}> <h3>{title}</h3> <p>{message}</p> <img src={imgSrc} alt='' /> </article> ))} </section> )} {!friends ? <p>Loading..</p> : ( <aside> <ul> {friends .sort((a, b) => (a.isOnline && !b.isOnline ? -1 : 0)) .map(({ id, name, isOnline }) => ( <li key={id} className={isOnline ? 'online' : 'offline'}> {name} </li> ))} </ul> </aside> )} </div> </div> ); } ``` # 相关内容 #### 分离与不分离的区别 ![](https://image.harryrou.wiki/2024-01-02-CleanShot%202024-01-03%20at%2007.39.54%402x.png) 如果不分离,在写一个事件处理程序的时候就会变得复杂: ![](https://image.harryrou.wiki/2024-01-02-CleanShot%202024-01-03%20at%2007.50.54%402x.png) 分离的状态 ![](https://image.harryrou.wiki/2024-01-02-CleanShot%202024-01-03%20at%2007.40.55%402x.png) # 参考资料 [Separate Hooks for Separate Effects](https://www.codecademy.com/journeys/full-stack-engineer/paths/fscj-22-front-end-development/tracks/fscj-22-react-part-ii/modules/wdcp-22-function-components-and-hooks-a2dba9bf-fc64-4118-8656-dfdc35f9e5cc/lessons/the-effect-hook/exercises/separate-hooks-for-separate-effects)