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

componentWillRecieveProps方法无法正常运行:ReactJS

宰父深
2023-03-14
问题内容

以下子组件从其父组件接收道具。然后,使用将道具设置为自己的状态,getInitialState并使用将值渲染到相应的输入字段this.state

componentWillRecieveProps用来在子组件收到新道具时更新其状态。

最初,调用该组件时,它可以正常工作。问题是第二次通过道具时发生的,触发道具通过的相应按钮需要两次单击才能设置孩子的状态。

我可能使用componentWillRecieveProps不正确?

getInitialState: function() {
  return {
    pitch: this.props.booking.pitch,
    email: this.props.booking.email,
    firstName: this.props.booking.firstName,
    arrivalDate: this.props.booking.arrivalDate,
  }
},

componentWillReceiveProps: function (props) {
  this.setState({
    pitch: this.props.booking.pitch,
    email: this.props.booking.email,
    firstName: this.props.booking.firstName,
    arrivalDate: this.props.booking.arrivalDate,
  })
},

完整代码:

var React = require('react');

    var createReactClass = require('create-react-class');



    var ViewBooking = createReactClass({

      getInitialState: function() {

        return {

          pitch: this.props.booking.pitch,

          email: this.props.booking.email,

          firstName: this.props.booking.firstName,

          arrivalDate: this.props.booking.arrivalDate,

        }

      },



      componentWillReceiveProps: function (props) {

        this.setState({

          pitch: this.props.booking.pitch,

          email: this.props.booking.email,

          firstName: this.props.booking.firstName,

          arrivalDate: this.props.booking.arrivalDate,

        })

      },



      _handleInputChange: function(event) {

        const target = event.target;

        const value = target.type === 'checkbox' ? target.checked : target.value;

        const name = target.name;

        var partialState = {};

        partialState[name] = value;

        console.log(partialState);

        this.setState(partialState);

      },



      _handleUpdateClose: function(e) {

        this.props.updateClose();

        e.preventDefault();

      },



      _handleUpdateBooking: function (e) {

        var tempBooking = {

          pitch: this.state.pitch,

          email: this.state.email,

          firstName: this.state.firstName,

          arrivalDate: this.state.arrivalDate,

        }

        this.props.updateBooking(tempBooking);

        e.preventDefault();

      },



      _handleDelete: function (e) {

        this.props.deleteBooking();

        e.preventDefault();

      },



      render: function() {

        if (this.props.viewFormVisibility) {

                formVisibility = {"display": "block"};

            } else {

                formVisibility = {"display": "none"};

            }



        return (

            <div>

            <form style={formVisibility}>

                <h4>View Booking</h4>

                <div className="form-group row">

                  <label className="col-2 col-form-label">Pitch</label>

                  <div className="col-10">

                    <input value={this.state.pitch} onChange={this._handleInputChange} className="form-control" name="pitch" ref="inputPitch" type="number" id="example-number-input"/>

                  </div>

                </div>

              <div className="form-group row">

                <label  className="col-2 col-form-label">First Name</label>

                <div className="col-10">

                  <input value={this.state.firstName} onChange={this._handleInputChange} className="form-control" ref="firstName" name="firstName" type="text" id="example-text-input"/>

                </div>

              </div>

              <div className="form-group row">

                <label className="col-2 col-form-label">Email</label>

                <div className="col-10">

                  <input value={this.state.email} onChange={this._handleInputChange} className="form-control" ref="inputEmail" type="email"  name="email" id="example-email-input"/>

                </div>

              </div>



              <div className="form-group row">

                <label className="col-2 col-form-label">Date</label>

                <div className="col-10">

                  <input value={this.state.arrivalDate} onChange={this._handleInputChange} className="form-control" ref="arrivalDate" name="arrivalDate" type="date" id="example-date-input"/>

                </div>

              </div>

              <button type="submit" className="btn btn-primary" onClick={this._handleUpdateBooking}>Save changes</button>

              <button className="btn btn-danger" onClick={this._handleUpdateClose}>Close</button>

              <button onClick={this._handleDelete} className="btn btn-danger">Delete</button>

            </form>

          </div>

        )

      }

    })



    module.exports = ViewBooking;

问题答案:

我可能会错误地使用componentWillRecieveProps?

是的,因为您需要使用props.keyname(支持传递给此方法的参数),而不是this.propsin
componentWillReceiveProps

原因是,此lifecycle方法内部this.props将具有先前props值而不是新值,此lifecycle方法之后this.props将具有新props值。

根据DOC:

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

这是因为componentWillReceiveProps将为每个setState内部父级调用,因此在设置newprops内部子级组件之前,我们应该先比较prev值和新值,可能是在父级内部某些其他state值已更改,而不是我们传递给子级组件的值。

console.logthis.propsnewProps和检查结果。

用这个:

componentWillReceiveProps: function (newProps) {
    this.setState({
        pitch: newProps.booking.pitch,
        email: newProps.booking.email,
        firstName: newProps.booking.firstName,
        arrivalDate: newProps.booking.arrivalDate,
    })
    console.log('previous value', this.props);    //print the previous values
    console.log('new values', newProps);          //new values
},


 类似资料:
  • 问题内容: 我更改了使用.ajax方法而不是.load的实现,它在Firefox中可以正常工作,但在IE7或IE6中却不能: 为了达到目标,这已经使我丧命。 任何想法,我要去哪里错了? 问题答案: 我不小心弄清楚了问题所在。 此变量中引用的链接: 最后有一个哈希值,如下所示: 这会导致AJAX在IE的两个版本中掉落。 使用以下代码: 盖茨摆脱它,现在可以工作了:)

  • 问题内容: public class MyThread { volatile static int i; 由于易失性构建发生在关系之前,因此i的最终值应严格为2000000。但是,实际结果与变量i不具有易失性没有什么不同。谁能解释为什么它在这里不起作用?由于我被声明为volatile,因此应该保护它免受内存不一致的影响。 问题答案: 谁能解释为什么它在这里不起作用?由于我被声明为volatile,

  • 本文向大家介绍docker容器中crontab无法正常运行解决方案,包括了docker容器中crontab无法正常运行解决方案的使用技巧和注意事项,需要的朋友参考一下 相信很多人看完docker容器, 需要加crontab, 加完却发现不能执行,心塞.....接着便开始各种折腾... 首先当然是看日志了, 发现/var/log 下面没有任何信息, 那是因为你没有打开rsyslog. 继续看日志 从

  • 问题内容: 我不明白为什么使用此正则表达式该方法返回false; 我是一个字边界的字符! 问题答案: 在Java中,尝试将模式与 整个string 进行匹配。 这是真实的,和。 如果要检查字符串中是否有匹配项,可以使用。在这种情况下,它是Java字符串文字。 API链接 :尝试根据图案匹配整个区域。 什么意思 如此处所用,点是一个正则表达式元字符,表示(几乎)任何字符。是一个正则表达式元字符,表示

  • 我使用ApacheStorm与Apache Kafka。使用的喷口是Kafka喷口,但它没有阅读Kafka主题的任何内容。我不知道这是否与我在暴风的工人中面临的问题有关。如果您知道任何相关解决方案,请告知我。 Storm拓扑已成功上载到Storm。我获取了日志,下面是工作人员在其文件:

  • 问题内容: 我正在尝试获取以下功能中的Face ID或Touch ID是否成功 但是即使此代码成功执行,它也会跳过稍后传递,从而导致错误的返回。为什么会这样?以及如何解决此代码以使其像预期的那样工作? 问题答案: Touch ID和Face ID LocalAuthentication的工作代码 (swift 4代码) 注意: 隐私-面部ID使用描述 键添加到Info.plist中 用 本地认证功