2016-06-28 1 views
2

docs는 말한다 :상위 컴포넌트에서 componentDidMount가 두 번 이상 호출 된 이유는 무엇입니까?

초기 렌더링이 발생한 후 즉시 만 (가 아닌 서버) 클라이언트에 한 번 불려갑니다. 이제

, 나는 고차 구성 요소를 만들려고 할 때 : 나는 경우

'wrapped component mounted' 
'wrapper component mounted' 

: 지금 어떤 변화가 소품 발생할 때마다

import React from 'react'; 
import { connect } from 'react-redux'; 

function wrap(Wrapped) { 

    class Wrapper extends React.Component { 
    componentDidMount() { 
     // I will place some reusable functionality here which need to 
     // be called once on mounted. 
     console.log('wrapper component mounted'); 
    } 
    render() { 
     return <Wrapped {...this.props}/> 
    } 
    } 
    return Wrapper; 
} 

class Wrapped extends React.Component { 
    componentDidMount() { 
    console.log('wrapped component mounted'); 
    } 
    render() { 
    return <div></div>; 
    } 
} 

connect()(wrap(Wrapped)); 

을 콘솔이 인쇄됩니다 Wrapper을 제거하면 첫 번째로 으로 마운트 된 경우에만 한 번만 인쇄됩니다.

`wrapped component mounted` 

왜 컴포넌트 구성 요소의 상위 구성 요소에서 componentDidMount가 두 번 이상 호출 되었습니까?

+0

connect() (줄 바꿈 (래퍼)); <- Wrapped로 대체하십시오. –

+0

@ffxsam 죄송합니다. 귀하의 의견을 제대로 이해하지 못하면 제 영어 실력이 좋지 않습니다. 하지만 잘못하지 않았다면 컴포넌트 ('Wrapper'와'Wrapped')가 이미 마운트되어있을 때'componentDidMount'는 마운트 해제되지 않은 한 다시 호출되지 않습니다. 그리고 여기서 제가 말하고자하는 것은 두 개의'componentDidMount'는 소품이 바뀔 때마다 항상 호출된다는 것입니다. –

+0

오, 죄송합니다! 소품 변경으로 인해'componentDidMount'가 다시 발동되는 부분을 놓쳤습니다. 아주 이상한. – ffxsam

답변

1

connect() (랩 (래퍼)); < - 감싸기로 대체하십시오.

테스트를 마쳤습니다. 그리고 그것은 작동합니다.

function wrap(Wrapped) { 
    class Wrapper extends React.Component { 
    componentDidMount() { 
     console.log('wrapper component mounted'); 
    } 
    render() { 
     return <Wrapped {...this.props}/> 
    } 
    componentDidUpdate(prevProps, prevState){ 
     console.log(this.props); 
    } 
    } 
    return Wrapper; 
} 
class Wrapped extends React.Component { 
    componentDidMount() { 
    console.log('wrapped component mounted'); 
    } 
    componentDidUpdate(prevProps, prevState){ 
     console.log(this.props); 
    } 
    render() { 
    return <div></div>; 
    } 
} 

connect(state=>({state}))(wrap(Wrapped)); 

랩 FUNC은 랩 FUNC에 래퍼를 전달할 수 없습니다, 래퍼를 반환합니다. 그것의 루프

+0

죄송합니다. 질문을 입력 할 때 입력하지 못했습니다. –

+0

질문을 업데이트했지만 한 번만 호출합니다. componentDidMount –

+0

정말입니까? 어떻게 그걸 시험 했니? 제 경우에는 매번 호출됩니다. –