- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
根据这篇关于 what's news in React 16.3 的帖子,在下一次更新中 componentWillReceiveProps
将有一个替代品,即 getDerivedStateFromProps
(替代品只会在 17.0 中发生)。
有趣的是,这个全新的静态生命周期方法
is called both on initial mounting and on re-rendering of the component, so you can use it instead of creating state based on props in constructor.
我越来越糊涂了。那么从现在开始我是否需要拆分我的构造函数并将创建状态逻辑放到这个新函数中呢?我的意思是当你第一次创建组件时创建状态的逻辑和你从 API Prop 创建状态时的逻辑是不一样的。用一种方法把它们放在一起似乎不太理想。
还有一件事是,如果我选择从构造函数创建我的状态,这个新方法仍然会被调用。真是个 SCSS !
你怎么看?
最佳答案
假设我们有一个列表组件,它通过向 API 提供从其父级接收的一些参数来呈现一些列表项。
this.state.data
变量初始化为[]
。componentDidMount()
中执行 API 调用,将其分配给 this.state.data
。 componentWillReceiveProps
中重复该过程。 我认为这可能是 getDerivedStateFromProps
的目标。现在不需要从 props 更新状态两次,你只需要在函数中写一次:getDerivedStateFromProps
。顾名思义,当必须从 props 派生状态时使用它。
注意事项:
您仍然需要在构造函数中设置初始状态。初始状态和从 props 派生状态的逻辑可能非常不同。例如,如果您没有将 data
变量初始化为 []
并且您映射到 this.state.data
它将失败,因为API 还没有返回要在getDerivedStateFromProps
中设置的结果。
即使 getDerivedStateFromProps
不能使用 this
,它的工作方式与 this.setState
相同。
也就是说,如果你返回
{
data: response.data
}
它不会更新您在构造函数中设置的其他状态变量。您还可以选择返回 null
以表示没有更改。
来自:
class ExampleComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
externalData: []
}
}
componentWillMount() {
asyncLoadData(this.props.someId).then(externalData =>
this.setState({ externalData })
);
}
componentWillReceiveProps() {
asyncLoadData(this.props.someId).then(externalData =>
this.setState({ externalData })
);
}
}
收件人:
class ExampleComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
externalData: []
}
}
static deriveStateFromProps(props, state, prevProps) {
if (prevProps === null || props.someValue !== prevProps.someValue) {
return {
derivedData: computeDerivedState(props)
};
}
// Return null to indicate no change to state.
return null;
}
}
注意:我只是从纯 React 的 Angular 注意到一个实例。
另请阅读 You Probably Don't Need Derived State来自 React 博客。
关于javascript - 关于 getDerivedStateFromProps 的思考,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48863450/
我已经阅读了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
我是一名优秀的程序员,十分优秀!