কোনও রিডেক্স-সাগা ফাংশনের ভিতরে কীভাবে রাজ্য / স্টোর থেকে কিছু পাবেন?


121

আমি কীভাবে একটি সাগা ফাংশনের অভ্যন্তরে রিডাক্স রাজ্যে অ্যাক্সেস করব?

সংক্ষিপ্ত উত্তর:

import { select } from 'redux-saga/effects';
...
let data = yield select(stateSelectorFunction);

উত্তর:


209

যেমনটি @ মার্কেরিকসন ইতিমধ্যে বলেছেন, কাহিনীর অভ্যন্তরে এর কিছু অংশ উপলব্ধ করার জন্য রাজ্যে একটি অনুরোধ করার জন্য redux-sagaখুব দরকারী এপিআই প্রকাশ করেছে।select()selector

আপনার উদাহরণের জন্য একটি সাধারণ বাস্তবায়ন হতে পারে:

/*
 * Selector. The query depends by the state shape
 */
export const getProject = (state) => state.project

// Saga
export function* saveProjectTask() {
  while(true) {
    yield take(SAVE_PROJECT);
    let project = yield select(getProject); // <-- get the project
    yield call(fetch, '/api/project', { body: project, method: 'PUT' });
    yield put({type: SAVE_PROJECT_SUCCESS});
  }
}

@ মার্কেরিকসনের প্রস্তাবিত ডক ছাড়াও, ডি আব্রামভের একটি খুব ভাল ভিডিও টিউটোরিয়াল রয়েছে যা রেডাক্সের selectorsসাথে কীভাবে ব্যবহার করতে হয় তা ব্যাখ্যা করে । এছাড়াও চেক করুন এই টুইটারে আকর্ষণীয় থ্রেড।


3
ঠিক আমি যা চেয়েছিলাম .. আমি বিশ্বাস করতে পারি না আমি এটি মিস করেছি
আদম তাল

28

এটিই "নির্বাচক" ফাংশনগুলির জন্য। আপনি তাদেরকে পুরো রাজ্য গাছটি দিয়ে দিন এবং তারা রাজ্যের কিছু অংশ ফেরত দেয়। যে কোডটি নির্বাচককে কল করে তাদের তথ্যের প্রয়োজন নেই যেখানে তথ্য ছিল কোথায়, কেবলমাত্র এটি ফিরে এসেছে। কিছু উদাহরণের জন্য http://redux.js.org/docs/recips/ComputingDerivedData.html দেখুন ।

একটি কাহিনী মধ্যেই select()এপিআই একটি নির্বাচক চালানো ব্যবহার করা যাবে।


এটি আকর্ষণীয় যে কীভাবে এটি গৃহীত উত্তরের ৩.৩ ঘন্টা আগে লেখা হয়েছিল , তবে এটি উদাহরণ দেয় নি, সুতরাং এটি গ্রহণে ব্যর্থ হয়েছিল। যাইহোক আপনাকে ধন্যবাদ!
আলেকসান্দার

1
@ ক্যাস্পার - আমি রাজি! তবে আপনি এখানে কোনও প্রশ্নের উত্তর কত দ্রুত দিয়েছেন তা নয় তবে আপনার উত্তরটি কতটা ভাল। আমি মনে করি উত্তরগুলি অবশ্যই সহজ এবং সহজেই পড়তে হবে। এই উত্তরটি মেলে না এবং গৃহীত উত্তরটি বোঝা অনেক সহজ।
আদম তাল

@ অ্যাডামটাল হ্যাঁ, আমি রাজি আছি :)
আলেকসান্দার

2

আমি জেনারেটর ফাংশনের মধ্যে একটি কলব্যাক থেকে কোনও ক্রিয়া প্রেরণের জন্য ইভেন্টচ্যানেল ব্যবহার করেছি

import {eventChannel} from 'redux-saga';
import {call, take} from 'redux-saga/effects';

function createEventChannel(setEmitter) {
    return eventChannel(emitter => {
        setEmitter(emitter)
        return () => {

        }
      }
    )
}

function* YourSaga(){
    let emitter;
    const internalEvents = yield call(createEventChannel, em => emitter = em)

    const scopedCallback = () => {
        emitter({type, payload})
    }

    while(true){
        const action = yield take(internalEvents)
        yield put(action)
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.