当前位置: 首页 > 知识库问答 >
问题:

反转存储在状态中的数组不会强制React中组件的重新呈现

姬奇思
2023-03-14

这是一个更大的组件的一部分,但我在下面的一个可重复的例子中总结了它:

    import React, {useState} from 'react'

   
    function App() {
        const [data,setData] = useState([{name:'first'},{name:'second'},{name:'three'}])

       // Function to reverse a given array
        const reverseArray = (array) => {
          var reverseArray = array.reverse();
          return reverseArray;
        }


        return (
            <div>
                  {data.map((item,index)=>{
                         return <h1 key={index}>{item.name} index: {index}</h1>
                    })}
            

                    {/*When I click this I expect the div above to rerender */}
                    <button onClick={()=>{
                        var newData = data;
                        setData(reverseArray(newData))}
                    }>
                      Reverse Order
                     </button>

                    {/* Logs state to the console to check order is reversed */}
                    <button onClick={()=>console.log(data)}>Log Data</button>

                    {/* Clearing the state by setting to empty array */}
                    <button onClick={()=>setData([ ])}>Clear Data</button>

                    
            </div>
        )
    }

我知道React中的组件在状态改变时会重新呈现,为什么将新数组设置为状态不会触发这个呢?但是在清除状态时rerender是明显的?

我的沙盒:https://codesandbox.io/s/immutable-sun-oujqj?file=/src/app.js

共有1个答案

曹驰
2023-03-14

演示:https://codesandbox.io/s/array-reverse-react-state-0v67h

array.prototype.reverse()将元素反转到位。您需要将一个新数组传递到setdata()中。

<button
  onClick={() => {
    var newData = data;

    // Create a new array using the spread operator
    setData(reverseArray([...newData])); 
  }}
>
 类似资料:
  • 问题内容: 我要说的是今天要学习react和redux,但是我不知道如何在状态更改后强制组件重新渲染。 这是我的代码: 我可以触发更新的唯一方法是使用 在构造函数内部,以便我手动触发组件的更新状态以强制重新渲染。 但是如何链接存储状态和组件状态? 问题答案: 仅当组件的状态或道具发生更改时,组件才会重新渲染。您不是依靠this.state或this.props,而是直接在render函数中获取存储

  • 问题内容: 我是新来的世界,我有这样的话: 然后单击,您将被打印在控制台上。现在将行更改为: 现在点击该按钮,我希望它会被渲染。但事实并非如此。 我不确定为什么会这样。请注意,我在方法中有上面的代码。 问题答案: 您可能希望有一个状态组件,该状态组件在单击按钮之后在按钮旁边显示另一个组件。您需要做的就是跟踪按钮是否被单击:

  • 但我的问题是我如何强制上面的功能组件重新呈现立即与钩子?

  • 问题内容: 是否可以在React组件的状态下存储对象?如果是,那么我们如何使用来更改该对象中键的值?我认为在语法上不允许这样写: 同样,我还有一个问题:在React组件中可以有一组变量,以便可以在组件的任何方法中使用它们,而不是将它们存储在状态中,这还可以吗? 您可以创建一个包含所有这些变量的简单对象,并将其放在组件级别,就像在组件上声明任何方法一样。 很可能会遇到这样的情况,即您在代码中包含了很

  • 我正在学习React钩子,这意味着我将不得不从类转移到函数组件。以前,在类中,我可以拥有与状态无关的类变量,我可以在不重新呈现组件的情况下更新这些变量。现在我试图用钩子重新创建一个组件作为函数组件,我遇到了这样一个问题:我不能(就我所知)为该函数创建变量,因此存储数据的唯一方法是通过钩子。然而,这意味着每当该状态更新时,我的组件将重新呈现。 我已经在下面的示例中说明了这一点,我试图将类组件重新创建

  • 我知道mapstatetoprops正在将我们的Redux应用程序状态映射到我们的React组件道具,但是我不太明白当减速器返回一个新的状态时,幕后会发生什么——这是如何触发将道具映射到应用程序级别的组件的重新渲染的州? 在纯React中,setState触发重新渲染正确吗?类似的事情(或同样的事情)通过Redux发生吗?