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

React:当父组件重写时,子组件总是重写吗?

汤昊
2023-03-14

我有3个组件: 组件负责呈现 ,但其方式不同。

的render函数在运行时之前静态声明 ,如下所示:

 <StaticParent>
    <Child />
 </StaticParent>

则处理在运行时动态接收和呈现 ,如下所示:

 <DynamicParent>
    { this.props.children }
 </DynamicParent>

都具有onclick侦听器,以便在单击时更改其状态和重写器。我注意到,当单击 时,它和 都将被重新呈现。但是当我单击 时,将只重新呈现父级,而不是

是一个没有ShouldComponentUpdate()的功能组件,所以我不明白为什么它不能重播。有人能解释一下为什么会这样吗?我在与这个用例相关的文档中找不到任何东西。

共有1个答案

黄元章
2023-03-14

我将发布上下文的实际代码:

class Application extends React.Component {
  render() {
    return (
      <div>
        {/* 
          Clicking this component only logs 
          the parents render function 
        */}
        <DynamicParent>
          <Child />
        </DynamicParent>

        {/* 
          Clicking this component logs both the 
          parents and child render functions 
        */}
        <StaticParent />
      </div>
    );
  }
}

class DynamicParent extends React.Component {
  state = { x: false };
  render() {
    console.log("DynamicParent");
    return (
      <div onClick={() => this.setState({ x: !this.state.x })}>
        {this.props.children}
      </div>
    );
  }
}

class StaticParent extends React.Component {
  state = { x: false };
  render() {
    console.log("StaticParent");
    return (
      <div onClick={() => this.setState({ x: !this.state.x })}>
        <Child />
      </div>
    );
  }
}

function Child(props) {
  console.log("child");
  return <div>Child Texts</div>;
}

在应用程序呈现中编写此代码时:

<StaticParent />

呈现的是这样的:

 <div onClick={() => this.setState({ x: !this.state.x })}>
    <Child />
 </div>
function StaticParent(props) {
  return React.createElement(
    "div",
    { onClick: () => this.setState({ x: !this.state.x }) },
    React.createElement(Child, null)
  );
}

React.createElement(StaticParent, null);
<DynamicParent>
    <Child />
</DynamicParent>
function DynamicParent(props) {
    return React.createElement(
        "div",
        { 
            onClick: () => this.setState({ x: !this.state.x }), 
            children: props.children 
        }
    );
}

React.createElement(
      DynamicParent,
      { children: React.createElement(Child, null) },
);

这是两种情况下的孩子:

function Child(props) {
    return React.createElement("div", props, "Child Text");
}

这是什么意思?那么,在StaticParent组件中,每次调用StaticParent的render方法时都调用react.createElement(Child,null)。在DynamicParent案例中,子级只创建一次并作为道具传递。由于react.createElement是一个纯函数,因此可能会将其存储在某个地方以提高性能。

在DynamicParent案例中,使Child的呈现再次运行的是Child道具的更改。例如,如果父级的状态被用作子级的道具,那么在这两种情况下都将触发重新呈现。

 类似资料:
  • 我已经创建了一个按钮和文本组件,并将它们包含在搜索组件中。现在,我想用搜索组件的处理程序覆盖按钮的默认handleClick事件。但this.handleClick指向按钮组件的事件处理程序。。请帮忙。。我需要从搜索中单击,而不是从按钮中获取。。

  • 所以我正在重写一个带有钩子的组件,我遇到了一个有趣的挑战,我需要用钩子模仿的一些旧行为。 我的旧代码如下所示: 你看,我正在基于nextrops启动一个,然后在语句中,我基于该nextVal进行了一些检查,现在,我知道我们可以为指定第二个参数,以便仅在道具更改时运行它,但是这些检查呢,如何实现类似于?

  • 我对react还比较陌生,我一直在分解一个web应用程序,并用react组件替换部分。我现在正在开发一个组件,其中包含我创建的几个不同组件。 在新组件中,我在componentDidMount函数中进行API调用,并创建子组件。乍一看,一切看起来都很完美,但当我们在其中一个子组件中进行状态更改,然后在父组件中进行更改时,子组件将其状态重置为更改之前的状态。 我知道发生了什么,州政府没有被传递给家长

  • 诉求:react父组件某些值改变后,需要让子组件同步更新,但是这个过程不能让父组件重新渲染 请帮忙罗列下所有可能的方式

  • 我在React路由器2.2.1中使用React 15.0.1。我将应用程序用作父组件,它呈现从路由器处理程序传递的子组件。 这是我的导航栏组件。 这些是我的路线处理程序。当用户在路由上着陆时,将对其进行身份验证检查。如果身份验证失败,它们将被重定向到登录路径。 当应用程序组件第一次挂载导航栏和子组件时,它会检查身份验证并相应地添加到导航栏的链接。成功登录后,当用户从登录路由重定向到索引路由时,子组

  • 我试过这种模式。 据我所知,最初的组件呈现是由props更改触发的,而由于setState是异步的(出于某种原因),带有新状态更新的呈现不是在第一次传递时完成的。 然而,我不明白的是,为什么当它最终决定更新状态时,它没有重新发布组件。我以为由setState引起的状态变化总是会触发一个rerender。 所以最后,我有一个组件,它在状态实际改变之前无用地重新呈现,然后什么都不做,当/如果(?)状态