Dva: サブスクリプションはいくつかの例やドキュメントを追加できますか?

作成日 2016年10月19日  ·  17コメント  ·  ソース: dvajs/dva

データソースには、現在の時刻、サーバーのWebSocket接続、キーボード入力、ジオロケーションの変更、履歴ルーティングの変更などがあります。

このセットアップとkeyEventがどこから来たのか、そしてWebSocketなどの場合にそれを作成する方法を理解できます。

question

最も参考になるコメント

参考までに、ソケットを試してみました。

// model

import * as service from '../services/socket';

subscriptions: {
    socket({dispatch}){ // socket相关
        return service.listen(data => {
            switch (data.type) {
                case 'connect':
                    if (data.state === 'success') {
                        dispatch({
                            type: 'connectSuccess'
                        })
                    } else {
                        dispatch({
                            type: 'connectFail'
                        })
                    }
                    break;
                case 'welcome':
                    dispatch({
                        type: 'welcome'
                    });
                    break;
            }
        })
    }
},

// services

import io from 'socket.io-client';

let socket = '';

export function listen(action) {
    if (socket === '') {
        try {
            socket = io("localhost:3000");
            action({
                type: 'connect',
                state: 'success'
            });
        } catch (err) {
            action({
                type: 'connect',
                state: 'fail'
            });
        }
    }
    socket.on('welcome', () => {
        action({
            type: 'welcome'
        })
    })
}

全てのコメント17件

つまり、このキーは、開発者がここで特定のタイプの関数をマークするのを支援するためにのみ使用されます。ディスパッチと履歴を渡すだけであり、特定の監視コードでは、監視を実装するために特定のサードパーティライブラリが必要です。

私の理解は正しいですか?

はい、ここではキー/値形式を使用しています。現在は、主にエフェクトやレデューサーとの整合性を保つためです。今後、サブスクリプションキャンセル機能をサポートし、キーを使用します。

わかりました、ありがとうございます。
しかし、私はこれらの文書に上記の議論の意味を追加できると思います、あなたは私と同じ問題に遭遇するかもしれません:)

サブスクリプションは、データをサブスクライブする場所を定義するだけです。次に、ディスパッチと履歴が渡されます。サブスクライブまたは監視する方法を実装するには、サードパーティのクラスライブラリが必要です。それは理解していますか? ディスパッチはreduxのストアでのディスパッチであり、履歴はreact-routerでの履歴です。

@ roc2539はい。

サブスクリプションのセットアップで状態または小道具のコンテンツにアクセスできますか?

@gzbigeggいいえ、アクションをトリガーして、エフェクトに処理させます。

subscriptions: {
    setup ({ dispatch }) {
      dispatch({ type: 'query' })
    }
}

2つの質問があります。それが正しいかどうかはわかりません。ドキュメントには、elmがそれらに接触したことがないことが記載されており、サブスクリプションを明確に理解していません。

  1. 履歴を渡してhistory.listenを実行すると、ルートが変更されたときにトリガーされます。理解が正しいかどうかはわかりません。
  2. ディスパッチでのみ渡されるサブスクリプションはいつトリガーされますか?

websocketのようなサブスクリプションの例を見たいです

セットアップで2つのアクションを区別する方法

サブスクリプション登録@ roc2539には、コールバックのタイミングとインジェクションパラメータに関する明確なドキュメントがありません。回答できますか?

ハッシュルートに変更した後、セットアップはキーボードからのURL入力の変更を監視できません。
ただし、browserHistoryを使用することは問題ありません。

 setup ({ dispatch }) {
      console.log('models-app') // 手动改变url地址,不会进此方法
      dispatch({ type: 'query' })

    },

参考までに、ソケットを試してみました。

// model

import * as service from '../services/socket';

subscriptions: {
    socket({dispatch}){ // socket相关
        return service.listen(data => {
            switch (data.type) {
                case 'connect':
                    if (data.state === 'success') {
                        dispatch({
                            type: 'connectSuccess'
                        })
                    } else {
                        dispatch({
                            type: 'connectFail'
                        })
                    }
                    break;
                case 'welcome':
                    dispatch({
                        type: 'welcome'
                    });
                    break;
            }
        })
    }
},

// services

import io from 'socket.io-client';

let socket = '';

export function listen(action) {
    if (socket === '') {
        try {
            socket = io("localhost:3000");
            action({
                type: 'connect',
                state: 'success'
            });
        } catch (err) {
            action({
                type: 'connect',
                state: 'fail'
            });
        }
    }
    socket.on('welcome', () => {
        action({
            type: 'welcome'
        })
    })
}

指定されたキーでサブスクリプションをトリガーする方法を見つけようとしていますが、元々、初期化時にすべて1回実行されるため、このサブスクリプションはディスパッチと履歴の終了のみを提供します😄

サブスクリプション:{
セットアップ({ディスパッチ}){
dispatch({type: 'query'})
}
これはディスパッチアクションの最初の実行にすぎず、実際にはサブスクリプションアクションを実行しません。

いきなり気づいた

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