javascript - 状态更改时不渲染

标签 javascript arrays reactjs sorting

我正在学习 react 。我正在尝试根据名称对列表进行排序。 ShoppingList组件是

const ShoppingList = () => {
    const [items, setItems] = useState([]);

    const data = [
        {id: 1, name: 'Soda'},
        {id: 2, name: 'ice'},
    ];

    useEffect(() => {
        setItems(data);
    }, []);
    
    const handleSort = () => {}
   return ();

}

单击按钮后,我尝试对数据进行排序并显示它。

<button onClick={() => handleSort()}>Sort by name</button>

handleSort()内功能

const sortItems = items.sort((a, b) => {
    const nameA = a.name.toUpperCase();
    const nameB = b.name.toUpperCase();
    if(nameA < nameB)
        return -1;
    if(nameA > nameB)
        return 1;
    return 0;
});

console.log(sortItems);
setItems(sortItems);

console.log(sortItems)显示排序后的数组。但不在 DOM 中渲染。 里面return ,我正在尝试以这种格式显示排序后的数据

<ul>
    {items.map((item) => {
        return (
            <li key={item.id}>
              <span>{item.name}&nbsp;</span>
              <button onClick={() => handleRemove(item.id)}>&times;</button>
            </li>
        );
        })
     }
</ul>

我在这里缺少什么?

最佳答案

我建议使用 useMemo 派生排序的项目列表,因此它的“派生状态”取决于项目数组和所需的排序顺序。

  • 不要使用 useEffect 作为初始状态。 useState 接受初始状态的创建者函数。
  • localeCompare 是返回 -1、0、+1 进行比较的更简洁方法。
  • [...items](items 的浅拷贝)是必需的,因为 .sort() 对数组进行排序 -地点。
const sortByName = (a, b) => a.name.toUpperCase().localeCompare(b.name.toUpperCase());

const ShoppingList = () => {
  const [items, setItems] = useState(() => [
    { id: 1, name: "Soda" },
    { id: 2, name: "ice" },
  ]);
  const [sortOrder, setSortOrder] = useState("original");
  const sortedItems = React.useMemo(() => {
    switch (sortOrder) {
      case "byName":
        return [...items].sort(sortByName);
      default:
        return items;
    }
  }, [items, sortOrder]);

  return (
    <>
      <button onClick={() => setSortOrder("byName")}>Sort by name</button>
      <button onClick={() => setSortOrder("original")}>Sort in original order</button>
      <ul>
        {sortedItems.map((el, i) => (
          <li key={el.id}>
            <span>{el.name}&nbsp;</span>
            <button>&times;</button>
          </li>
        ))}
      </ul>
    </>
  );
};

关于javascript - 状态更改时不渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67709993/

相关文章:

javascript - 监视 componentDidMount 中的方法调用

JavaScript - 未捕获的类型错误 : Cannot set property 'onclick' of null (Search Bar)

c - C中每次将一对数字存储在一个一维数组中

arrays - as3 URLRequest声音存储在数组中吗?

javascript - IntelliSense 不适用于我自己的 React 组件库

java - 如何使用 JavaScript 获取输入表单值以及整个页面 HTML 源并将其传递给支持 bean?

python - 适用于 numpy 数组和 pandas 数据帧的列切片方法

reactjs - 如何检查 React 元素是否会渲染任何内容

reactjs - 如何在 NextJS 中为 getStaticProps 导入 API 路由?

javascript - 使用 Ruby on Rails 绘制过去 30 天的 Highcharts 数据