問題は次のとおりです。どのようにして登録を解除するリスナーを見つけることができますか?
コールバックの配列でリスナーを取得しました。それらは次のようになります。
static listeners = [];
これらは、配列の項目を追加および削除するjsファイルです。
static items = [];
static listeners = [];
static add(item) {
this.items.push(item);
this.listeners.forEach((callback) => callback());
};
static remove(item) {
var index = this.items.indexOf(item);
this.items.splice(index, 1);
this.listeners.forEach((callback) => callback());
};
static register(callback) {
this.listeners.push(callback);
};
状態を設定して配列が変更され、再描画されるときにコンポーネントに通知させたいと考えています。
constructor() {
super();
this.state = {
items: ShoppingCartStore.items
};
}
componentWillMount(){
ShoppingCartStore.register(this.refresh.bind(this));
}
componentWillUnmount(){
ShoppingCartStore.removeEventListener(?, ?);
}
refresh() {
this.setState({items: ShoppingCartStore.items})
}
render() {
return (
<div>
<h1>Shopping Cart</h1>
<table className="pure-table">
<thead>
<tr>
<td>No</td>
<td>Item</td>
<td>Size</td>
<td>Price</td>
<td></td>
</tr>
</thead>
<tbody>
{this.state.items.map((item, i) => <ShoppingCartRow key={i} index={i} item={item}/>) }
<ShoppingCartSumRow />
</tbody>
</table>
</div>
);
}
他のコンポーネントもこのリスナーの配列をリッスンします。
どのようにリスナーを登録解除する必要があるのですか?
リスナーの登録を解除する必要があります。これは、顧客が選択した項目がメインページに戻り、反応がアンマウントされたコンポーネントに対してsetStateできないためです。
任意の入力のためのおかげで、私はあなたが登録に渡すコールバック関数への参照に保つことができ、私の悪い英語
'removeEventListener'コードはどこにありますか?通常、(いくつかのフレームワーク/レデューサー/状態マネージャで) 'register' /' subscribe'関数は、例えばreduxを使って 'deregister'関数を返します:https://github.com/reactjs/redux/blob/master/docs/ api/Store.md#subscribelistener –
私はjsがそうするための標準的な機能を持っていると思った。しかし、あなたの質問に答えるためにremoveEventListenerのコードはありません。私はこのapiを見つけました。[リンク]:(https://developer.mozilla.org/de/docs/Web/API/EventTarget/removeEventListener)また、私は彼らがプロジェクトの中にいるので、もっと多くのフレームワークを使用することはできません。瞬間 – venter