简体   繁体   English

React 不会在 state 更新上重新渲染

[英]React doesn't rerender on state update

I am displaying components on base of state which is an array.我在 state 的基础上显示组件,这是一个数组。 When I am trying to sort this state it doesn't rerender components rendered on base of it.当我试图对这个 state 进行排序时,它不会重新渲染基于它呈现的组件。 I want to sort on base of sortBy state so when its being changed (using select) I invoke sorting function using useEffect().我想在 sortBy state 的基础上进行排序,所以当它被更改时(使用 select),我使用 useEffect() 调用排序 function。 What am I doing wrong?我究竟做错了什么?

const sortCountries = () => {
    switch (sortBy) {
      case sortBySwitchList.Alphabetically:
        setCountriesArr((prev) =>
          prev.sort((a, b) =>
            a.name.common < b.name.common
              ? -1
              : a.name.common > b.name.common
              ? 1
              : 0
          )
        );
        break;
      case sortBySwitchList.AlphabeticallyReversed:
        setCountriesArr((prev) =>
          prev.sort((a, b) =>
            a.name.common < b.name.common
              ? 1
              : a.name.common > b.name.common
              ? -1
              : 0
          )
        );
        break;
      default:
        return;
    }
  };
  const changeSortBy = (e) => {
    setSortBy(e.target.value);
  };

  useEffect(() => {
    sortCountries();
  }, [sortBy]);
***part in which I am rendering***
{countriesArr.map((item) => {
          return (
            <CountryComponent
              key={item.name.common}
              flag={item.flags.png}
              name={item.name.common}
              population={item.population}
              region={item.region}
              capital={item.capital}
            />
          );
        })}

Sort does sorting an Array in place (mutates the original array) so instead make a copy of it and then sort like so.. Sort确实对 Array 进行了就地排序(改变了原始数组),因此请对其进行复制,然后像这样进行排序..

same for the other sort you are doing:)你正在做的其他sort也是如此:)

setCountriesArr((prev) =>
      [...prev].sort((a, b) =>
        a.name.common < b.name.common
          ? -1
          : a.name.common > b.name.common
          ? 1
          : 0
      )
    );

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM