- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我可能会遗漏一些东西,但我有一个这样的组件
export default MyComponent extends React.PureComponent {
// ...
}
当 MyComponent 是另一个组件渲染方法的一部分时,每次父组件渲染时,MyComponent 都会重新渲染,即使 props/state 未更改。因此,从 React.Component
更改为 React.PureComponent
似乎并没有使组件变得“纯粹”。
我尝试添加
console.info(this.shouldComponentUpdate)
在其中一个组件方法中,它说它是未定义的。 React.PureComponent
不是应该添加一个浅比较 shouldComponentUpdate
方法吗?
现在 React 15.5.4 和 15.6.0 就发生了这种情况
最佳答案
PureComponent 不声明 shouldComponentUpdate
直接地。您无法使用 this.shouldComponentUpdate
访问它。在React源代码中有一个shouldUpdate
变量:
(下面的源码经过简化)
// default is true
var shouldUpdate = true;
if (inst.shouldComponentUpdate) {
shouldUpdate = inst.shouldComponentUpdate(
nextProps,
nextState,
nextContext,
);
} else {
// if it's a PureComponent
if (this._compositeType === ReactCompositeComponentTypes.PureClass) {
shouldUpdate =
!shallowEqual(prevProps, nextProps) ||
!shallowEqual(inst.state, nextState);
}
}
// ...
if (shouldUpdate) {
// re-render ..
}
由于它只是浅等于,因此下面的代码返回 false 并且您会重新渲染:
const propA = { foo: 'bar' }
const nextPropA = { foo: 'bar' }
shallowEqual(propA, nextPropA) // false
因此请谨慎使用对象和数组。要证明 PureComponent 有效,请参阅此示例 (v15.6):https://codepen.io/CodinCat/pen/eRdzXM?editors=1010
点击按钮不会触发 Foo
的渲染:
这是 PureComponent 可能不适合您的另一个示例:https://codepen.io/CodinCat/pen/QgKKLg?editors=1010
唯一的区别是<Foo someProp={{ foo: 'bar' }} />
因为{ foo: 'bar' } !== { foo: 'bar' }
,React 每次都会重新渲染。因此直接在 props 中编写内联对象和数组并不是一个好的做法。一个常见的错误是编写内联样式:
<Foo style={{ color: 'pink' }} />
在本例中Foo
即使它是 PureComponent,也总是会重新渲染。如果您遇到此问题,您可以简单地提取对象并将其存储在某处,例如:
const someProp = { foo: 'bar' }
<Foo someProp={someProp} />
自 someProp === someProp
,PureComponent 就可以工作了。
关于reactjs - React.PureComponent 未实现 shouldComponentUpdate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44537446/
请看一下我的代码。我尝试限制给定无状态组件的重新渲染,但这样做发现 shouldComponentUpdate 永远不会被调用。我已经从 styledComponents 中删除了包装器(之前有人报道
在文档中找不到与此相关的任何内容,我需要对父状态更改进行一些浏览器操作,而不重新渲染子组件。我可以在“shouldComponentUpdate”中执行此操作并让它返回 false,但只是想知道这对服
假设我有一个渲染子项的组件,但这些子项可以通过redux连接或基于计时器的更新组件。父组件不知道这一点。然而,父组件实现了 shouldComponentUpdate 来优化性能。 class Con
如何将 shouldComponentUpdate 用于状态? 我可以检查: shouldComponentUpdate(nextProps, nextState) { return this.s
我试图找出 React 生命周期方法 shouldComponentUpdate 最惯用的实现。我觉得我,可能还有其他人,并没有充分利用这种方法,因为它是可选的。 通常我想检查对象的 props 或
问题 我的父类包含项目列表并为列表中的每个项目呈现组件。当某些项目发生更改(即使只有一个)时,列表中的所有项目都将被重新渲染。 所以我尝试实现shouldComponentUpdate()。我正在使用
我有两个组件。一个是父组件(连接到 redux 的智能组件),另一个是在数组迭代中渲染的子组件。 每当从子组件分派(dispatch)某些 redux 操作时,存储中的状态就会更改,并且重新渲染整个元
我有两个组件。一个是父组件(连接到 redux 的智能组件),另一个是在数组迭代中渲染的子组件。 每当从子组件分派(dispatch)某些 redux 操作时,存储中的状态就会更改,并且重新渲染整个元
我使用 Reflux.connect 方法来改变组件状态,但我无法在 shouldComponentUpdate 中获取 nextState 和 this.state。实际上,当 shouldComp
假设我有一个应该每 6000 毫秒更新一次的 Timestamp 组件。这是基础: class Timestamp extends Component { static propTypes = {
我的 React 类 EventTable 有几种模式,根据模式,它从服务器获取不同的数据并将它们显示到 中。 .我首先让类显示静态数据并且它工作得很好,包括通过来自更高组件的 prop 切换 mo
我在项目中使用 react 运动动画。我通过维护状态解决了每次 Prop 更改时渲染动画的问题。 const {animation} = this.state; if (animati
我的代码有一个组件,它同时接受 props 并有自己的内部状态。 组件应仅在其 Prop 更改时重新渲染。状态更改不应触发重新渲染。 此行为可以通过基于类的组件和自定义 shouldComponent
我有一个像这样的高阶组件 // higherOrderComponent.js const HigherOrderComponent = Component => class extends Reac
LoDash 有精彩的 method _.isEqual。使用以下方法是个好主意吗: shouldComponentUpdate(newProps, newState) { return !_.i
我是 React 新手,只是想问一下组件的状态对象如何更新。经过分析一些代码,我认为: 在更新阶段,状态在 shouldComponentUpdate 方法之后但在 render 方法之前更新,我的理
如果我使用 Immutable.js,react-redux 仍然可以使用 shouldComponentUpdate 吗? connect()方法在shouldComponentUpdate()中使
我的组件加载中有多个 setState。我的页面在单击下拉值时重新呈现,因为单击时我通过 setState 存储这些值。 这里要停止点击时重新渲染,我使用下面的代码。 shouldComponentU
如果我使用 Immutable.js,react-redux 仍然可以使用 shouldComponentUpdate 吗? connect()方法在shouldComponentUpdate()中使
我正在开发一个 React 应用程序,并偶然发现了一种情况,如果我不使用 shouldComponentUpdate() 来阻止,我的组件就会不断地相互更新。我正在尝试确定这是否是处理此类更改的最佳方
我是一名优秀的程序员,十分优秀!