2017-07-10 64 views
0

我有一个主要的ag网格用于我的反应app。当点击一个按钮(提供新数据)时,它会重新渲染。react:在第二次调用componentWillRecieveProps之后运行一个方法

我想添加一个初始过滤数据的预过滤器。所以我创建了创建我的预过滤器模型的新方法,然后应用它:

initialFilter(){ 
    ... 
    this.state.gridOptions.api.setFilterModel(myView); 
    this.state.gridOptions.api.onFilterChanged(); 
} 

我知道,从测试这个工作(我叫上当选择行使用的方法的方法和应用过滤器)。

问题是我在哪里调用该方法?

把它放在componentWillRecieveProps导致无限循环(我假设由于上述两行代码)。

我只需要运行方法ONCE(每次点击一个按钮)。经过一番探索后,我注意到如果我添加一个计数器在

componentWillRecieveProps(){ 
... 
    if (counter <= 1){ 
     this.initialFilter(); 
     counter++; 
    } 
} 

这将工作。在第二次componentWillRecieveProps被调用后,预过滤似乎工作。不知道为什么,但我假设第一次呈现Ag网格,然后第二次,一旦网格呈现,运行我的方法将工作。 (如果我使用if语句条件'counter == 0',我不会看到我的Ag网格被过滤,我假设是因为某些东西被覆盖或者没有要过滤的数据或者其他东西)

这很好一个按钮被点击第二个,第三个,等这个时间的方法将不再调用

我最初的计划是按钮的onclick改变一个新的布尔状态变量,和我的IF语句的逻辑应该是:

'如果此状态布尔值为true,则等待第二次componentWillRecieveProps被调用,然后运行该方法,然后将布尔值设置为相反的值'

任何人都可以提供一些建议吗?

回答

0

我已经成功地用一个稍微好一点的办法解决这个问题:

在componentsWillRecieveProps我添加了这个:

if (props.preFilter){ 
    this.initialFilter(); 
    counter++; 
    if (counter == 2){ 
     props.preFilterWasApplied(); 
     counter=0; 
    } 
} 

在我父组件我给自己定一个新的状态切换,这是否如语句被调用。当点击按钮状态切换为真。计数器初始设置为0. initialFilter方法运行并被忽略(?),但会让我再次调用componentsWillRecieveProps。这会导致initialFilter再次运行(此时不会被忽略)并将计数器设置为2.这将通过第二个if语句并调用父级方法。父方法简单地将状态切换回false。计数器重置为0,准备下一次按钮点击。

状态将继续保持为假,直到我再次点击该按钮,它将被设置为false后再次在第二componentsWillReceiveProps调用

如果任何人有一个更优雅的方式做以上,那么将不胜感激:)

+0

更优雅的解决方案发现:只需将它复制到shouldComponentUpdate并删除计数器+内部if语句! – user3120554

相关问题