【问题标题】:Context Provider not re-rendering on state change上下文提供程序不会在状态更改时重新呈现
【发布时间】:2021-06-26 19:48:43
【问题描述】:

这是代码。

const [coins, setCoins] = useState([])
const [sortedCoins, setSortedCoins] = useState([])

使用useEffect,我从 API 代码请求并将其存储在硬币中,然后我将相同的数据存储在 sortedCoins,然后使用此函数我对其进行排序(可能缺少一些 },因为它只是函数的一部分,本质上是按名称对数据进行排序的部分)。

const sort = (e) => {
    let name = e.target.getAttribute("name");

    if (name === "cryptonames") {
      let temp = coins;

      temp = temp.sort((a, b) => {
        return a.name.localeCompare(b.name);
        
      });

      setSortedCoins(temp);
}

现在在另一个组件上我这样做:

{sortedCoins.map((coin) => {
        return <SpecificCoin key={coin.id} {...coin}></SpecificCoin>;
      })}

我的问题是,即使排序成功并且 sortedCoins 是一个按名称排序的数组(我使用 CoinGecko API 处理加密货币),我的 SpecificCoin 列表没有重新渲染,它保持默认方式.

非常感谢任何帮助!

【问题讨论】:

    标签: javascript reactjs react-context coingecko


    【解决方案1】:

    说实话,我不能说我完全理解你的问题,但我可以看出你的排序功能有问题

          let temp = coins;
    

    不要将数组等同于变量,因为它不会创建数组的副本,并且对 temp 的任何更改都意味着您正在直接改变 coins 状态变量,这不会导致重新如果要对其进行任何更改,请渲染。试试

    let temp = [...coins]
    

    let temp = coins.slice()
    

    其次,

    temp = temp.sort((a, b) => {
    ...
    

    数组上的sort()会改变数组本身,所以不需要这样做,而是去

     temp.sort((a, b) => {
        ...
    

    那么当你做setSortedCoins(temp)时,可能会导致重新渲染,因为你会按照规定的方式更新数组状态变量

    【讨论】:

    • 于是我和一个朋友找到了另一种方法来解决这个问题,基本上我们在 useTimeout 中运行函数,首先我们将 sortedCoins 数组设置为空,然后是 Temp 变量的逻辑,然后 setSortedCoins(temp) .这很有效,因为我的朋友说,如果只有对象的顺序发生了变化,React 就无法检测包含对象的数组的状态是否发生了变化。但是,您的方法非常有效,我不能完全理解为什么它的效果这么好?你能进一步解释一下为什么现在渲染成功了吗?
    • 当然可以。你看,当它使用的状态、道具或上下文发生变化时,react 中的组件会重新渲染。现在,正如我所说,您的sort 函数正在做的是将一个状态变量 (coins),它是一个数组,等同于另一个变量 temp。这并不意味着 temp 是硬币的副本,而是 temp 指代硬币(这就是数组和变量分配的工作方式)。现在,如果您对 temp 进行任何更改,它也会以 React 认为非法的方式突变/更改 coins,因为您应该更改 coins 的唯一方法是通过 setCoins
    • coins 是如何变异的?好吧,当你运行temp.sort() 时,你实际上运行了coins.sort()(请记住,temp 指的是coin,因为你在那里使用了一个简单的=),而Array.prototype.sort() 函数修改了它所操作的数组,所以它对coins 数组进行了排序。这并没有触发重新渲染,但 coins 数组已重新排列。通过我的方式,您永远不会更改 coins 数组,而是创建它的副本,对副本进行排序,然后将副本设置为另一个状态变量 sortedCoins。所以,coins 数组没有被改变,你得到了 sortedCoins 排序,你使用了。
    • 好的,非常感谢。现在更有意义了,我来自 Java 背景,所以 temp = coin 对我来说看起来就像我只是从硬币中获取价值并将其分配给 temp,但没有 temp 指向硬币。再次感谢!
    • 没问题,发生在我们最好的人身上。如果这对您有帮助,请点赞!
    猜你喜欢
    • 2019-01-09
    • 1970-01-01
    • 2021-07-10
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    • 2020-09-05
    • 1970-01-01
    相关资源
    最近更新 更多