如何使用 React Hook `useWindowSize` 初始化 MobX Store 中的 window 大小?

How to use a React Hook `useWindowSize` to initialize window size inside a MobX Store?

我在 FrameItStore 中有 win() 函数,其中 returns window.innerWidth & window.innerHeight。但它并不总是在 window 大小更改时更新。

FrameItStore.ts

import { makeObservable, observable, action, computed } from 'mobx'

export class FrameItStore implements IFrameItStore {
  constructor() {
    makeObservable(this, {
      win: observable,
    })
  }

  win(): Window {
    return {
      width: window.innerWidth,
      height: window.innerHeight,
    }
  }
}

export const config = new FrameItStore()

所以我想使用 Window Size Hook → https://www.npmjs.com/package/@react-hook/window-size 来更新尺寸。

问题是我不知道如何使用 hook 值初始化 win() 函数,因为 hooks 只能在 React Component 中调用?

我该怎么做?

由于您将 window 维度存储在 React 组件之外,如果您愿意,也可以在 React 组件之外更新它们。

例子

import { makeObservable, observable, action } from 'mobx';

export class FrameItStore implements IFrameItStore {
  win = {
    width: window.innerWidth,
    height: window.innerHeight
  };

  constructor() {
    makeObservable(this, {
      win: observable,
      updateWin: action.bound
    });
    
    // Update this.win every time the window resizes
    window.addEventListener("resize", this.updateWin);
  }

  updateWin() {
    this.win.width = window.innerWidth;
    this.win.height = window.innerHeight;
  }
  
  // If your FrameItStore won't live for the entire duration of the application,
  // you can call this method to remove the event listener.
  destroy() {
    window.removeEventListener("resize", this.updateWin);
  }
}