You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中使用useMemo时仅返回数组首元素问题求助

问题排查:useMemo返回数组仅显示第一个元素

问题根源

你在接收useMemo返回值时误用了数组解构语法:useMemo本身返回的是完整的排序后数组,但const [sortedList] = useMemo(...)这种写法只会提取返回数组的第一个元素赋值给sortedList,这就是页面只显示单个元素的原因。

修复后的代码

去掉数组解构的方括号,直接接收完整数组即可:

import { useState, useMemo } from "react";

export default function MemoExample2() {
  const [nameList, setNameList] = useState(['a', 'b', 'r', 'e']);

  // 直接接收useMemo返回的完整数组,无需解构
  const sortedList = useMemo(() => {
    return [...nameList].sort();
  }, [nameList]);

  function addLetter(e) {
    const letter = document.querySelector("#letter").value;
    setNameList([...nameList, letter]);
  }

  return <>
    <div>Unsorted: {nameList.join(' ,')}</div>
    <div>Sorted: {sortedList.join(',')}</div>
    <input type="text" id="letter" />
    <button onClick={addLetter}>Add Name</button>
  </>
}

额外优化建议

避免直接操作DOM(document.querySelector),改用React的useRef获取输入框值,更符合React状态管理逻辑:

import { useState, useMemo, useRef } from "react";

export default function MemoExample2() {
  const [nameList, setNameList] = useState(['a', 'b', 'r', 'e']);
  const letterInputRef = useRef(null);

  const sortedList = useMemo(() => {
    return [...nameList].sort();
  }, [nameList]);

  function addLetter() {
    const letter = letterInputRef.current.value.trim();
    if (letter) {
      // 使用函数式更新确保获取最新状态
      setNameList(prevList => [...prevList, letter]);
      letterInputRef.current.value = ''; // 添加后清空输入框
    }
  }

  return <>
    <div>Unsorted: {nameList.join(' ,')}</div>
    <div>Sorted: {sortedList.join(',')}</div>
    <input type="text" ref={letterInputRef} />
    <button onClick={addLetter}>Add Name</button>
  </>
}

内容的提问来源于stack exchange,提问作者Prakhar Nigam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 05:05:19