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

ReactJS--在调用“setstate”时是否调用render?

竺翰海
2023-03-14

React是否在每次调用setstate()时重新呈现所有组件和子组件?

如果是,为什么?我认为这个想法是,当状态改变时,只会根据需要提供少量的反应。

this.setState({'test':'me'});

我希望只有在state数据发生更改时才会出现呈现。

下面是示例的代码,作为JS Fiddle和嵌入的代码片段:

var TimeInChild = React.createClass({
    render: function() {
        var t = new Date().getTime();

        return (
            <p>Time in child:{t}</p>
        );
    }
});

var Main = React.createClass({
    onTest: function() {
        this.setState({'test':'me'});
    },

    render: function() {
        var currentTime = new Date().getTime();

        return (
            <div onClick={this.onTest}>
            <p>Time in main:{currentTime}</p>
            <p>Click me to update time</p>
            <TimeInChild/>
            </div>
        );
    }
});

ReactDOM.render(<Main/>, document.body);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.0/react-dom.min.js"></script>

共有1个答案

郏瀚
2023-03-14

React是否在每次调用setState时重新呈现所有组件和子组件?

默认情况下-是。

boolean有一个方法shouldComponentUpdate(object nextProps,object nextState),每个组件都有这个方法,它负责确定“组件是否应该更新(运行呈现函数)?”每次更改状态或从父组件传递新道具时。

您可以为组件编写自己的shouldComponentUpdate方法实现,但默认实现总是返回真正意义上的always re-run render函数。

引用官方文档http://facebook.github.io/react/docs/component-specs.html#updating-shouldcomponentupdate

默认情况下,shouldComponentUpdate总是返回true,以防止在状态发生变化时出现细微的bug,但是如果您谨慎地始终将状态视为不可变的,并且从render()中的props和state只读,那么您可以使用一个实现来覆盖shouldComponentUpdate,该实现将旧的props和state与它们的替换项进行比较。

问题的下一部分:

如果是,为什么?我认为这个想法是,当状态发生变化时,只在需要的时候做出很小的反应。

我们可以称之为“渲染”有两个步骤:

原生DOM呈现:React仅在虚拟DOM中更改真实DOM节点时才在浏览器中更改它们,并且只需更改少量--这是great React的特性,它优化了真实DOM的变化,使React更快。

 类似资料:
  • 问题内容: 每次调用时,React都会重新渲染所有组件和子组件吗? 如果是这样,为什么?我以为这个想法是,当状态改变时,React只渲染所需的内容。 在下面的简单示例中,尽管onClick处理程序始终将设置为相同的值,但是在随后的单击中状态不会改变,这两个类在单击文本时都再次呈现。 我曾希望只有在数据更改的情况下才会进行渲染。 这是示例代码,例如JS Fiddle和嵌入式代码段: 问题答案: 每次

  • 问题内容: 每次调用时,React都会重新渲染所有组件和子组件吗? 如果是这样,为什么?我以为这个想法是,当状态改变时,React只能渲染所需的内容。 在下面的简单示例中,尽管onClick处理程序始终将设置为相同的值,但是在随后的单击中状态不会改变,这两个类都在单击文本时再次呈现。 我曾希望只有在数据更改的情况下才会进行渲染。 这是示例代码,例如JS Fiddle和嵌入式代码段: 问题答案: 每

  • 问题内容: 我试图了解某些“魔术”行为的根本原因,但我无法完全解释,而从阅读ReactJS源代码中看不出来。 当响应输入中的事件而同步调用该方法时,所有操作均按预期进行。输入的“新”值已经存在,因此DOM实际上并未更新。这是非常理想的,因为这意味着光标不会跳到输入框的末尾。 但是,当运行具有完全相同结构但 异步 调用的组件时,输入的“新”值似乎不存在,从而导致ReactJS实际触摸DOM,这将导致

  • 当react组件状态发生更改时,将调用render方法。因此,对于任何状态更改,都可以在呈现方法体中执行操作。那么setState回调是否有特定的用例?

  • 我试图在反应应用程序中显示时间,并希望以12小时的格式显示。 我编写了一个函数,如果小时数显示为13或以上,则删除“12”。我想将该函数传递到setState,但仍然会得到一个语法错误。 我希望看到下午1:31,但我只是在setState行中出现了语法错误。我无法忘记这一点。 除此之外,我在之前的状态下如何通过?

  • 问题内容: React文档指出函数应该是 纯 函数,这意味着它不应该在函数中使用。但是,我相信当状态依赖于“远程”(即由ajax调用产生的结果)时。唯一的解决方案是在函数内部 就我而言。我们的用户应该可以登录。登录后,我们还需要检查用户的访问权限(ajax调用),以决定如何显示页面。代码是这样的 之所以无法显示ajax调用,是因为当用户单击LOGIN按钮时,页面会重新呈现,并且还需要ajax调用。