以下子组件从其父组件接收道具。然后,使用将道具设置为自己的状态,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.props
in
componentWillReceiveProps
。
原因是,此lifecycle
方法内部this.props
将具有先前props
值而不是新值,此lifecycle
方法之后this.props
将具有新props
值。
根据DOC:
在已安装的组件接收新道具之前,将调用componentWillReceiveProps()。如果您需要更新状态以响应道具更改(例如,将其重置),则可以比较this.props和nextProps并在此方法中使用this.setState()执行状态转换。
这是因为componentWillReceiveProps
将为每个setState
内部父级调用,因此在设置newprops
内部子级组件之前,我们应该先比较prev值和新值,可能是在父级内部某些其他state
值已更改,而不是我们传递给子级组件的值。
做console.log
对this.props
和newProps
和检查结果。
用这个:
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中 用 本地认证功