webpackを使用して、反応しないアプリケーションで反応コンポーネントを使用しています。アイデアは、DOMにマウントしたりマウント解除したりできるように、これらをエクスポートすることです。React以外のアプリケーションでReactコンポーネントをマウント/アンマウントするときにDOMノードの参照を保持する
これは私がコンポーネントをテストしていますhtmlページです:
<script type="text/javascript" src="<?php echo base_url('assets/javascripts/build/component.js') ?>"></script>
<button onclick="showComponent()" />show component</button>
<button onclick="hideComponent()" />hide component</button>
<div id='mainContainer'></div>
<script >
function showComponent() {
MyComponent.mount(document.getElementById('mainContainer'))
}
function hideComponent() {
MyComponent.unmount()
}
</script>
これはWebPACKのエントリポイントである:WebPACKのコンフィグで
import React from 'react'
import MyComponent from '/path/to/MyComponent'
import ComponentMounter from '/path/to/ComponentMounter'
let componentMounter = new ComponentMounter(<MyComponent />)
export let mount = componentMounter.mount
export let unmount = componentMounter.unmount
、私のようにバンドルを輸出しています
ComponentMounterクラス:
を使用して、ライブラリ、import ReactDOM from 'react-dom'
class ComponentMounter {
constructor(component) {
this.component = component
}
mount = (element) => {
// This renders the react 'component', mounting it in the DOM 'element'
this.element = ReactDOM.render(this.component, element)
}
unmount =() => {
// This unmounts the react 'component', removing the DOM 'element'
ReactDOM.unmountComponentAtNode(this.element)
}
}
export default ComponentMounter
私がそこで何をしようとしていることが分かりましよう。表示ボタンをクリックすると、コンポーネントは問題なくマウントされます。
しかし、私はそれをアンマウントしようとすると、私がこの警告を得るように、要素が有効なDOM要素ではないようだ。
invariant.js:38 Uncaught Invariant Violation: unmountComponentAtNode(...): Target container is not a DOM element.
は、どのように私は内に取り付けられリアクトコンポーネントへの参照を保持することができますComponentMounterオブジェクト内のDOMノードで、必要なときに簡単にアンマウントできますか?
あなたの答えは良い方向に向いているようです(私は 'ReactDOM.render'のためのドキュメントを見逃していました)が、別の問題があると思います:' this.element'の値は 'undefined'です'unmount'関数が呼び出されます。私は 'mount'と' unmount'関数が呼び出されたときにデバッガのブレークポイントを追加し、 'this.element 'の値をエコーすることでこれをチェックしています。面白いことに、 'this.component'でも起こりますが、' mount'関数を呼び出すと 'undefined'と思われますが、どうにかしてコンポーネントはうまくマウントされます。 –
実際、気にしないでください。それは無関係の問題でした。あなたの答えは正しかった。ありがとう! –