当前位置: 首页 > 面试题库 >

新的React Context API是否触发重新渲染?

司徒河
2023-03-14
问题内容

我一直在尝试了解新的React Context API并正在使用它。我只是想检查一个简单的案例-更新提供者的数据时,所有这些都会重新呈现。

在Codesandbox上 查看
这个小例子

因此,在我的示例中,我有一个App组件-其状态如下所示-

this.state = {
  number - A random number
  text - A static text
}

我创建了一个新的从这里包含语境做出反应number,并text从国家和值传递给两位消费者NumberText

所以我的假设是,如果随机数更新,它将更改上下文,并且两个组件都应触发重新渲染。

但实际上,价值正在更新,但没有重新呈现。

所以,我的问题-

  1. 是否已更新到不通过常用转播传播的上下文?当上下文更改时,我看不到日志/颜色更改。

  2. 该提供者的所有使用者是否都已更新?


问题答案:

是否已更新到不通过常用转播传播的上下文?当上下文更改时,我看不到日志/颜色更改。

对上下文值的更新不会触发提供者的所有子代的重新渲染,而是仅触发从Consumer内部渲染的组件,因此在您的情况下,尽管number组件包含Consumer,但不会重新渲染Number组件,而只是Consumer中的render函数,因此值在上下文更新时会更改。这样,它的性能就很高,因为它不会触发所有子项的重新渲染。

该提供者的所有使用者是否都已更新?

该提供者的所有使用者都将经历一个更新周期,但是是否重新渲染取决于反应虚拟DOM比较。您可以在控制台中看到的此
沙箱的 演示


编辑

您需要确保将组件呈现为ContextProvider组件的子代,并且将处理程序传递给它,而不是内联呈现它们并更新ContextProvider的状态,因为这将触发内部所有组件的重新呈现。的
ContextProvider

表演者用法

App.js

  constructor() {
    super();
    this.state = {
      number: Math.random() * 100,
      text: "testing context api"
      updateNumber: this.updateNumber,
    };
  }
  render() {
    return (
      <AppContext.Provider
        value={this.state}
      >
        {this.props.children}
      </AppContext.Provider>
    );
  }

index.js

class Data extends React.Component {
  render() {
    return (
      <div>
        <h1>Welcome to React</h1>
        <Number />
        <Text />
        <TestComp />
        <AppContext.Consumer>
          {({ updateNumber }) => (
            <button onClick={updateNumber}>Change Number </button>
          )}
        </AppContext.Consumer>
      </div>
    );
  }
}

const rootElement = document.getElementById("root");
ReactDOM.render(
  <App>
    <Data />
  </App>,
  rootElement
);

绩效降低

App.js

class App extends Component {
  constructor() {
    super();
    this.state = {
      number: Math.random() * 100,
      text: "testing context api"
    };
  }

  updateNumber = () => {
    const randomNumber = Math.random() * 100;
    this.setState({ number: randomNumber });
  };

  render() {
    return (
      <AppContext.Provider value={this.state}>
        <div>
          <h1>Welcome to React</h1>
          <Number />
          <Text />
          <TestComp />
          <button onClick={this.updateNumber}>Change Number </button>
        </div>
      </AppContext.Provider>
    );
  }
}


 类似资料:
  • 尽管试图避免所有记录在案的陷阱,阻止React在状态更改后重新渲染,但我仍然无法解决我的问题: } 从每个长方体组件调用update函数,并触发长方体网格上新颜色的指定。 试图避免常见的错误: 颜色数组只有在通过扩展运算符从状态复制后才被修改 通过setState()传递新数组 此外,我还处理了两个组件中函数的实例绑定 但是,尽管onClick成功触发了状态更改,但不会进行重新渲染。我在这里缺少的

  • 问题内容: Parent(在我的示例中)组件通过Child()组件呈现一个数组。父级决定更改数组中的属性,React触发子级重新渲染的方式是什么? 调整数据后,我想出的只是在Parent中。这是触发更新的hack还是React方法? JS小提琴:https: //jsfiddle.net/69z2wepo/7601/ 问题答案: 这里的问题是您要在中存储状态,而不是。由于此组件是mutating

  • 我已经初始化了一个数组状态,当我更新它时,我的组件不会重新渲染。以下是一个最低限度的概念证明: 根据这段代码,似乎输入应该包含要开始的数字0,并且无论何时更改,状态也应该更改。在输入中输入“02”后,应用程序组件不会重新渲染。但是,如果我在5秒后执行的onChange函数中添加setTimeout,则表明数字确实已更新。 对为什么组件不更新有什么想法吗? 这是一个带有概念证明的代码沙盒。

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

  • userNotesTable: 用户提醒表: 插入触发器: 更新触发器: 这是数据库的当前代码,以及提醒表的特定触发器。我遇到的困难是,从提醒表中的specific中的user notes表中选择特定的名称和额外的内容,所有这些都在更新触发器中。 插入时,和会被插入到提醒和搜索表中,但我希望能够使用特定名称和用户注释表中的额外内容更新搜索表,这可能吗?