새 URL을 푸시할 때 React 구성 요소 렌더가 여러 번 호출됩니다.
사용자가 왼쪽이나 오른쪽을 누르면 사진이 바뀌는 PhotoViewer를 만들고 있습니다.React, Redux, react-router, react-router-redux.오른쪽을 때 저는 가지 . 즉, 저는 이 을 업데이트 할 때 합니다.this.context.replace()
보고 사진을 하기 위한 을 보냅니다.this.props.dispatch(setPhoto(photoId))
디버깅을 위해 상태 변경에 가입하고 있습니다.
위의 각 행은 새로운 상태 변경을 트리거합니다.을 된다.currentlyViewedPhoto
하기 때문에, 은 react-syslog-syslogx의 URL을 갱신합니다.첫가 됩니다.render
을 사용하다 번째 의 리렌더링 render
을 사용하다★★★★★★★★★★★★★★★★★?뭇매를 맞다
class PhotoViewer extends Component {
pressLeftOrRightKey(e) {
... code to detect that left or right arrow was pressed ...
// Dispatching the action triggers a state update
// render is called once after the following line
this.props.dispatch(setPhoto(photoId)) // assume photoId is correct
// Changing the url triggers a state update
// render is called twice
this.context.router.replace(url) // assume url is correct
return
}
render() {
return (
<div>Test</div>
)
}
}
function select(state) {
return state
}
export default connect(select)(PhotoViewer)
렌더가 세 번 호출되는 것이 정상입니까?리액트는 DOM을 3회 분산해야 하기 때문에 과잉 살상인 것 같습니다.변한 게 없으니 별로 상관없을 것 같아요.저는 이 툴셋을 처음 접하기 때문에 이 문제에 대해 궁금한 점이 있으면 언제든지 질문해 주십시오.
3개의 다른 단계에서 상태를 설정할 경우 컴포넌트도 3회 렌더됩니다.
setState()는 조건부 렌더링 로직이 show ComponentUpdate()에 구현되지 않는 한 항상 재렌더를 트리거합니다.
(소스)
show Component Update() 로 로직을 구현하여 성능 문제가 발생할 경우 불필요한 재렌더를 방지할 수 있습니다.
나는 이것이 정상이라고 가정할 것이다.눈에 띄는 성능 문제가 없다면 걱정 안 하셔도 됩니다.성능이 문제가 되기 시작하는 경우 특정 상태 변경으로 렌더링된 구성요소가 변경되지 않을 것이 확실하다면 수명 주기 방법을 재정의하는 것을 검토할 수 있습니다.
편집: 확장도 검토할 수 있습니다.React.PureComponent
React.Component
한 경우shouldComponentUpdate
라이프 사이클 방식자세한 것은 이쪽.
오래된 질문입니다만, 저도 이 문제에 주목했습니다.도날드의 대답에서 언급한 것처럼, 정상인 것 같습니다.특정 사례를 트러블 슈팅하기 위해 세 가지를 시도했습니다.
- 중복 메시지의 원인이 React DevTools 플러그인인지 확인했습니다.
- 그것이 문제인지 다른 브라우저를 확인했습니다.
- 간단한 컴포넌트에서 발생하는지를 확인하기 위해 간단한 테스트를 작성했습니다.
처음 두 가지 방법은
React DevTools 플러그인을 사용하지 않도록 설정해도 콘솔에 로그인한 메시지 수는 변경되지 않았습니다.
브라우저 변경도 효과가 없었다.나는 크롬과 파이어폭스를 시도했다.
세 번째 방법
가장 단순한 구성 요소라도 라이프 사이클 방법을 여러 번 호출하는 것 같습니다.
두 개의 파일을 지정하면App.js
그리고.components/TestComponent.js
다음과 같습니다.
// App.js
import React from 'react';
import './App.css';
import Test from './components/TestComponent';
function App() {
console.log('App render');
return (
<div>
<Test />
</div>
);
}
export default App;
// ./components/TestComponent.js
import React, { Component } from 'react';
class Test extends Component {
constructor(props) {
console.log('Test constructed');
super(props);
}
componentDidMount() {
console.log('Test mounted');
}
componentDidUpdate() {
console.log('Test updated');
}
render() {
console.log('Test rendered');
return (
<div>
<h1>Hello, world!</h1>
</div>
);
}
}
export default Test;
검사의 수명 주기 방법을 여러 번 호출합니다.
메모들
- 앱을 설정하기 위해 create-react-app을 사용했습니다.
- react 버전은 16.13.1입니다.
결과 및 토론.
와 함께yarn start
콘솔에 다음 메시지가 나타납니다.
App render
TestComponent.js:7 Test constructed
TestComponent.js:7 Test constructed
TestComponent.js:20 Test rendered
TestComponent.js:20 Test rendered
TestComponent.js:12 Test mounted
적어도 나한테는yarn
개발 빌드가 최적화되어 있지 않고 실행 중이라는 점에 주의해 주십시오.yarn build
그리고 나서 그것을 서비스합니다.python -m http.server --directory build
는 중복된 메시지가 없는 페이지를 제공합니다.
왜 2개가 아닌 3개의 렌더링을 받는지는 말할 수 없습니다.앱을 구축해보고 프로덕션 구축에서 문제가 지속되는지 확인해보자는 제안입니다.
그래도 문제가 발생할 경우 Donald의 제안에 따라 로직을 구현할 수도 있습니다.shouldComponentUpdate
.
> v16.3 을 사용하고 있는 경우는,<React> 를 삭제해 주세요.Strict Mode > 정상적으로 동작합니다.
왜? 클래스 컴포넌트의 경우 v16.3, 훅의 경우 v16.8부터 React는 <React>를 도입했습니다.[ Strict Mode ]는 렌더링 단계를 여러 번 호출할 수 있기 때문에 Concurrent React (근래에는 )로의 이행을 보다 개발자에게 용이하게 하기 위해 사용합니다.
다음 기사는 읽을 가치가 있습니다.
잠깐만요, <React>를 사용하고 있지 않습니다.Strict Mode >?!
주의: 이는 개발 환경에만 적용됩니다.
<React>를 삭제합니다.Strict Mode >는 내 케이스에서도 동작했다.
제거할 수 있습니다.React.StrictMode
이전:
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
수신인: 이전:
root.render(
<App />
);
파일 디폴트index.js
언급URL : https://stackoverflow.com/questions/35136836/react-component-render-is-called-multiple-times-when-pushing-new-url
'programing' 카테고리의 다른 글
내용 높이에 따라 iframe 높이 크기 조정 (0) | 2023.03.06 |
---|---|
여러 줄의 환경 변수 형식을 적절하게 도커 구성하려면 어떻게 해야 합니까? (0) | 2023.03.06 |
Python에서 YAML 파일을 JSON 개체로 변환 (0) | 2023.03.06 |
npm 패키지 설치 시 종속성 트리 오류를 해결할 수 없습니다. (0) | 2023.03.06 |
스프링 부트: YAML 파일에서 @Value 로드 (0) | 2023.03.06 |