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

何时使用componentWillReceiveProps生命周期方法?

郝承悦
2023-03-14
问题内容

我是React / Redux的新手,状态有问题。

TrajectContainer.jsx

class TrajectContainer extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            trajects: props.trajects,
            onClick: props.onClick
        };
    }

    componentWillReceiveProps(nextProps) {
        console.log('componentWillReceiveProps', nextProps);
        this.setState(nextProps);
    }

    render() {
        // When the componentWillReceiveProps is not present, the this.state will hold the old state
        console.log('rerender', this.state);
        return (<div className="col-md-6">
            <h2>Trajects</h2>
            <button className="btn btn-primary" onClick={this.state.onClick}>Add new Traject</button>
            {this.state.trajects.map(traject => <Traject traject={traject} key={traject.name}/>)}
        </div>)
    }
}

const mapStateToProps = function (store) {
    console.log('mapToStateProps', store);
    return {
        trajects: store.trajects
    };
};

const mapDispatchToProps = function (dispatch, ownProps) {
    return {
        onClick: function () {
            dispatch(addTraject());
        }
    }
};

export default connect(mapStateToProps, mapDispatchToProps)(TrajectContainer);

当reducer返回新状态时,组件将使用新数据重新呈现。

但是:如果删除componentWillReceiveProps函数,则render()函数将具有旧状态。

我检查了mapStateToProps中收到的数据,这是新的新状态。所以我不明白为什么我需要componentWillReceiveProps函数才能使render函数接收新数据。

难道我做错了什么?


问题答案:

componentWillReceiveProps 如果要使用新的props值更新状态值是必需的,则只要props值发生任何更改,都将调用此方法。

在您的情况下,为什么需要此componentWillReceiveProps方法?

因为您将props值存储在状态变量中,并像这样使用它:

this.state.KeyName

这就是为什么您需要componentWillReceiveProps生命周期方法来用新的props值更新状态值,仅组件的props值会更新,而
state不会自动更新 。如果不更新状态,this.state则将始终具有初始数据。

componentWillReceiveProps 如果您未在状态中存储props值并直接使用,则不需要

this.props.keyName

现在react将始终在render方法中使用更新的props值,如果props发生任何更改,它将使用新的props重新渲染组件。

根据 DOC

在已安装的组件接收新道具之前,将调用componentWillReceiveProps()。如果您需要更新状态以响应道具更改(例如,将其重置),则可以比较this.props和nextProps并在此方法中使用this.setState()执行状态转换。

在安装过程中,React不会使用初始道具调用componentWillReceiveProps。仅当某些组件的道具可能会更新时才调用此方法。

建议:

不要将props值存储在状态中,请直接使用this.props和创建ui组件。



 类似资料:
  • 问题内容: 看起来它将在即将发布的版本中完全淘汰,取而代之的是新的生命周期方法:static getDerivedStateFromProps() 。 经检查,它看起来像你现在无法作出直接比较和,就像你可以在。有没有办法解决? 而且,它现在返回一个对象。我是否正确假设返回值本质上是? 以下是我在网上找到的示例:状态源自props / state 。 之前 后 问题答案: 有关删除的:你应该能够与组

  • 问题内容: 如果我正确理解Component的React生命周期,应确保在之前调用它。当我在组件的初始安装上对此进行测试时,它似乎可以正常工作。但是,如果以前已经安装了该组件并重新安装了该组件,则顺序相反。这是预期的行为吗?以下代码段说明了可以通过这种方式引入的潜在错误: 问题答案: 简短的答案 : 确实不能保证触发这些方法的顺序。这就是为什么(如您的示例)在props和state之外使用组件变量

  • 方法的标注和函数类似: struct Owner(i32); impl Owner { // 标注生命周期,就像独立的函数一样。 fn add_one<'a>(&'a mut self) { self.0 += 1; } fn print<'a>(&'a self) { println!("`print`: {}", self.0); } } fn

  • 用法 组件和虚拟 DOM 节点都有生命周期方法,也叫钩子,它们会在 DOM 元素的生命周期的对应时期被调用。 // 组件中的钩子 var ComponentWithHook = { oninit: function(vnode) { console.log("initialize component") }, view: function() { return "hello

  • 问题内容: 在哪里进行调用将使我的状态失水的API调用的最佳位置是哪里?构造函数或生命周期方法之一,例如ComponentWillMount? 问题答案: 最好从生命周期方法进行api调用,反应文档也建议相同。 根据DOC: componentDidMount: 挂载组件后立即调用componentDidMount()。需要DOM节点的初始化应该在这里进行。 如果需要从远程端点加载数据,这是实例化

  • 问题内容: 随着AngularJS V1.7的发布,已经不建议使用和取消预定义绑定的选项: 由于38f8c9, 指令绑定在构造函数中不再可用 。 迁移代码: * 如果指定,则需要首先迁移代码,以便将标志翻转到。有关如何执行此操作的说明,请参见 “从1.5迁移到1.6”指南。之后,删除该语句。 — AngularJS开发人员指南- 迁移至V1.7-编译 由于bcd0d4的缘故,默认情况下在控制器实例