javascript - React refs 不会在渲染之间更新

标签 javascript render reactjs refs

所以我有这个组件

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/

相关文章:

javascript - Node.js 无法导入 ES6 模块

c++ - 描述多 channel 渲染的附件

reactjs - 将 expandIcon 图标向右移动并从扩展表中移除空白区域 Ant Design reatc js

javascript - 在 React 中测试 onclick 组件

javascript - 在React16中的长字符串中间添加省略号

javascript - 如何从另一个函数访问 props 中的函数

javascript - 将社交媒体网络共享按钮集成到 Highcharts。

javascript - asnyc() 不会在 ssh 和 mongoose 中的代码末尾退出

javascript - 如何更新子组件的状态?

javascript - React/Javascript,无法访问对象中的字段