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

React Setstate回调已调用但呈现延迟

胡新
2023-03-14

我两天前才开始学习react,但我对react的setstate方法感到很困难,我只知道使用revstate参数(如果想根据以前的状态更改状态),并且在状态更改后立即执行回调参数(如果这个错误,请纠正我),所以我只是更改数组内容(我使用JavaScript的array.map)并且我希望它在状态更改后立即呈现,它正在更改但延迟了,它只在我再单击一次后呈现,但render方法会被调用以获得任何senpai。谢谢帮助。

句柄点击更改以根据我的按钮“onclick”上传递的索引呈现内容

class App extends React.Component {
     constructor(props){
        super(props)
        this.state = {
          clickeditem : -1
        }
    this.torender = [
      {
        display : "first",
        content : []
      },
      {
        display : "second",
        content : []
      }
    ]
}

  handleclick = (i) =>{
    this.setState(prevstate=>{
      if (prevstate.clickeditem === -1) {
        return {clickeditem : i}
      } else {
        return prevstate.clickeditem === i ? {clickeditem : -1} : {clickeditem : i}
      }
    },() => {
      return this.state.clickeditem === -1 ? (this.torender[0].content = [], this.torender[1].content = [])
        : (this.state.clickeditem === 0) ? (this.torender[0].content = ["torender-0 content","torender-0 content"],this.torender[1].content = [])
          : (this.state.clickeditem === 1) ? (this.torender[1].content = ["torender-1 content","torender-1 content"],this.torender[0].content = [])
            : null
    })
  } 

  render(){
    return(
      <div>
        <ul>
        {
        this.torender.map((item,index) => {
          return(
            <li key = {index}>
              {item.display}
                <ul>
                  {item.content.map((content,contentindex) => {
                    return(<li key = {contentindex}>{content}</li>)
                  })}
                </ul>  
            </li>
          )
        })
        }
        </ul>
        <button onClick={()=>this.handleclick(0)}>first-button</button>
        <button onClick={()=>this.handleclick(1)}>second-button</button>
      </div>
    )
  }
}
ReactDOM.render(<App />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

<div id="root"></div>

共有1个答案

邬英武
2023-03-14

实际上,您不应该使用第二个paramcallback

每当状态被更改时,React Js的生命周期就会正确地重新呈现它(请参见下图详细说明^^!)

有一些事情需要注意:

>

  • 相应地移动torender中每个项的内容-->这样可以更清楚地了解初始数据,并且不应该对其进行更改。

    之后,您只需以这种方式控制要呈现的内容

    ___________ The condition to call renderContent() method ______________
    {index === this.state.clickeditem && this.renderContent(item)}
    
    _____________renderContent() looks like below_____________
    renderContent = (item) => {
    return (
       <ul>
         {item.content.map((content, contentindex) => {
           return <li key={contentindex}>{content}</li>;
         })}
       </ul>
     );
    };
    
    class App extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          clickeditem: 0
        };
    
        this.torender = [
          {
            display: "first",
            content: ["torender-0 content", "torender-0 content"]
          },
          {
            display: "second",
            content: ["torender-1 content", "torender-1 content"]
          }
        ];
      }
    
      handleclick = (index) => {
        this.setState({clickeditem: index});
      };
    
       renderContent = (item) => {
        return (
          <ul>
            {item.content.map((content, contentindex) => {
              return <li key={contentindex}>{content}</li>;
            })}
          </ul>
        );
      };
    
      render() {
        return (
          <div>
            <ul>
              {this.torender.map((item, index) => {
                return (
                  <li key={index}>
                    {item.display}
                    {index === this.state.clickeditem && this.renderContent(item)}
                  </li>
                );
              })}
            </ul>
            <button onClick={() => this.handleclick(0)}>first-button</button>
            <button onClick={() => this.handleclick(1)}>second-button</button>
          </div>
        );
      }
    }
    
    ReactDOM.render(<App />, document.getElementById('root'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
    
    <div id="root"> </div>

  •  类似资料:
    • Flask 的设计原则中有一条是响应对象被创建并在一条可能的回调链中传递,而在 这条回调链但中的任意一个回调,您都可以修改或者替换掉他们。当请求开始被 处理时,还没有响应对象,响应对象将在这一过程中,被某个视图函数或者系统 的其他组件按照实际需要来闯将。 但是,如果您想在响应过程的结尾修改响应对象,但是这是对象还不存在,那么会发生 什么呢?一个常见的例子是您可能需要在 before-request

    • 延迟调用一个函数,直到当前调用堆栈已经清除。 使用 setTimeout() ,超时时间为1ms,将新事件添加到浏览器事件队列,并允许渲染引擎完成其工作。使用展开 (...) 运算符为函数提供任意数量的参数。 const defer = (fn, ...args) => setTimeout(fn, 1, ...args); // Example A: defer(console.log, 'a

    • Go 语言中没有提供其它面向对象语言的析构函数,但是 Go 语言提供了 defer 语句用于实现其它面向对象语言析构函数的功能 defer 语句常用于 释放资源、解除锁定 以及 错误处理 等 例如C语言中我们申请了一块内存空间,那么不使用时我们就必须释放这块存储空间 例如C语言中我们打开了一个文件,那么我们不使用时就要关闭这个文件 例如C语言中我们打开了一个数据库, 那么我们不使用时就要关闭这个数

    • 延续 让我们回到在第一章中开始的异步回调的例子,但让我稍微修改它一下来画出重点: // A ajax( "..", function(..){ // C } ); // B // A和// B代表程序的前半部分(也就是 现在),// C标识了程序的后半部分(也就是 稍后)。前半部分立即执行,然后会出现一个不知多久的“暂停”。在未来某个时刻,如果Ajax调用完成了,那么程序会回到它刚才离开的

    • 我试图在文件转换过程中删除池并集成webhooks。问题是webhook已经创建,但回调永远不会被回调。 我遵循这里的指示:https://forge.autodesk.com/en/docs/webhooks/v1/tutorials/create-a-hook-model-derivative/ web服务器由以下命令启动:

    • 我是ReactJS的新手,我现在对组件生命周期方法的工作方式感到困惑;在我的例子中,这与ReactJS. org文档完全矛盾。预期的行为是在渲染()之前执行,但是渲染()在组件迪蒙()之前执行。 我的源代码: 类变量this.cache是如果被调用在,但它占用的值如果在中调用。