所以我有这个组件
var LineItemRowsWrapper = React.createClass({
current_lineitem_count: 0,
getAjaxData: function(){
var lineitem_data = [];
for(var i = 0; i < this.current_lineitem_count; i++){
var data = this.refs['lineitem_'+i].getAjaxData();
lineitem_data.push(data)
}
return lineitem_data;
},
getLineitems: function(){
var self = this;
var lineitem_components = [];
this.current_lineitem_count = 0;
if(this.props.shoot){
var preview = this.props.preview;
var lineitems = this.props.shoot.get_lineitems();
lineitem_components = lineitems.map(function (item, index) {
var ref_str = 'lineitem_'+self.current_lineitem_count;
self.current_lineitem_count++;
return (
<LineItemRow item={item} key={index} ref={ref_str} preview={preview} onChange={self.props.onChange} />
)
});
}
return lineitem_components;
},
render: function() {
var lineitems = this.getLineitems();
return (
<div>
{lineitems}
</div>
)
}
})
第一次呈现 lineitems 时,refs 会按预期工作。但是,如果我向 this.props.shoot 添加一个 lineitem,则该组件的 refs 对象不会改变。
例如,假设我有一个包含 3 个 lineitems 的数组
[i1,i2,i3]
this.refs 将是
{lineitem_0:{}, lineitem_1:{}, lineitem_2:{}}
当我将 lineitem 数组更新为
[i1,i2,i3,i4]
this.refs不会变,还是会是
{lineitem_0:{}, lineitem_1:{}, lineitem_2:{}}
为什么 refs 对象在渲染之间不更新? LineItemRow 组件更新正确,所以我知道这方面没有问题。任何见解将不胜感激!
____Edit____(要求为上下文添加更多代码)
var DocumentContent = React.createClass({
contextTypes: {
router: React.PropTypes.func.isRequired
},
getParams: function(){
return this.context.router.getCurrentParams()
},
getInitialState: function() {
return {
shoot: ShootStore.get_shoot(this.getParams().shoot_id),
}
},
componentWillMount: function() {
ShootStore.bind( 'change', this.onStoreUpdate );
},
componentWillUnmount: function() {
ShootStore.unbind( 'change', this.onStoreUpdate );
},
onStoreUpdate: function(){
this.setState(this.getInitialState());
},
addLineItem: function() {
ShootActions.create_lineitem(this.state.shoot.id);
},
update_shoot_timeout: null,
update_shoot:function(){
var self = this;
window.clearTimeout(this.update_shoot_timeout)
this.update_shoot_timeout = window.setTimeout(function(){
var lineitem_data = self.refs.lineitems.getAjaxData()
if(self.props.shoot){
ShootActions.update_shoot(self.state.shoot.id, lineitem_data )
}
}, 500)
},
render: function() {
var shoot = this.state.shoot;
return (
<div className='document__content'>
<div className='row'>
<div className='document__expenses'>
<h3 className='lineitem__title'> Expenses </h3>
<LineItemRowsWrapper shoot={shoot} onChange={this.update_shoot} ref='lineitems'/>
</div>
<button onClick={this.addLineItem} className="btn-small btn-positive">
+ Add Expense
</button>
</div>
);
}
})
最佳答案
在有关 refs 的 react 文档中的“警告”部分下 https://facebook.github.io/react/docs/more-about-refs.html
"Never access refs inside of any component's render method - or while any component's render method is even running anywhere in the call stack."
这正是您正在做的。
相反,您应该将组件的状态存储在 this.state
中,或者将组件的属性存储在 this.props
关于javascript - React refs 不会在渲染之间更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29361703/