首页 > web前端 > js教程 > React 自动优化:再见 memo、useMemo 和 useCallback?

React 自动优化:再见 memo、useMemo 和 useCallback?

Mary-Kate Olsen
发布: 2025-01-07 20:31:41
原创
522 人浏览过

React Automatic Optimization: Goodbye memo, useMemo, and useCallback?

React 19 为性能优化带来了显着改进,特别是在处理记忆化方面。让我们探讨一下 memo、useMemo 和 useCallback 是如何演变的以及它们现在默认情况下是如何优化的。

React 中记忆化的演变

之前在 React 18 中,开发人员必须仔细考虑何时使用记忆技术来防止不必要的重新渲染并优化性能。 React 19 通过引入自动优化来改变这种范式,使这些工具更加高效,并且在许多情况下是不必要的。

React 19 中的备忘录:更智能的组件记忆

React 19 的备忘录现在对于何时重新渲染组件变得更加智能。框架自动跟踪 prop 更改及其对组件输出的影响。

示例1:基本道具比较

// React 18
const UserCard = memo(({ user, onUpdate }) => {
  return (
    <div>
      <h2>{user.name}</h2>
      <button onClick={onUpdate}>Update</button>
    </div>
  );
});

// React 19
// memo is now automatically optimized
const UserCard = ({ user, onUpdate }) => {
  return (
    <div>
      <h2>{user.name}</h2>
      <button onClick={onUpdate}>Update</button>
    </div>
  );
});
登录后复制

示例 2:嵌套组件

// React 18
const CommentThread = memo(({ comments, onReply }) => {
  return (
    <div>
      {comments.map(comment => (
        <Comment 
          key={comment.id}
          {...comment}
          onReply={onReply}
        />
      ))}
    </div>
  );
});

// React 19
const CommentThread = ({ comments, onReply }) => {
  return (
    <div>
      {comments.map(comment => (
        <Comment 
          key={comment.id}
          {...comment}
          onReply={onReply}
        />
      ))}
    </div>
  );
});
登录后复制

useMemo:自动值记忆

React 19 的 useMemo 现已优化,可以自动检测记忆化何时有益,从而减少手动优化的需要。

示例 1:昂贵的计算

// React 18
const ExpensiveChart = ({ data }) => {
  const processedData = useMemo(() => {
    return data.map(item => ({
      ...item,
      value: complexCalculation(item.value)
    }));
  }, [data]);

  return <ChartComponent data={processedData} />;
};

// React 19
const ExpensiveChart = ({ data }) => {
  // React 19 automatically detects expensive operations
  const processedData = data.map(item => ({
    ...item,
    value: complexCalculation(item.value)
  }));

  return <ChartComponent data={processedData} />;
};
登录后复制

示例 2:对象引用

// React 18
const UserProfile = ({ user }) => {
  const userStyles = useMemo(() => ({
    background: user.premium ? 'gold' : 'silver',
    border: `2px solid ${user.active ? 'green' : 'gray'}`
  }), [user.premium, user.active]);

  return <div>



<h3>
  
  
  Example 3: Derived State
</h3>



<pre class="brush:php;toolbar:false">// React 18
const FilteredList = ({ items, filter }) => {
  const filteredItems = useMemo(() => 
    items.filter(item => item.category === filter),
    [items, filter]
  );

  return <List items={filteredItems} />;
};

// React 19
const FilteredList = ({ items, filter }) => {
  // React 19 automatically optimizes derived state
  const filteredItems = items.filter(item => item.category === filter);
  return <List items={filteredItems} />;
};
登录后复制

useCallback:更智能的函数记忆

React 19 的 useCallback 现在在函数稳定性和引用相等性方面更加智能。

示例 1:事件处理程序

// React 18
const TodoList = ({ todos, onToggle }) => {
  const handleToggle = useCallback((id) => {
    onToggle(id);
  }, [onToggle]);

  return todos.map(todo => (
    <TodoItem 
      key={todo.id}
      {...todo}
      onToggle={handleToggle}
    />
  ));
};

// React 19
const TodoList = ({ todos, onToggle }) => {
  // React 19 automatically maintains function stability
  const handleToggle = (id) => {
    onToggle(id);
  };

  return todos.map(todo => (
    <TodoItem 
      key={todo.id}
      {...todo}
      onToggle={handleToggle}
    />
  ));
};
登录后复制

示例 2:具有依赖关系的回调

// React 18
const SearchComponent = ({ onSearch, searchParams }) => {
  const debouncedSearch = useCallback(
    debounce((term) => {
      onSearch({ ...searchParams, term });
    }, 300),
    [searchParams, onSearch]
  );

  return <input onChange={e => debouncedSearch(e.target.value)} />;
};

// React 19
const SearchComponent = ({ onSearch, searchParams }) => {
  // React 19 handles function stability automatically
  const debouncedSearch = debounce((term) => {
    onSearch({ ...searchParams, term });
  }, 300);

  return <input onChange={e => debouncedSearch(e.target.value)} />;
};
登录后复制

示例 3:复杂事件处理

// React 18
const DataGrid = ({ data, onSort, onFilter }) => {
  const handleHeaderClick = useCallback((column) => {
    onSort(column);
    onFilter(column);
  }, [onSort, onFilter]);

  return (
    <table>
      <thead>
        {columns.map(column => (
          <th key={column} onClick={() => handleHeaderClick(column)}>
            {column}
          </th>
        ))}
      </thead>
      {/* ... */}
    </table>
  );
};

// React 19
const DataGrid = ({ data, onSort, onFilter }) => {
  // React 19 optimizes function creation and stability
  const handleHeaderClick = (column) => {
    onSort(column);
    onFilter(column);
  };

  return (
    <table>
      <thead>
        {columns.map(column => (
          <th key={column} onClick={() => handleHeaderClick(column)}>
            {column}
          </th>
        ))}
      </thead>
      {/* ... */}
    </table>
  );
};
登录后复制

React 19 优化的主要优点

  1. 减少样板文件:减少对显式记忆化包装代码的需求
  2. 自动性能:React 智能处理组件更新
  3. 更好的开发者体验:更少的优化决策
  4. 改进了捆绑包大小:更少的记忆代码意味着更小的捆绑包
  5. 自动稳定性:更好地处理引用相等性
  6. 智能重新渲染:更高效的更新调度

何时仍使用显式记忆

虽然 React 19 的自动优化非常强大,但在某些情况下显式记忆可能会有所帮助:

  1. 当您需要确保记住非常昂贵的计算时
  2. 在处理复杂的数据结构并希望保证引用稳定性时
  3. 在需要细粒度控制的性能关键型应用中
  4. 与需要稳定引用的外部库集成时

结论

React 19 对记忆化的改进使得编写高性能应用程序变得更加容易,而无需手动管理优化。该框架现在可以自动处理许多常见的优化场景,从而使代码更干净,开箱即用的性能更好。

请记住,虽然这些优化功能强大,但了解它们的工作原理可以帮助您更好地决定何时依赖自动优化以及何时针对特定用例实施手动优化。

编码快乐!

以上是React 自动优化:再见 memo、useMemo 和 useCallback?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板