2016-12-09 3 views
2

나는이 React 앱을 가지고 있는데, 바벨 (babel)로 컴파일되고 webpack에 번들로 묶여있다. 사람이의 화살표를 클릭하면,상태를 설정하고 새로운 검색 수행하기

nextWeek() { 
    this.setState({ 
     today: this.state.today.clone().add(1, 'w') 
    }); 

    this.searchSessions(); 
} 

previousWeek() { 
    this.setState({ 
     today: this.state.today.clone().subtract(1, 'w') 
    }); 

    this.searchSessions(); 
} 

searchSessions() { 
    this.props.actions.searchSessions({ 
      query: { 
       range: { 
        when: { 
         gte: this.state.today.clone().startOf('week').toISOString(), 
         lte: this.state.today.clone().endOf('week').toISOString() 
        } 
       } 
      } 
     }) 
     .then(() => this.setState({loading: false})) 
     .catch(() => this.setState({loading: false})); 
} 

아이디어는 다음과 같습니다 : screenshot

그것은 다음 또는 이전 주에 이동 시간표 페이지 TimetableManagePage.js에서

나는이 조각을 가지고있다.

searchSessionstoday 상태에서 실행되며, previousWeeknextWeek이 업데이트됩니다. 그러나 검색을 실행하면 상태가 업데이트되지 않는다는 것을 알게되었습니다.

this.props.actions.searchSessions 갱신하십시오 REDUX 상태를 저장하므로 구성 요소에 새로운 소품을 설정합니다 ...

지금, 나는 어쩌면이 검색 실제로 render 기능에, 모든 상태가 그때까지 변경해야 속해 있다고 생각 .. 그러나 구성 요소의 상태가 변경되면 render이 다시 실행되어 검색해야하는 것보다 많은 수의 호출이있을 수 있습니다.

오늘 상태 만 업데이트 된 경우 새로운 검색을 수행하는 가장 좋은 방법은 무엇입니까? 내가 componentWillUpdate

답변

0

보고해야 하는가 당신은 shouldComponentUpdate (nextState) 함수를 추가해야합니다 오늘 상태가 업데이트 될 때 다음은 당신의 페이지를 업데이트합니다

shouldComponentUpdate(nextState){ 
if(nextState.today != this.state.today) 
    return true; 
} 

을 비교해야한다. 그 후에는 componentWillUpdate에서 호출하거나 원하는 것을 언제든지 호출 할 수 있습니다.

componentWillUpdate(nextState){ 
    if(nextState.today!=this.state.today){ 
    doIt(); 
    } 
} 
+0

하지만이'today' 구성 요소의 유일한 상태 아니다'isSaving','showModal','loading' ....이 –

+0

당신이 componentWillUpdate (nextState)에 코드를 추가하고있다 다시 (state.today가 변경된 경우) 똑같은 일을하십시오. 그걸 한 번만 실행하면됩니다. – wertigom

+0

나는'componentDidUpdate'를 사용하고 있습니다. 모든 상태 변경은 on으로 실행되지만, 끝난 후에는'today'가 변경되었는지 검사하고 그에 따라 검색을 실행합니다. –