- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
componentWillReceiveProps 和 getDerivedStateFromProps 到底是什么对我来说是个微妙的问题。因为,我在使用 getDerivedStateFromProps 时遇到了一个问题:
// Component
state = {
myState: []
}
// Using this method works fine:
componentWillReceiveProps(nextProps) {
this.setState({
myState: nextProps.myPropsState
})
}
// But using this method will cause the checkboxes to be readonly:
static getDerivedStateFromProps(nextProps,prevProps) {
const { myPropsState: myState } = nextProps
return {
myState
}
}
// And here's checkbox
<input type="checkbox" id={`someid`}
onChange={(e) => this.handleMethod(e, comp.myState)}
checked={myState.indexOf(comp.myState) > -1} />
react 版本:16.4.1
最佳答案
getDerivedStateFromProps
不是 componentWillReceiveProps
的直接替代品,纯粹是因为它在每次更新后都会被调用,无论是状态变化、 Prop 变化还是父元素的重新渲染。
无论如何,只需从 getDerivedStateFromProps
返回状态即可不是正确的方法,您需要在返回值之前比较状态和 Prop 。否则每次更新状态都会重置为 props 并且循环继续
根据 docs
getDerivedStateFromProps
is invoked right before calling the render method, both on the initial mount and on subsequent updates. It should return an object to update the state, ornull
to update nothing.This method exists for rare use cases where the state depends on changes in props over time. For example, it might be handy for implementing a
<Transition>
component that compares its previous and next children to decide which of them to animate in and out.Deriving state leads to verbose code and makes your components difficult to think about. Make sure you’re familiar with simpler alternatives:
If you need to perform a side effect (for example, data fetching or an animation) in response to a change in props, use
componentDidUpdate
lifecycle instead.If you want to re-compute some data only when a prop changes, use a
memoization
helper instead.If you want to “reset” some state when a prop changes, consider either making a component
fully controlled
orfully uncontrolled
.
with a key instead
P.S. 注意 getDerivedStateFromProps 的参数是 props
和 state
而不是 nextProps
和 prevProps
要了解更多详情,
为了根据 props 的变化进行变化,我们需要将 prevPropsState 存储在状态中,以便检测变化。一个典型的实现看起来像
static getDerivedStateFromProps(props, state) {
// Note we need to store prevPropsState to detect changes.
if (
props.myPropsState !== state.prevPropsState
) {
return {
prevPropsState: state.myState,
myState: props.myPropsState
};
}
return null;
}
关于javascript - componentWillReceiveProps 与 getDerivedStateFromProps,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51671593/
我已经阅读了reactjs.org上有关getDerivedStateFromProps的文档。我看过用例。我明白为什么要使用它。 但我无法弄清楚它如何处理返回值。因此我的问题是,当它返回时.....
我使用 React 16.3.1 和 next.js。 我将 getDerivedStateFromProps 放入扩展 PureComponent 的类中。 这是代码: Header.js impo
在此示例中 https://codepen.io/ismail-codar/pen/QrXJgE?editors=1011 class Counter extends React.Component
如何在静态 getDerivedStateFromProps 中调用组件函数? 这是我的代码 class Box extends Component { updateVariables() {
根据这篇关于 what's news in React 16.3 的帖子,在下一次更新中 componentWillReceiveProps 将有一个替代品,即 getDerivedStateFrom
从API和React架构设计的角度来看,是否有任何问题使其静态化? 最佳答案 Making certain lifecycles static to prevent unsafe access of
如何比较数组中的状态?我无法使用 !== 或使用 .length static getDerivedStateFromProps(props, state) { if(props.langua
我正在探索 React,但对生命周期方法和父子通信有些困惑。具体来说,我正在尝试创建一个组件,它包装一个选择元素并在选择“其他”选项时添加一个输入框。我已经使用 getDerivedStateFrom
我是 React 的新手,只是一个关于在 getDerivedStateFromProps 生命周期方法中访问静态属性的问题,下面是我的代码: export default Child extends
在 React 组件中使用 getDerivedStateFromProps 生命周期方法时,返回的状态是完全覆盖组件的现有状态,还是只是更新返回的特定状态属性?例如, class foo exten
我在最新的 React 16.5.2 中使用 getDerivedStateFromProps 生命周期钩子(Hook)。为什么我无法访问组件的 this 对象?我做错了什么吗? class Emai
我还没有研究静态 getDerivedStateFromProps,所以我试图了解它。 我知道 React 通过引入一个名为 static getDerivedStateFromProps() 的新生
componentWillReceiveProps 和 getDerivedStateFromProps 到底是什么对我来说是个微妙的问题。因为,我在使用 getDerivedStateFromPro
我正在更新一个遗留组件,它使用: shouldComponentUpdate() 以避免昂贵的状态重新计算 componentWillUpdate() 进行重新计算并在 1 通过时呈现 docs说 i
我正在将一个类组件转换为一个函数组件,并想看看 useEffect()可以替换以下静态函数 static getDerivedStateFromProps(props) { const { p
getDerivedStateFromProps is being added as a safer alternative to the legacy componentWillReceivePro
如 this React Github issue 中所读我看到越来越多 the cost of render() is relatively small 在 React 16.3 中,我想知道为什么
我想将状态变量 books 设置为 API 的结果。我无法在 componentDidMount 中执行此操作,因为我一开始没有 token ,需要它从 API 获取结果。当我运行以下代码时,状态bo
我对 getDerivedStateFromProps 如何与 Mobx 可观察对象有一些误解。我知道,Mobx 对“读取”属性(通过“点入”)、可跟踪函数等使用react。 例如,我存储了可观察对象
我不明白,为什么当我尝试在 getDerivedStateFromProps 方法中启动函数 getTodosList - 它总是向我返回 TypeError - Cannot read proper
我是一名优秀的程序员,十分优秀!