React应用级性能分析优化之状态管理层面优化

114 阅读10分钟

React状态管理优化

React State 和 Context 的性能问题

React State 性能问题

1. 频繁的状态更新导致组件重渲染

React组件在状态变化时会触发重渲染,如果状态更新频繁,会导致性能问题。

问题代码示例:

// 问题:频繁的状态更新
function CounterComponent() {
  const [count, setCount] = useState(0);
  const [animationId, setAnimationId] = useState(null);

  // 每次动画帧都更新状态,造成频繁重渲染
  const startAnimation = () => {
    const animate = () => {
      setCount(prev => prev + 1);
      setAnimationId(requestAnimationFrame(animate));
    };
    animate();
  };

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={startAnimation}>Start</button>
    </div>
  );
}

优化方案:

// 解决方案1:使用useCallback和useMemo减少不必要的重渲染
function OptimizedCounterComponent() {
  const [count, setCount] = useState(0);
  const [animationId, setAnimationId] = useState(null);
  
  // 使用useRef避免频繁状态更新
  const countRef = useRef(0);
  const [displayCount, setDisplayCount] = useState(0);

  const startAnimation = useCallback(() => {
    const animate = () => {
      countRef.current += 1;
      // 仅在特定条件下更新状态
      if (countRef.current % 10 === 0) {
        setDisplayCount(countRef.current);
      }
      setAnimationId(requestAnimationFrame(animate));
    };
    animate();
  }, []);

  return (
    <div>
      <p>Count: {displayCount}</p>
      <button onClick={startAnimation}>Start</button>
    </div>
  );
}
2. 状态对象嵌套过深导致的性能问题

深度嵌套的状态对象在更新时容易造成性能问题,特别是当使用展开运算符进行不可变更新时。

问题代码示例:

// 问题:深度嵌套状态更新
function UserProfileComponent() {
  const [user, setUser] = useState({
    profile: {
      personal: {
        name: 'John',
        age: 30,
        address: {
          street: '123 Main St',
          city: 'New York',
          coordinates: {
            lat: 40.7128,
            lng: -74.0060
          }
        }
      }
    }
  });

  const updateCoordinates = (lat, lng) => {
    // 深度嵌套更新,创建大量中间对象
    setUser(prevUser => ({
      ...prevUser,
      profile: {
        ...prevUser.profile,
        personal: {
          ...prevUser.profile.personal,
          address: {
            ...prevUser.profile.personal.address,
            coordinates: {
              ...prevUser.profile.personal.address.coordinates,
              lat,
              lng
            }
          }
        }
      }
    }));
  };

  return (
    <div>
      <p>Location: {user.profile.personal.address.coordinates.lat}, {user.profile.personal.address.coordinates.lng}</p>
      <button onClick={() => updateCoordinates(41.8781, -87.6298)}>Update Location</button>
    </div>
  );
}

优化方案:

// 解决方案:扁平化状态结构
function OptimizedUserProfileComponent() {
  const [coordinates, setCoordinates] = useState({ lat: 40.7128, lng: -74.0060 });
  const [personalInfo, setPersonalInfo] = useState({ name: 'John', age: 30 });
  const [address, setAddress] = useState({ street: '123 Main St', city: 'New York' });

  const updateCoordinates = useCallback((lat, lng) => {
    setCoordinates({ lat, lng });
  }, []);

  return (
    <div>
      <p>Location: {coordinates.lat}, {coordinates.lng}</p>
      <button onClick={() => updateCoordinates(41.8781, -87.6298)}>Update Location</button>
    </div>
  );
}
3. 状态更新批处理问题

React 18之前,某些情况下状态更新不会自动批处理,导致多次重渲染。

// React 18之前的问题
function BatchingExample() {
  const [count, setCount] = useState(0);
  const [flag, setFlag] = useState(false);

  const handleClick = () => {
    // 在事件处理器中,React会自动批处理
    setCount(c => c + 1);
    setFlag(f => !f);
  };

  const handleAsyncUpdate = () => {
    // 在异步回调中,React 18之前不会批处理
    setTimeout(() => {
      setCount(c => c + 1); // 导致重渲染
      setFlag(f => !f);     // 又导致重渲染
    }, 1000);
  };

  return (
    <div>
      <p>Count: {count}, Flag: {flag.toString()}</p>
      <button onClick={handleClick}>Sync Update</button>
      <button onClick={handleAsyncUpdate}>Async Update</button>
    </div>
  );
}

状态更新流程图:

graph TD
    A[用户操作] --> B{状态更新类型}
    B -->|同步更新| C[React自动批处理]
    B -->|异步更新| D[React 18之前不批处理]
    C --> E[单次重渲染]
    D --> F[多次重渲染]
    F --> G[性能问题]
    E --> H[性能优化]
    
    style G fill:#ff9999
    style H fill:#99ff99

React Context 性能问题

1. Context值变化导致的全局重渲染

Context的值发生变化时,所有消费该Context的组件都会重新渲染,这是Context最主要的性能问题。

问题代码示例:

// 问题:Context值变化导致全局重渲染
const AppContext = createContext();

function AppProvider({ children }) {
  const [user, setUser] = useState({ name: 'John', age: 30 });
  const [theme, setTheme] = useState('light');
  const [notifications, setNotifications] = useState([]);

  // 任何状态变化都会导致所有消费组件重渲染
  const value = {
    user,
    setUser,
    theme,
    setTheme,
    notifications,
    setNotifications
  };

  return (
    <AppContext.Provider value={value}>
      {children}
    </AppContext.Provider>
  );
}

function UserProfile() {
  const { user } = useContext(AppContext);
  // 即使只关心user,theme变化也会导致重渲染
  return <div>User: {user.name}</div>;
}

function ThemeToggle() {
  const { theme, setTheme } = useContext(AppContext);
  // theme变化会导致UserProfile也重渲染
  return (
    <button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>
      Toggle Theme
    </button>
  );
}

优化方案1:拆分Context

// 解决方案1:按功能拆分Context
const UserContext = createContext();
const ThemeContext = createContext();
const NotificationContext = createContext();

function UserProvider({ children }) {
  const [user, setUser] = useState({ name: 'John', age: 30 });
  return (
    <UserContext.Provider value={{ user, setUser }}>
      {children}
    </UserContext.Provider>
  );
}

function ThemeProvider({ children }) {
  const [theme, setTheme] = useState('light');
  return (
    <ThemeContext.Provider value={{ theme, setTheme }}>
      {children}
    </ThemeContext.Provider>
  );
}

function OptimizedUserProfile() {
  const { user } = useContext(UserContext);
  // 只有user变化时才会重渲染
  return <div>User: {user.name}</div>;
}

function OptimizedThemeToggle() {
  const { theme, setTheme } = useContext(ThemeContext);
  // theme变化不会影响UserProfile
  return (
    <button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>
      Toggle Theme
    </button>
  );
}

优化方案2:使用useMemo优化Context值

// 解决方案2:使用useMemo避免不必要的Context值变化
function OptimizedAppProvider({ children }) {
  const [user, setUser] = useState({ name: 'John', age: 30 });
  const [theme, setTheme] = useState('light');
  const [notifications, setNotifications] = useState([]);

  // 使用useMemo缓存Context值
  const userValue = useMemo(() => ({
    user,
    setUser
  }), [user]);

  const themeValue = useMemo(() => ({
    theme,
    setTheme
  }), [theme]);

  const notificationValue = useMemo(() => ({
    notifications,
    setNotifications
  }), [notifications]);

  return (
    <UserContext.Provider value={userValue}>
      <ThemeContext.Provider value={themeValue}>
        <NotificationContext.Provider value={notificationValue}>
          {children}
        </NotificationContext.Provider>
      </ThemeContext.Provider>
    </UserContext.Provider>
  );
}
2. Context嵌套过深导致的性能问题

多个Context嵌套使用时,会造成组件树结构复杂,影响性能。

问题代码示例:

// 问题:Context嵌套过深
function App() {
  return (
    <AuthProvider>
      <UserProvider>
        <ThemeProvider>
          <NotificationProvider>
            <ModalProvider>
              <ToastProvider>
                <RouterProvider>
                  <MainApp />
                </RouterProvider>
              </ToastProvider>
            </ModalProvider>
          </NotificationProvider>
        </ThemeProvider>
      </UserProvider>
    </AuthProvider>
  );
}

优化方案:合并Provider

// 解决方案:创建组合Provider
function combineProviders(...providers) {
  return ({ children }) => {
    return providers.reduceRight((acc, Provider) => {
      return <Provider>{acc}</Provider>;
    }, children);
  };
}

const AppProviders = combineProviders(
  AuthProvider,
  UserProvider,
  ThemeProvider,
  NotificationProvider,
  ModalProvider,
  ToastProvider,
  RouterProvider
);

function OptimizedApp() {
  return (
    <AppProviders>
      <MainApp />
    </AppProviders>
  );
}
3. Context选择器模式优化

实现选择器模式,只在需要的数据变化时才重渲染组件。

// 高级优化:Context选择器模式
function createSelectableContext(initialValue) {
  const Context = createContext(initialValue);
  
  function Provider({ children, value }) {
    const [state, setState] = useState(value);
    const listeners = useRef(new Set());
    
    const contextValue = useMemo(() => ({
      state,
      setState,
      subscribe: (listener) => {
        listeners.current.add(listener);
        return () => listeners.current.delete(listener);
      }
    }), [state]);
    
    return (
      <Context.Provider value={contextValue}>
        {children}
      </Context.Provider>
    );
  }
  
  function useSelector(selector) {
    const context = useContext(Context);
    const [selectedState, setSelectedState] = useState(() => 
      selector(context.state)
    );
    
    useEffect(() => {
      const unsubscribe = context.subscribe(() => {
        const newSelectedState = selector(context.state);
        setSelectedState(prev => {
          // 只有选中的状态变化时才更新
          return Object.is(prev, newSelectedState) ? prev : newSelectedState;
        });
      });
      return unsubscribe;
    }, [context, selector]);
    
    return [selectedState, context.setState];
  }
  
  return { Provider, useSelector };
}

// 使用示例
const { Provider: AppProvider, useSelector } = createSelectableContext({
  user: { name: 'John', age: 30 },
  theme: 'light',
  notifications: []
});

function OptimizedUserProfile() {
  const [user] = useSelector(state => state.user);
  // 只有user变化时才会重渲染
  return <div>User: {user.name}</div>;
}

Context性能优化流程图:

graph TD
    A[Context使用] --> B{性能问题识别}
    B --> C[全局重渲染]
    B --> D[Context嵌套过深]
    B --> E[频繁Context值变化]
    
    C --> F[拆分Context]
    C --> G[使用useMemo]
    C --> H[选择器模式]
    
    D --> I[合并Provider]
    D --> J[Context组合器]
    
    E --> K[状态结构优化]
    E --> L[批处理更新]
    
    F --> M[性能提升]
    G --> M
    H --> M
    I --> M
    J --> M
    K --> M
    L --> M
    
    style C fill:#ff9999
    style D fill:#ff9999
    style E fill:#ff9999
    style M fill:#99ff99

Redux 和不可变数据的性能问题

Redux 的性能问题

1. 不可变数据更新的性能开销

Redux要求状态更新必须是不可变的,这意味着每次状态更新都需要创建新的对象,在复杂数据结构中会产生显著的性能开销。

问题代码示例:

// 问题:深度嵌套的不可变更新
const initialState = {
  users: [
    {
      id: 1,
      profile: {
        personal: {
          name: 'John',
          contacts: {
            email: 'john@example.com',
            phone: '123-456-7890',
            addresses: [
              {
                type: 'home',
                street: '123 Main St',
                city: 'New York',
                coordinates: { lat: 40.7128, lng: -74.0060 }
              }
            ]
          }
        }
      }
    }
  ]
};

// 传统Redux reducer中的深度嵌套更新
function userReducer(state = initialState, action) {
  switch (action.type) {
    case 'UPDATE_USER_COORDINATES':
      return {
        ...state,
        users: state.users.map(user =>
          user.id === action.userId
            ? {
                ...user,
                profile: {
                  ...user.profile,
                  personal: {
                    ...user.profile.personal,
                    contacts: {
                      ...user.profile.personal.contacts,
                      addresses: user.profile.personal.contacts.addresses.map(addr =>
                        addr.type === action.addressType
                          ? {
                              ...addr,
                              coordinates: {
                                ...addr.coordinates,
                                lat: action.lat,
                                lng: action.lng
                              }
                            }
                          : addr
                      )
                    }
                  }
                }
              }
            : user
        )
      };
    default:
      return state;
  }
}

性能问题分析:

  • 每次更新都要创建大量中间对象
  • 深度嵌套导致代码复杂且易出错
  • 内存使用增加,垃圾回收压力大
2. 频繁的状态更新导致的重渲染

Redux中频繁的状态更新会导致连接组件的频繁重渲染,特别是当使用useSelector时。

问题代码示例:

// 问题:频繁的状态更新
function ChatComponent() {
  const messages = useSelector(state => state.chat.messages);
  const typingUsers = useSelector(state => state.chat.typingUsers);
  const onlineUsers = useSelector(state => state.chat.onlineUsers);

  // 任何chat状态变化都会导致重渲染
  return (
    <div>
      <MessageList messages={messages} />
      <TypingIndicator users={typingUsers} />
      <OnlineUsersList users={onlineUsers} />
    </div>
  );
}

// 高频更新的actions
const startTyping = (userId) => ({ type: 'START_TYPING', userId });
const stopTyping = (userId) => ({ type: 'STOP_TYPING', userId });
const updateOnlineStatus = (userId, status) => ({ 
  type: 'UPDATE_ONLINE_STATUS', 
  userId, 
  status 
});

// 每秒多次触发状态更新
setInterval(() => {
  dispatch(updateOnlineStatus(currentUserId, 'online'));
}, 1000);

优化方案:

// 解决方案1:使用精确的selector
function OptimizedChatComponent() {
  // 使用具体的selector避免不必要的重渲染
  const messages = useSelector(state => state.chat.messages);
  const typingUsers = useSelector(state => state.chat.typingUsers, shallowEqual);
  const onlineUsers = useSelector(state => state.chat.onlineUsers, shallowEqual);

  return (
    <div>
      <MessageList messages={messages} />
      <TypingIndicator users={typingUsers} />
      <OnlineUsersList users={onlineUsers} />
    </div>
  );
}

// 解决方案2:使用createSelector进行记忆化
import { createSelector } from 'reselect';

const getMessages = state => state.chat.messages;
const getTypingUsers = state => state.chat.typingUsers;
const getCurrentUserId = state => state.auth.currentUserId;

const getMessagesWithUserInfo = createSelector(
  [getMessages, getCurrentUserId],
  (messages, currentUserId) => {
    return messages.map(message => ({
      ...message,
      isOwn: message.userId === currentUserId
    }));
  }
);

function OptimizedChatWithSelector() {
  const messagesWithUserInfo = useSelector(getMessagesWithUserInfo);
  const typingUsers = useSelector(getTypingUsers);

  return (
    <div>
      <MessageList messages={messagesWithUserInfo} />
      <TypingIndicator users={typingUsers} />
    </div>
  );
}
3. 大型Store的性能问题

当Redux Store变得很大时,即使是局部更新也可能影响整个应用的性能。

问题代码示例:

// 问题:大型单体Store
const initialState = {
  auth: { /* auth state */ },
  users: { /* users state */ },
  products: { /* products state */ },
  orders: { /* orders state */ },
  inventory: { /* inventory state */ },
  analytics: { /* analytics state */ },
  notifications: { /* notifications state */ },
  settings: { /* settings state */ }
};

// 单个巨大的reducer
function appReducer(state = initialState, action) {
  switch (action.type) {
    case 'UPDATE_USER':
      return {
        ...state,
        users: {
          ...state.users,
          [action.userId]: {
            ...state.users[action.userId],
            ...action.updates
          }
        }
      };
    // ... 数百个其他cases
  }
}

优化方案:

// 解决方案:拆分reducer和使用combineReducers
import { combineReducers } from 'redux';

// 拆分成独立的reducer
const authReducer = (state = {}, action) => {
  switch (action.type) {
    case 'LOGIN':
      return { ...state, user: action.user, isAuthenticated: true };
    case 'LOGOUT':
      return { ...state, user: null, isAuthenticated: false };
    default:
      return state;
  }
};

const usersReducer = (state = {}, action) => {
  switch (action.type) {
    case 'UPDATE_USER':
      return {
        ...state,
        [action.userId]: {
          ...state[action.userId],
          ...action.updates
        }
      };
    default:
      return state;
  }
};

// 使用combineReducers组合
const rootReducer = combineReducers({
  auth: authReducer,
  users: usersReducer,
  products: productsReducer,
  orders: ordersReducer,
  inventory: inventoryReducer,
  analytics: analyticsReducer,
  notifications: notificationsReducer,
  settings: settingsReducer
});

// 使用Redux Toolkit进一步优化
import { configureStore, createSlice } from '@reduxjs/toolkit';

const usersSlice = createSlice({
  name: 'users',
  initialState: {},
  reducers: {
    updateUser: (state, action) => {
      // RTK使用Immer,可以直接修改
      const { userId, updates } = action.payload;
      if (state[userId]) {
        Object.assign(state[userId], updates);
      }
    }
  }
});

const store = configureStore({
  reducer: {
    auth: authReducer,
    users: usersSlice.reducer,
    // ... 其他reducers
  }
});

Redux性能优化流程图:

graph TD
    A[Redux性能问题] --> B{问题类型识别}
    B --> C[不可变数据更新开销]
    B --> D[频繁重渲染]
    B --> E[大型Store问题]
    
    C --> F[使用Immer]
    C --> G[优化数据结构]
    C --> H[批处理更新]
    
    D --> I[精确Selector]
    D --> J[记忆化Selector]
    D --> K[shallowEqual比较]
    
    E --> L[拆分Reducer]
    E --> M[使用Redux Toolkit]
    E --> N[懒加载Reducer]
    
    F --> O[性能改善]
    G --> O
    H --> O
    I --> O
    J --> O
    K --> O
    L --> O
    M --> O
    N --> O
    
    style C fill:#ff9999
    style D fill:#ff9999
    style E fill:#ff9999
    style O fill:#99ff99
4. Redux中间件的性能影响

过多或配置不当的中间件会影响Redux的性能。

问题代码示例:

// 问题:过多的中间件
const store = createStore(
  rootReducer,
  applyMiddleware(
    logger,
    thunk,
    saga,
    promise,
    routerMiddleware,
    customMiddleware1,
    customMiddleware2,
    customMiddleware3
  )
);

// 问题:在中间件中进行昂贵的操作
const expensiveMiddleware = store => next => action => {
  // 每个action都会触发昂贵的计算
  const expensiveResult = performExpensiveCalculation(action);
  console.log('Expensive result:', expensiveResult);
  return next(action);
};

优化方案:

// 解决方案:优化中间件配置
const store = configureStore({
  reducer: rootReducer,
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware({
      // 在生产环境中禁用一些开发工具
      serializableCheck: process.env.NODE_ENV !== 'production',
      immutableCheck: process.env.NODE_ENV !== 'production'
    }).concat(
      // 只添加必要的中间件
      thunk,
      // 条件性添加中间件
      ...(process.env.NODE_ENV !== 'production' ? [logger] : [])
    )
});

// 优化的中间件实现
const optimizedMiddleware = store => next => action => {
  // 只在特定条件下执行昂贵操作
  if (action.type === 'SPECIFIC_ACTION_TYPE') {
    const result = performExpensiveCalculation(action);
    return next({ ...action, calculationResult: result });
  }
  return next(action);
};

引入 Immer 作为解决方案

Immer 的优势

1. 简化不可变数据操作

Immer最大的优势是允许开发者以可变的方式编写代码,同时保持不可变性。这大大简化了复杂数据结构的更新操作。

传统方式 vs Immer:

// 传统不可变更新(复杂且容易出错)
const traditionalUpdate = (state, action) => {
  return {
    ...state,
    users: {
      ...state.users,
      [action.userId]: {
        ...state.users[action.userId],
        profile: {
          ...state.users[action.userId].profile,
          preferences: {
            ...state.users[action.userId].profile.preferences,
            theme: action.theme
          }
        }
      }
    }
  };
};

// 使用Immer(直观且易于理解)
import produce from 'immer';

const immerUpdate = produce((draft, action) => {
  draft.users[action.userId].profile.preferences.theme = action.theme;
});

优势分析:

  • 代码简洁性:减少90%以上的样板代码
  • 可读性:直观的语法,易于理解和维护
  • 减少错误:避免深度嵌套展开运算符的错误
2. 性能优化

Immer内部使用结构共享(Structural Sharing)技术,只创建实际改变的对象,未改变的部分会被重用。

性能优化原理:

// Immer的结构共享演示
const originalState = {
  users: {
    user1: { name: 'John', age: 30 },
    user2: { name: 'Jane', age: 25 }
  },
  products: {
    product1: { name: 'Product A', price: 100 },
    product2: { name: 'Product B', price: 200 }
  }
};

const newState = produce(originalState, draft => {
  draft.users.user1.age = 31; // 只修改user1的age
});

// 结构共享验证
console.log(newState.users.user1 === originalState.users.user1); // false - 已更改
console.log(newState.users.user2 === originalState.users.user2); // true - 未更改,重用
console.log(newState.products === originalState.products); // true - 未更改,重用

性能对比测试:

// 性能测试代码
function performanceTest() {
  const largeState = {
    data: Array.from({ length: 10000 }, (_, i) => ({
      id: i,
      value: Math.random(),
      nested: {
        level1: {
          level2: {
            level3: { data: `item-${i}` }
          }
        }
      }
    }))
  };

  // 传统方式
  console.time('Traditional');
  const traditionalResult = {
    ...largeState,
    data: largeState.data.map(item => 
      item.id === 5000 
        ? {
            ...item,
            nested: {
              ...item.nested,
              level1: {
                ...item.nested.level1,
                level2: {
                  ...item.nested.level1.level2,
                  level3: {
                    ...item.nested.level1.level2.level3,
                    data: 'updated'
                  }
                }
              }
            }
          }
        : item
    )
  };
  console.timeEnd('Traditional');

  // Immer方式
  console.time('Immer');
  const immerResult = produce(largeState, draft => {
    draft.data[5000].nested.level1.level2.level3.data = 'updated';
  });
  console.timeEnd('Immer');
}
3. 内存优化

Immer通过Copy-on-Write(写时复制)机制,显著减少内存使用。

内存优化示例:

// 内存使用对比
const createLargeState = () => ({
  users: new Array(1000).fill(null).map((_, i) => ({
    id: i,
    name: `User ${i}`,
    data: new Array(100).fill(`data-${i}`)
  }))
});

// 传统方式 - 每次都创建新数组
function traditionalApproach(state) {
  return {
    ...state,
    users: state.users.map(user => 
      user.id === 500 
        ? { ...user, name: 'Updated User' }
        : user
    )
  };
}

// Immer方式 - 只在必要时创建新对象
function immerApproach(state) {
  return produce(state, draft => {
    draft.users[500].name = 'Updated User';
  });
}

// 内存使用分析
function memoryAnalysis() {
  const state = createLargeState();
  
  // 传统方式创建全新数组
  const traditional = traditionalApproach(state);
  console.log('Traditional shares users array:', traditional.users === state.users); // false
  
  // Immer只创建必要的新对象
  const immer = immerApproach(state);
  console.log('Immer shares unchanged objects:', 
    immer.users[0] === state.users[0], // true - 未更改的对象被重用
    immer.users[500] === state.users[500] // false - 更改的对象是新的
  );
}
4. 类型安全(TypeScript支持)

Immer提供了出色的TypeScript支持,确保类型安全。

// TypeScript类型定义
interface User {
  id: number;
  name: string;
  profile: {
    email: string;
    preferences: {
      theme: 'light' | 'dark';
      notifications: boolean;
    };
  };
}

interface AppState {
  users: { [key: string]: User };
  loading: boolean;
}

// 类型安全的Immer操作
const updateUserTheme = (state: AppState, userId: string, theme: 'light' | 'dark') => {
  return produce(state, (draft) => {
    // TypeScript会检查类型
    draft.users[userId].profile.preferences.theme = theme;
    // draft.users[userId].profile.preferences.theme = 'invalid'; // 类型错误
  });
};
5. 与流行状态管理库的集成

Immer与主流状态管理库有良好的集成支持。

与Redux集成:

import { createSlice } from '@reduxjs/toolkit';

// Redux Toolkit默认使用Immer
const userSlice = createSlice({
  name: 'users',
  initialState: { users: {} },
  reducers: {
    updateUser: (state, action) => {
      // 直接修改,Immer处理不可变性
      const { userId, updates } = action.payload;
      Object.assign(state.users[userId], updates);
    },
    addUser: (state, action) => {
      state.users[action.payload.id] = action.payload;
    }
  }
});

与Zustand集成:

import { create } from 'zustand';
import { immer } from 'zustand/middleware/immer';

const useStore = create(
  immer((set) => ({
    users: {},
    updateUser: (userId, updates) =>
      set((state) => {
        Object.assign(state.users[userId], updates);
      }),
    addUser: (user) =>
      set((state) => {
        state.users[user.id] = user;
      })
  }))
);

Immer优势总结流程图:

graph TD
    A[Immer使用场景] --> B[复杂数据结构更新]
    A --> C[性能优化需求]
    A --> D[开发效率提升]
    A --> E[类型安全要求]
    
    B --> F[简化语法]
    B --> G[减少错误]
    
    C --> H[结构共享]
    C --> I[写时复制]
    C --> J[内存优化]
    
    D --> K[代码简洁]
    D --> L[易于维护]
    
    E --> M[TypeScript支持]
    E --> N[编译时检查]
    
    F --> O[开发体验提升]
    G --> O
    H --> P[性能提升]
    I --> P
    J --> P
    K --> O
    L --> O
    M --> Q[代码质量保证]
    N --> Q
    
    O --> R[项目收益]
    P --> R
    Q --> R
    
    style R fill:#99ff99
    style O fill:#99ccff
    style P fill:#99ccff
    style Q fill:#99ccff
6. 生产环境优化

Immer在生产环境中的性能表现和优化建议。

// 生产环境优化配置
import { enableMapSet, enablePatches } from 'immer';

// 根据需要启用功能
if (process.env.NODE_ENV !== 'production') {
  enablePatches(); // 开发环境启用补丁功能
}

enableMapSet(); // 启用Map和Set支持

// 性能优化最佳实践
const optimizedProduce = (baseState, recipe) => {
  // 对于简单更新,直接使用原生JavaScript
  if (isSimpleUpdate(baseState, recipe)) {
    return simpleUpdate(baseState, recipe);
  }
  
  // 对于复杂更新,使用Immer
  return produce(baseState, recipe);
};

// 批量更新优化
const batchUpdates = (state, updates) => {
  return produce(state, draft => {
    updates.forEach(update => {
      // 在单个produce调用中执行多个更新
      applyUpdate(draft, update);
    });
  });
};

Immer 使用示例

1. 基础使用示例

React Hook中使用Immer:

import React, { useState, useCallback } from 'react';
import produce from 'immer';

function TodoApp() {
  const [todos, setTodos] = useState([
    { id: 1, text: 'Learn React', completed: false },
    { id: 2, text: 'Learn Immer', completed: false }
  ]);

  // 添加新todo
  const addTodo = useCallback((text) => {
    setTodos(produce(draft => {
      draft.push({
        id: Date.now(),
        text,
        completed: false
      });
    }));
  }, []);

  // 切换todo状态
  const toggleTodo = useCallback((id) => {
    setTodos(produce(draft => {
      const todo = draft.find(t => t.id === id);
      if (todo) {
        todo.completed = !todo.completed;
      }
    }));
  }, []);

  // 删除todo
  const deleteTodo = useCallback((id) => {
    setTodos(produce(draft => {
      const index = draft.findIndex(t => t.id === id);
      if (index > -1) {
        draft.splice(index, 1);
      }
    }));
  }, []);

  return (
    <div>
      <h1>Todo List</h1>
      {todos.map(todo => (
        <div key={todo.id}>
          <input
            type="checkbox"
            checked={todo.completed}
            onChange={() => toggleTodo(todo.id)}
          />
          <span style={{ textDecoration: todo.completed ? 'line-through' : 'none' }}>
            {todo.text}
          </span>
          <button onClick={() => deleteTodo(todo.id)}>Delete</button>
        </div>
      ))}
    </div>
  );
}
2. 复杂数据结构的Immer操作

嵌套对象和数组的更新:

import produce from 'immer';

// 复杂的应用状态
const initialState = {
  user: {
    id: 1,
    profile: {
      name: 'John Doe',
      email: 'john@example.com',
      preferences: {
        theme: 'light',
        notifications: {
          email: true,
          push: false,
          sms: true
        }
      }
    }
  },
  posts: [
    {
      id: 1,
      title: 'First Post',
      content: 'Content here',
      comments: [
        { id: 1, text: 'Great post!', author: 'Jane' },
        { id: 2, text: 'Thanks for sharing', author: 'Bob' }
      ],
      likes: ['user1', 'user2']
    }
  ],
  settings: {
    language: 'en',
    timezone: 'UTC'
  }
};

// 更新用户主题
const updateUserTheme = (state, theme) => {
  return produce(state, draft => {
    draft.user.profile.preferences.theme = theme;
  });
};

// 添加新评论
const addComment = (state, postId, comment) => {
  return produce(state, draft => {
    const post = draft.posts.find(p => p.id === postId);
    if (post) {
      post.comments.push({
        id: Date.now(),
        text: comment.text,
        author: comment.author
      });
    }
  });
};

// 删除评论
const deleteComment = (state, postId, commentId) => {
  return produce(state, draft => {
    const post = draft.posts.find(p => p.id === postId);
    if (post) {
      const commentIndex = post.comments.findIndex(c => c.id === commentId);
      if (commentIndex > -1) {
        post.comments.splice(commentIndex, 1);
      }
    }
  });
};

// 切换点赞状态
const toggleLike = (state, postId, userId) => {
  return produce(state, draft => {
    const post = draft.posts.find(p => p.id === postId);
    if (post) {
      const likeIndex = post.likes.indexOf(userId);
      if (likeIndex > -1) {
        post.likes.splice(likeIndex, 1);
      } else {
        post.likes.push(userId);
      }
    }
  });
};

// 批量更新用户设置
const updateUserSettings = (state, settings) => {
  return produce(state, draft => {
    Object.assign(draft.user.profile.preferences, settings);
    if (settings.language) {
      draft.settings.language = settings.language;
    }
    if (settings.timezone) {
      draft.settings.timezone = settings.timezone;
    }
  });
};
3. 在Redux中使用Immer

使用Redux Toolkit(推荐):

import { createSlice, configureStore } from '@reduxjs/toolkit';

// 用户slice
const userSlice = createSlice({
  name: 'user',
  initialState: {
    currentUser: null,
    users: {},
    loading: false
  },
  reducers: {
    setCurrentUser: (state, action) => {
      state.currentUser = action.payload;
    },
    updateUser: (state, action) => {
      const { userId, updates } = action.payload;
      if (state.users[userId]) {
        Object.assign(state.users[userId], updates);
      }
    },
    addUser: (state, action) => {
      const user = action.payload;
      state.users[user.id] = user;
    },
    deleteUser: (state, action) => {
      const userId = action.payload;
      delete state.users[userId];
      if (state.currentUser?.id === userId) {
        state.currentUser = null;
      }
    }
  }
});

// 购物车slice
const cartSlice = createSlice({
  name: 'cart',
  initialState: {
    items: [],
    total: 0
  },
  reducers: {
    addItem: (state, action) => {
      const item = action.payload;
      const existingItem = state.items.find(i => i.id === item.id);
      
      if (existingItem) {
        existingItem.quantity += item.quantity;
      } else {
        state.items.push(item);
      }
      
      state.total += item.price * item.quantity;
    },
    removeItem: (state, action) => {
      const itemId = action.payload;
      const itemIndex = state.items.findIndex(i => i.id === itemId);
      
      if (itemIndex > -1) {
        const item = state.items[itemIndex];
        state.total -= item.price * item.quantity;
        state.items.splice(itemIndex, 1);
      }
    },
    updateQuantity: (state, action) => {
      const { itemId, quantity } = action.payload;
      const item = state.items.find(i => i.id === itemId);
      
      if (item) {
        const oldTotal = item.price * item.quantity;
        const newTotal = item.price * quantity;
        state.total = state.total - oldTotal + newTotal;
        item.quantity = quantity;
      }
    },
    clearCart: (state) => {
      state.items = [];
      state.total = 0;
    }
  }
});

// 配置store
const store = configureStore({
  reducer: {
    user: userSlice.reducer,
    cart: cartSlice.reducer
  }
});

export const { setCurrentUser, updateUser, addUser, deleteUser } = userSlice.actions;
export const { addItem, removeItem, updateQuantity, clearCart } = cartSlice.actions;
4. 在Context中使用Immer

创建带有Immer的Context:

import React, { createContext, useContext, useReducer } from 'react';
import produce from 'immer';

// 初始状态
const initialState = {
  user: null,
  theme: 'light',
  notifications: [],
  settings: {
    language: 'en',
    autoSave: true
  }
};

// 使用Immer的reducer
const appReducer = (state, action) => {
  return produce(state, draft => {
    switch (action.type) {
      case 'SET_USER':
        draft.user = action.payload;
        break;
      
      case 'UPDATE_USER':
        if (draft.user) {
          Object.assign(draft.user, action.payload);
        }
        break;
      
      case 'SET_THEME':
        draft.theme = action.payload;
        break;
      
      case 'ADD_NOTIFICATION':
        draft.notifications.push({
          id: Date.now(),
          ...action.payload
        });
        break;
      
      case 'REMOVE_NOTIFICATION':
        const index = draft.notifications.findIndex(n => n.id === action.payload);
        if (index > -1) {
          draft.notifications.splice(index, 1);
        }
        break;
      
      case 'UPDATE_SETTINGS':
        Object.assign(draft.settings, action.payload);
        break;
      
      default:
        break;
    }
  });
};

// 创建Context
const AppContext = createContext();

// Provider组件
export function AppProvider({ children }) {
  const [state, dispatch] = useReducer(appReducer, initialState);

  return (
    <AppContext.Provider value={{ state, dispatch }}>
      {children}
    </AppContext.Provider>
  );
}

// 自定义Hook
export function useAppContext() {
  const context = useContext(AppContext);
  if (!context) {
    throw new Error('useAppContext must be used within AppProvider');
  }
  return context;
}

// 使用示例
function UserProfile() {
  const { state, dispatch } = useAppContext();

  const updateUserName = (name) => {
    dispatch({
      type: 'UPDATE_USER',
      payload: { name }
    });
  };

  const toggleTheme = () => {
    dispatch({
      type: 'SET_THEME',
      payload: state.theme === 'light' ? 'dark' : 'light'
    });
  };

  return (
    <div>
      <h2>User Profile</h2>
      <p>Name: {state.user?.name}</p>
      <p>Theme: {state.theme}</p>
      <button onClick={() => updateUserName('New Name')}>
        Update Name
      </button>
      <button onClick={toggleTheme}>Toggle Theme</button>
    </div>
  );
}
5. 性能优化的高级用法

使用Immer的高级特性:

import produce, { enablePatches, applyPatches } from 'immer';

// 启用补丁功能
enablePatches();

// 生成补丁
const [nextState, patches, inversePatches] = produce(
  initialState,
  draft => {
    draft.user.name = 'New Name';
    draft.posts.push({ id: 3, title: 'New Post' });
  },
  true // 启用补丁生成
);

// 应用补丁
const stateAfterPatches = applyPatches(initialState, patches);

// 撤销操作
const stateAfterUndo = applyPatches(nextState, inversePatches);

// 实现撤销/重做功能
class UndoRedoStore {
  constructor(initialState) {
    this.history = [initialState];
    this.currentIndex = 0;
  }

  update(recipe) {
    const [nextState, patches] = produce(
      this.getCurrentState(),
      recipe,
      true
    );

    // 清除未来的历史记录
    this.history = this.history.slice(0, this.currentIndex + 1);
    
    // 添加新状态
    this.history.push(nextState);
    this.currentIndex++;

    return nextState;
  }

  undo() {
    if (this.currentIndex > 0) {
      this.currentIndex--;
      return this.getCurrentState();
    }
    return null;
  }

  redo() {
    if (this.currentIndex < this.history.length - 1) {
      this.currentIndex++;
      return this.getCurrentState();
    }
    return null;
  }

  getCurrentState() {
    return this.history[this.currentIndex];
  }

  canUndo() {
    return this.currentIndex > 0;
  }

  canRedo() {
    return this.currentIndex < this.history.length - 1;
  }
}

// 使用示例
const store = new UndoRedoStore(initialState);

// 更新状态
const newState = store.update(draft => {
  draft.user.name = 'Updated Name';
});

// 撤销
const undoState = store.undo();

// 重做
const redoState = store.redo();

Immer使用流程图:

graph TD
    A[开始使用Immer] --> B{选择使用场景}
    B --> C[React Hook]
    B --> D[Redux]
    B --> E[Context API]
    B --> F[普通函数]
    
    C --> G[使用produce包装setState]
    D --> H[Redux Toolkit自动集成]
    E --> I[在useReducer中使用]
    F --> J[直接使用produce函数]
    
    G --> K[编写直观的更新逻辑]
    H --> K
    I --> K
    J --> K
    
    K --> L{需要高级功能?}
    L -->|是| M[启用补丁功能]
    L -->|否| N[基础使用]
    
    M --> O[实现撤销/重做]
    M --> P[状态同步]
    
    N --> Q[享受简洁的代码]
    O --> Q
    P --> Q
    
    Q --> R[性能优化完成]
    
    style R fill:#99ff99
    style K fill:#99ccff
6. 最佳实践和注意事项

Immer使用最佳实践:

// ✅ 好的做法
const goodPractice = produce(state, draft => {
  // 直接修改draft
  draft.user.name = 'New Name';
  draft.posts.push(newPost);
  
  // 使用数组方法
  draft.items.sort((a, b) => a.priority - b.priority);
  
  // 删除属性
  delete draft.user.tempProperty;
});

// ❌ 避免的做法
const badPractice = produce(state, draft => {
  // 不要return一个新对象
  return {
    ...draft,
    user: {
      ...draft.user,
      name: 'New Name'
    }
  };
});

// ✅ 条件更新
const conditionalUpdate = produce(state, draft => {
  if (condition) {
    draft.user.status = 'active';
  } else {
    draft.user.status = 'inactive';
  }
});

// ✅ 批量操作
const batchOperations = produce(state, draft => {
  // 在一个produce调用中完成所有相关更新
  draft.user.lastLogin = new Date();
  draft.user.loginCount += 1;
  draft.notifications.push({
    id: Date.now(),
    message: 'User logged in'
  });
});

// ✅ 性能优化 - 避免不必要的produce调用
const optimizedUpdate = (state, updates) => {
  // 检查是否真的需要更新
  if (Object.keys(updates).length === 0) {
    return state;
  }
  
  return produce(state, draft => {
    Object.assign(draft.user, updates);
  });
};

性能对比与最佳实践

性能基准测试

1. 不同状态管理方案的性能对比

测试环境设置:

// 性能测试工具
class PerformanceTestSuite {
  constructor() {
    this.results = {};
  }

  // 测试函数执行时间
  measureTime(name, fn, iterations = 1000) {
    const startTime = performance.now();
    
    for (let i = 0; i < iterations; i++) {
      fn();
    }
    
    const endTime = performance.now();
    this.results[name] = {
      totalTime: endTime - startTime,
      avgTime: (endTime - startTime) / iterations,
      iterations
    };
  }

  // 测试内存使用
  measureMemory(name, fn) {
    const initialMemory = performance.memory?.usedJSHeapSize || 0;
    fn();
    const finalMemory = performance.memory?.usedJSHeapSize || 0;
    
    this.results[name] = {
      memoryUsed: finalMemory - initialMemory
    };
  }

  // 输出结果
  getResults() {
    return this.results;
  }
}

深度嵌套更新性能测试:

// 测试数据
const createTestState = () => ({
  users: Array.from({ length: 1000 }, (_, i) => ({
    id: i,
    profile: {
      name: `User ${i}`,
      settings: {
        preferences: {
          theme: 'light',
          notifications: {
            email: true,
            push: false,
            sms: true
          }
        }
      }
    }
  }))
});

// 传统不可变更新
const traditionalUpdate = (state, userId, theme) => {
  return {
    ...state,
    users: state.users.map(user =>
      user.id === userId
        ? {
            ...user,
            profile: {
              ...user.profile,
              settings: {
                ...user.profile.settings,
                preferences: {
                  ...user.profile.settings.preferences,
                  theme
                }
              }
            }
          }
        : user
    )
  };
};

// Immer更新
const immerUpdate = (state, userId, theme) => {
  return produce(state, draft => {
    const user = draft.users.find(u => u.id === userId);
    if (user) {
      user.profile.settings.preferences.theme = theme;
    }
  });
};

// 性能测试
function runPerformanceTest() {
  const testSuite = new PerformanceTestSuite();
  const testState = createTestState();

  // 测试传统方法
  testSuite.measureTime('traditional', () => {
    traditionalUpdate(testState, 500, 'dark');
  });

  // 测试Immer方法
  testSuite.measureTime('immer', () => {
    immerUpdate(testState, 500, 'dark');
  });

  console.log('Performance Test Results:', testSuite.getResults());
}
2. 内存使用对比

内存使用测试:

// 内存使用测试
function memoryUsageTest() {
  const testSuite = new PerformanceTestSuite();
  
  // 大型状态对象
  const largeState = {
    data: Array.from({ length: 10000 }, (_, i) => ({
      id: i,
      value: Math.random(),
      children: Array.from({ length: 10 }, (_, j) => ({
        id: j,
        data: `child-${i}-${j}`
      }))
    }))
  };

  // 传统方法内存测试
  testSuite.measureMemory('traditional-memory', () => {
    const results = [];
    for (let i = 0; i < 100; i++) {
      const newState = {
        ...largeState,
        data: largeState.data.map(item => 
          item.id === i ? { ...item, value: Math.random() } : item
        )
      };
      results.push(newState);
    }
  });

  // Immer方法内存测试
  testSuite.measureMemory('immer-memory', () => {
    const results = [];
    for (let i = 0; i < 100; i++) {
      const newState = produce(largeState, draft => {
        draft.data[i].value = Math.random();
      });
      results.push(newState);
    }
  });

  console.log('Memory Usage Results:', testSuite.getResults());
}
3. 组件重渲染性能测试

React组件重渲染测试:

// 测试组件重渲染次数
let renderCount = 0;

function TestComponent({ data }) {
  renderCount++;
  
  useEffect(() => {
    console.log(`Component rendered ${renderCount} times`);
  });

  return <div>{data.value}</div>;
}

// 状态更新测试
function RenderPerformanceTest() {
  const [state, setState] = useState({ value: 0, otherValue: 0 });

  const traditionalUpdate = () => {
    setState(prev => ({
      ...prev,
      value: prev.value + 1
    }));
  };

  const immerUpdate = () => {
    setState(produce(draft => {
      draft.value += 1;
    }));
  };

  return (
    <div>
      <TestComponent data={state} />
      <button onClick={traditionalUpdate}>Traditional Update</button>
      <button onClick={immerUpdate}>Immer Update</button>
    </div>
  );
}

最佳实践指南

1. 选择合适的状态管理方案

状态管理方案选择流程图:

graph TD
    A[开始选择状态管理方案] --> B{应用复杂度}
    B -->|简单| C[本地状态 + useState]
    B -->|中等| D[Context API + useReducer]
    B -->|复杂| E[Redux + Redux Toolkit]
    
    C --> F{需要复杂更新?}
    F -->|是| G[添加Immer]
    F -->|否| H[保持原生方式]
    
    D --> I{数据结构复杂?}
    I -->|是| J[使用Immer + Context]
    I -->|否| K[原生Context]
    
    E --> L[默认使用Redux Toolkit]
    L --> M[自带Immer集成]
    
    G --> N[性能优化完成]
    H --> N
    J --> N
    K --> N
    M --> N
    
    style N fill:#99ff99
    style C fill:#99ccff
    style D fill:#99ccff
    style E fill:#99ccff
2. 性能优化策略

状态管理性能优化清单:

// 1. 状态结构优化
const optimizedStateStructure = {
  // ✅ 扁平化结构
  users: { 
    byId: {},
    allIds: []
  },
  
  // ✅ 分离频繁更新的状态
  ui: {
    loading: false,
    error: null
  },
  
  // ✅ 缓存计算结果
  computed: {
    sortedUsers: [],
    filteredUsers: []
  }
};

// 2. 选择器优化
import { createSelector } from 'reselect';

const getUsers = state => state.users.byId;
const getUserIds = state => state.users.allIds;
const getFilter = state => state.ui.filter;

const getFilteredUsers = createSelector(
  [getUsers, getUserIds, getFilter],
  (users, userIds, filter) => {
    if (!filter) return userIds.map(id => users[id]);
    
    return userIds
      .map(id => users[id])
      .filter(user => user.name.includes(filter));
  }
);

// 3. 组件优化
const OptimizedUserList = React.memo(({ users }) => {
  return (
    <div>
      {users.map(user => (
        <UserItem key={user.id} user={user} />
      ))}
    </div>
  );
});

// 4. 批量更新
const batchUpdateUsers = (updates) => {
  return produce(state, draft => {
    updates.forEach(({ userId, changes }) => {
      if (draft.users.byId[userId]) {
        Object.assign(draft.users.byId[userId], changes);
      }
    });
  });
};
3. 代码分割和懒加载

状态管理的代码分割:

// 动态加载reducer
const loadUserReducer = () => import('./reducers/userReducer');
const loadProductReducer = () => import('./reducers/productReducer');

// 懒加载状态管理
const LazyStateProvider = ({ children }) => {
  const [reducers, setReducers] = useState({});
  
  const loadReducer = async (name, loader) => {
    if (!reducers[name]) {
      const module = await loader();
      setReducers(prev => ({
        ...prev,
        [name]: module.default
      }));
    }
  };

  return (
    <StateContext.Provider value={{ reducers, loadReducer }}>
      {children}
    </StateContext.Provider>
  );
};

// 组件级懒加载
const LazyUserComponent = React.lazy(() => 
  import('./UserComponent').then(module => ({
    default: module.UserComponent
  }))
);
4. 监控和调试

性能监控工具:

// 性能监控中间件
const performanceMiddleware = store => next => action => {
  const startTime = performance.now();
  
  const result = next(action);
  
  const endTime = performance.now();
  const duration = endTime - startTime;
  
  if (duration > 5) { // 超过5ms的操作
    console.warn(`Slow action: ${action.type} took ${duration}ms`);
  }
  
  return result;
};

// 状态变化监控
const stateChangeMonitor = {
  track: (stateName, oldState, newState) => {
    const changed = oldState !== newState;
    if (changed) {
      console.log(`State changed: ${stateName}`, {
        before: oldState,
        after: newState
      });
    }
  }
};

// 内存泄漏检测
const memoryLeakDetector = {
  subscribers: new Set(),
  
  subscribe: (callback) => {
    this.subscribers.add(callback);
    return () => this.subscribers.delete(callback);
  },
  
  checkForLeaks: () => {
    if (this.subscribers.size > 100) {
      console.warn('Potential memory leak: too many subscribers');
    }
  }
};

实际项目应用建议

1. 渐进式迁移策略

从传统状态管理迁移到Immer:

// 第一步:包装现有的setState
const useImmerState = (initialState) => {
  const [state, setState] = useState(initialState);
  
  const setImmerState = useCallback((updater) => {
    setState(produce(updater));
  }, []);
  
  return [state, setImmerState];
};

// 第二步:逐步替换复杂的状态更新
const UserProfile = () => {
  const [profile, setProfile] = useImmerState({
    personal: { name: '', age: 0 },
    preferences: { theme: 'light' },
    contacts: []
  });

  const updatePersonalInfo = (updates) => {
    setProfile(draft => {
      Object.assign(draft.personal, updates);
    });
  };

  return (
    <div>
      {/* 组件内容 */}
    </div>
  );
};
2. 团队协作规范

代码规范和最佳实践:

// 状态管理规范
const StateManagementGuidelines = {
  // 1. 命名规范
  actionTypes: {
    // 使用动词 + 名词格式
    UPDATE_USER: 'UPDATE_USER',
    DELETE_USER: 'DELETE_USER',
    FETCH_USERS_SUCCESS: 'FETCH_USERS_SUCCESS'
  },

  // 2. 状态结构规范
  stateStructure: {
    // 使用规范化状态结构
    entities: {
      users: { byId: {}, allIds: [] },
      posts: { byId: {}, allIds: [] }
    },
    ui: {
      loading: false,
      error: null
    }
  },

  // 3. 更新规范
  updateGuidelines: {
    // 使用Immer进行复杂更新
    complexUpdate: (state, payload) => produce(state, draft => {
      // 直接修改draft
      draft.entities.users.byId[payload.id] = payload.user;
    }),

    // 简单更新可以使用展开运算符
    simpleUpdate: (state, payload) => ({
      ...state,
      loading: payload.loading
    })
  }
};

性能优化总结流程图:

graph TD
    A[性能优化开始] --> B[分析当前状态]
    B --> C{识别性能瓶颈}
    C --> D[频繁重渲染]
    C --> E[内存使用过高]
    C --> F[状态更新缓慢]
    
    D --> G[使用React.memo]
    D --> H[优化选择器]
    D --> I[拆分组件]
    
    E --> J[使用Immer结构共享]
    E --> K[清理无用状态]
    E --> L[实现状态懒加载]
    
    F --> M[批量更新]
    F --> N[使用Immer简化更新]
    F --> O[优化数据结构]
    
    G --> P[监控性能指标]
    H --> P
    I --> P
    J --> P
    K --> P
    L --> P
    M --> P
    N --> P
    O --> P
    
    P --> Q{性能达标?}
    Q -->|是| R[优化完成]
    Q -->|否| S[进一步优化]
    
    S --> B
    
    style R fill:#99ff99
    style P fill:#99ccff

总结

  • 减少状态范围
  • 不同形态的优化细节
    • useState结合memo、useMemo等来完成
    • 定义provider来切割父子组件,而不要直接使用XXXContext.Provider这种定时
    • 集中状态优化,不要分散在各个组件中