2017-11-16 10 views
0

내 구성 요소의 상태를 URL의 현재 경로 이름으로 설정하려고합니다. 특히, 나는대로 App.js에 정의 된 내 ResponsiveDrawer 구성 요소에서이 작업을 수행 할 : 그 다음 코드는 트리거해야 한 ResponsiveDrawer 구성 요소에서,React Router V4에서 상태를 location.pathname으로 설정할 수 없습니다.

class App extends Component { 
    render() { 
    return (
     <Router> 
     <ResponsiveDrawer> 
      <div className="App"> 
      <Route exact path="/" component={Administrator} /> 
      <Route path="/admin" component={Administrator} /> 
      <Route exact path="/jobs" component={Jobs} /> 
      <Route path="/jobs/:id" render={({match}) => <ViewJob id={match.params.id} />} /> 
      <Route path="/entries/:jobId/:entryId" render={({match}) => <Entry jobId={match.params.jobId} entryId={match.params.entryId} />} /> 
      <Route exact path="/reports" component={Reports} /> 
      <Route path="/reports/:jobId" render={({match}) => <JobReport id={match.params.jobId} />} /> 
      <Route path="/reports/activity" component={ActivityReport} /> 
      </div> 
     </ResponsiveDrawer> 
    </Router> 

    ); 
    } 
} 

이제 때 URL 변경 :

class ResponsiveDrawer extends React.Component { 
    constructor() { 
    super(); 
    this.state = { 
     mobileOpen: false, 
     adminOpen: true, 
     jobsOpen: false, 
     reportsOpen: false, 
     activePath: '' 
    }; 
    this.setActiveState = this.setActiveState.bind(this); 
    this.isActiveFunc = this.isActiveFunc.bind(this); 
    } 


    setActiveState = (path) => { 
    this.setState({activePath: path}); 
    }; 

    isActiveFunc = (match, location) => { 
    console.log(location.pathname) 
    this.setActiveState(location.pathname); 
    return match 
    }; 

    render() { 
     <NavLink isActive={this.isActiveFunc} className={classes.subLink} to={{ pathname: "/admin/users" }}> 
     <ListItem button className={classes.nested}> 
     <ListItemText inset primary="Users" /> 
     </ListItem> 
     </NavLink> 

NavLink를 클릭 할 때마다 현재 위치가 올바르게 기록됩니다. 그러나, 나는 다음과 같은 오류 얻을 location.pathname의 값으로 상태를 설정하려고 :

proxyConsole.js:54 Warning: Cannot update during an existing state transition (such as within render or another component's constructor). Render methods should be a pure function of props and state; constructor side-effects are an anti-pattern, but can be moved to componentWillMount .

을 그리고 브라우저는 무한 루프로 전환되고

어떤 아이디어 충돌? isActive에서 전달 함수가 즉시 NavLink 기능을 렌더링에 호출 당신이이 줄에서 볼 수

+0

'NavLink' 컴포넌트를 볼 수 있습니까? isActive' prop에 전달 된 함수를 즉시 호출하는 것처럼 보입니까? –

+0

라우터에서 가져옵니다. (여기를 참조하십시오 : https://github.com/ReactTraining/react-router/blob/master/packages/react-router-dom/docs/api/NavLink.md) – user3642173

답변

0

,

https://github.com/ReactTraining/react-router/blob/master/packages/react-router-dom/modules/NavLink.js#L34

.

setState은 무한한 렌더링 루프를 유발할 수 있으므로 render에 분명히 사용하면 안됩니다.

대신 componentWillReceiveProps을 사용해야합니다.

+0

고마워요! 나를위한 가장 쉬운 해결책은 상태가 항상 this.location.pathname으로 설정되도록하는 것입니다. 그러나, 어떻게 든 내 구성 요소의 해당 속성에 액세스 할 수 없습니다. – user3642173

+0

문제는 내 ResponsiveDrawer 구성 요소가 범위를 벗어나서 this.props.params.match에 액세스 할 수 없다는 것입니다. 이 주위에 어떤 방법이 있습니까? – user3642173

+0

window.location은 작동하지만 새 구성 요소를 클릭해도 업데이트되지 않습니다. 이상적으로는 Angular에서 알 수있는 라우터 변경 사항을 구독하는 것과 비슷한 것을 원합니다. – user3642173