11
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ReactでWindowのリサイズイベントを取得するのに react-event-listenerつかった

Posted at

Redux + ReactなサイトでウィンドウサイズもReduxで管理させたかった。
Cantainer内で設定することもできるが、ルートコンポーネントが管理することになりそうなので、何か便利なものはないか探したたらreact-event-listenerがあった。

<EventListener target="window" onResize={onResize} />

みたいな感じでつかえるので、以下のようなContainerを用意してつかっています。

containers/resize_event_listener.js
import { connect } from 'react-redux'
import EventListener from 'react-event-listener';

const resize = (value) => { type: 'RESIZE', value };

const mapStateToProps = (state, ownProps) => {
    return {
        target: window
    };
};

const mapDispatchToProps = (dispatch, ownProps) => {
    return {
        onResize: () => {
            return dispatch(resize(window.innerWidth, window.innerHeight));
        }
    }
};

const ResizeEventListener = connect(mapStateToProps, mapDispatchToProps)(EventListener);

export default ResizeEventListener

みたいなのを用意して以下のようにつかってます。

<ResizeEventListener />

もうちょっと詳しく

reactつかうときはなるべくconstだけで戦いたいといろいろやってるうちにこういうやり方におちつきました。
あと関数スタイルのコンポーネント作成にこだわりたいというのもあります。

このReactEventListenerを使わない場合は以下のように書いて近いことはできます。

const mapDispatchToProps = (dispatch, ownProps) => {
    window.addEventListener('resize', () => {
       dispatch(resize(window.innerWidth, window.innerHeight)
    }
    return {}
};

componentDidMountの代わりのようにつかえますが、componentWillUnmountの代わりにつかう方法がないので、removeEventListenerする良い方法が浮かびません。
他にはhttps://github.com/acdlite/recomposeを使うと関数スタイルを貫き通すことができると思います。

11
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?