2017-03-23 14 views
1

いくつかの機能を共有するために、別のコンポーネントで構成できるラッパーコンポーネントを作成しました。基本的にラッパーコンポーネントは、新しいDOMNODEを作成し、そのようにその小道具から子コンポーネントをレンダリング:<AnotherThing />のインスタンスのReactJS-子コンポーネントがアンマウントされない

//wrapper 
componentDidMount() { 
    this.node = document.body.appendChild(document.createElement('div')); 
} 

componentDidUpdate() { 
    if (this.state.editing) { 
    ReactDOM.render(this.props.component, this.node); 
    } else { 
    ReactDOM.unmountComponentAtNode(this.node) 
    } 
} 

//component from within the props of the wrapper above 
componentWillUnmount() { /* runs */ } 

render() { 
    return (
    <div> 
     <AnotherThing /> 
    </div> 
); 
} 

しかしcomponentWillUnmount()がトリガされません。これはデフォルトですか、私はここで間違っていますか?サブツリー内のすべてのコンポーネントに対してcomponentWillUnmount()がトリガーされると思います。

この

UPDATEはすべてそれが必要として働いています。私の時計プロセスが機能しなくなったので、アンマウントが見えませんでした。

+1

なぜあなたのコンポーネントの内部でReactDOMを使っているのですか?私はあなたが達成しようとしていることを正確には分かっていませんが、多くのユースケースはレンダリング機能の選択的レンダリングか、より高いオーダーのコンポーネント – travelboy

答えて

2

あなたはあなたが今それをやっているより簡単にしたいことを達成することができます。

あなたのレンダリング機能は、次のようになります。

render() { 
    return (
    <div> 
     { this.state.editing ? this.props.component : null } 
    </div> 
) 
} 

renderあなたの状態やあなたの小道具が変化しているときに実行されますので、あなたは、あなたが達成したいものを達成するために別のライフサイクルメソッドは必要ありません。 Reactはthis.props.componentのマウントとアンマウントを処理します。

+0

によってカバーされ、this.props.componentを同じDOMNodeにラッパーですが、それは別のものになければなりません。 – philipp

+0

わかりません。コンポーネントでDOM自体を変更し、別のコンポーネントをDOMのどこかに追加しますか?これは非常に悪い考えのようで、Reactのコンセプトに反するものです。なぜあなたはこれをしたいのですか? – Malax

+0

しかし、それは私がやっていることであり、今はかなりうまくいっています。私は複数のマウントポイントを持っていますが、それはそれらの子コンポーネントをマウントしてマウント解除する追加の作業を追加するだけです。« – philipp

関連する問題