2017-10-15 14 views
0

I次のコードがあります(ユーザーがページ中旬の貿易を離れた場合、すなわちFirebaseにいくつかの状態を復元)が反応 - ウィンドウのbeforeunloadイベントは発生しません

class TradeItemBox extends React.Component { 
    constructor(props) { 
    super(props) 
    console.log('tradeitembox', props) 

    this.removeItemsFromTrade = this.removeItemsFromTrade.bind(this) 
    this.onUnloadCleanup = this.onUnloadCleanup.bind(this) 
    } 


    renderItems() { 
    const {trade} = this.props 
    if (trade.items.length === 0) { 
     return null 
    } 
    return trade.items.map((item, key) => { 
     return <TradeItem key={key} item={item}/> 
    }) 
    } 

    onUnloadCleanup() { 
    alert('Hello!') 
    console.log('unloading') 
    if(this.props.trade.items.length > 0) { 
     this.removeItemsFromTrade() 
    } 
    } 

    componentDidMount() { 
    console.log('did mount') 
    window.addEventListener('beforeunload', this.onUnloadCleanup) 
    } 

    componentWillUnmount() { 
    window.removeEventListener('beforeunload', this.onUnloadCleanup) 
    } 

    removeItemsFromTrade() { 
    const {firebase, trade, removeItemFromTrade} = this.props 
    trade.items.forEach((item) => { 
     item.isTemporarilyInUse = false 
     item.currentUser = null 
     firebase.set(`/inventory/${item.id}`, item) 
     removeItemFromTrade(item.id) 
    }) 
    } 


    render() { 
    return (
     <Col xs={12} md={5}> 
      <div className="items-container"> 
      {this.renderItems()} 
      </div> 
      <Button 
      onClick={this.removeItemsFromTrade} 
      disabled={!this.props.isLoggedIn} 
      color="success" 
      > 
      {'<= Clear trade'} 
      </Button> 
     </Col> 
    ) 
    } 
} 

const firebaseWrappedComponent = firebase()(TradeItemBox) 

const mapStateToProps = ({trade, user}) => ({ 
    isLoggedIn: user.isLoggedIn, 
    trade 
}) 

const mapDispatchToProps = (dispatch) => { 
    return bindActionCreators({ 
    removeItemFromTrade 
    }, dispatch) 
} 

export default connect(
    mapStateToProps, 
    mapDispatchToProps 
)(firebaseWrappedComponent) 

私が行う必要があるいくつかのクリーンアップがありますがですから、私はSOを読んで、イベントリスナーをcomponentDidMountのwindow.beforeunloadに追加し、componentWillMountでイベントリスナーを削除する必要があることを知りました。ただし、イベントは発生せず、アラートは表示されません。リフレッシュやタブの終了は表示されません。なぜこれが起こらないのかについてのヒント?

+0

「マウントしました」ログが表示されましたか? – eavichay

答えて

0

このイベントに割り当てたコールバックから文字列を返す必要があります。

onUnloadCleanup() { 
     alert('Hello!') 
     console.log('unloading') 
     if(this.props.trade.items.length > 0) { 
      this.removeItemsFromTrade() 
     } 
     return "unloading"; 
     } 
+0

魅力的な作品です。 もう1つ質問:ページ終了時にイベントが発生しますが、ページを更新してもイベントは発生しません。どのようにそれを処理するためのヒント? –

+0

戻り値の前にこのコードを追加する - > e.event.returnValue = "アンロード"。これは画面上のポップアップでなければなりません。 –

関連する問題