Redux: ファイルのアップロードが遅れています...ファイルオブジェクトをどこに配置しますか?

作成日 2016年07月18日  ·  3コメント  ·  ソース: reduxjs/redux

ファイルのアップロードの処理に関する提案を探しています。 ユーザーがファイルをドラッグアンドドロップして、ファイルのアップロードを開始する前にサインアップするように求められるランディングページがあります。 ドラッグしたファイルオブジェクトをどこかに保持する必要がありますが、Redux状態はプレーンなJSオブジェクトのみを保持することになっているため、そのファイルオブジェクトをどこに配置するかわかりません。 Reactの状態/小道具でそれを保持することはできますが、最終的に正しいコンポーネントなどに渡されることを確認する必要があります。

最も参考になるコメント

@olalonde状態をシリアライズ可能にすることをお勧めしますが、これはやわらかいものです。 これは主に、サーバー側のレンダリングと状態のスナップショットを簡単にするために存在します。これは、クライアントで状態をハイドレイトしたり、どこかに送信したりするために状態をシリアル化できる必要があるためです。 これは純粋にクライアント上で行われるため、先に進んでそのファイルオブジェクトを短期的に保存してさらに処理するのはそれほど悪くないかもしれません。

また、状態をシリアル化しても、 File記述子がオブジェクトオブジェクトにシリアル化されるため、シリアル化エラーは発生しません。

全てのコメント3件

考えられる解決策の1つは、store.subscribeを使用して状態の変化をストアでリッスンすることですが、 connect(...)を使用してstore.subscribeにアクセスする方法はわかりません。 多分this.context.store.subscribe()

@olalonde状態をシリアライズ可能にすることをお勧めしますが、これはやわらかいものです。 これは主に、サーバー側のレンダリングと状態のスナップショットを簡単にするために存在します。これは、クライアントで状態をハイドレイトしたり、どこかに送信したりするために状態をシリアル化できる必要があるためです。 これは純粋にクライアント上で行われるため、先に進んでそのファイルオブジェクトを短期的に保存してさらに処理するのはそれほど悪くないかもしれません。

また、状態をシリアル化しても、 File記述子がオブジェクトオブジェクトにシリアル化されるため、シリアル化エラーは発生しません。

ありがとう。 アップロードアクションクリエーターを次の関数でラップすることになりました。

waitIntroMessageShowedActionCreator.js

// delays execution of `fn` until `state.session.user.ui.introMessageShowed === true`

export const initWaitIntroMessageShowed = ({ getState, subscribe }) => (fn) => () => (
  new Promise((resolve, reject) => {
    const handleChange = () => {
      const state = getState()
      if (!state.session.user.ui) return null
      if (!state.session.user.ui.introMessageShowed) return null
      /* eslint-disable no-use-before-define */
      unsubscribe()
      return Promise
        .resolve()
        .then(() => fn())
        .catch(reject)
        .then(resolve)
    }
    const unsubscribe = subscribe(handleChange)
    handleChange()
  })
)

そして私のコンポーネントでは:

class DragDropSignup extends Component {
  constructor(props) {
    super(props)
    const waitIntroMessageShowed = initWaitIntroMessageShowed(this.props.store)
    this.onSignupSuccess = waitIntroMessageShowed(this.onSignupSuccess.bind(this))
  }
 // ...
}
// ...

// pass store object as prop
const connectStore = () => (WrappedComponent) => {
  const ConnectStore = (props, context) => (
    <WrappedComponent store={context.store} {...props} />
  )
  ConnectStore.contextTypes = { store: React.PropTypes.object }
  return ConnectStore
}

export default connectStore()(connect()(DragDropSignup))

誰かに役立つ場合に備えてここに投稿する

このページは役に立ちましたか?
0 / 5 - 0 評価