কিভাবে রেডাক্সে স্টেট আপডেট করার পরে কলব্যাক বন্ধ করতে হবে?


86

প্রতিক্রিয়াতে, রাষ্ট্রটি তাত্ক্ষণিকভাবে আপডেট করা হয় না, তাই আমরা কলব্যাক ইন ব্যবহার করতে পারি setState(state, callback)। তবে রেডাক্সে এটি কীভাবে করবেন?

কল করার পরে this.props.dispatch(updateState(key, value)), আমার সাথে সাথে আপডেট হওয়া রাষ্ট্রের সাথে কিছু করা উচিত with

আমি প্রতিক্রিয়াতে যা করি তার মতো সর্বশেষ রাষ্ট্রের সাথে কলব্যাক কল করার কোনও উপায় আছে কি?


আপনি কি ব্যবহার করেন thunk?
প্রাণেশ রবি

4
আমি মনে করি dispatch()একটি সিঙ্ক্রোনাস ক্রিয়াকলাপ। আপডেট হওয়া স্টেটটি পরবর্তী লাইনে পাওয়া উচিত।
প্রণেশ রবি

4
@ প্রাণেশরভি আমি ভেবেছিলাম তবে আমি পুরানো অবস্থা পেয়েছি। আমি ব্যবহার করিনি thunk
ব্রিক ইয়াং


4
হ্যাঁ প্রেরণা সিঙ্ক্রোনাস, তবে উপাদানগুলির প্রপসগুলির পরবর্তী আপডেটটি নয়। অতএব, রেডুয়াক্স রাষ্ট্রটি পরবর্তী লাইনে আপডেট হয়েছে, তবে উপাদানটির প্রপসগুলি এখনও নেই।
amik

উত্তর:


113

উপাদানগুলি নতুন প্রপসগুলি পেতে আপডেট করা উচিত।

আপনার লক্ষ্য অর্জনের উপায় আছে:

1. উপাদানপরিবর্তনযোগ্য মান পরীক্ষা করা আছে কিনা তা পরীক্ষা করুন, তারপরে কিছু করুন ..

 componentDidUpdate(prevProps){
     if(prevProps.value !== this.props.value){ alert(prevProps.value) }
  }

২.ডুডেক্স-প্রতিশ্রুতি (মিডলওয়্যার প্রতিশ্রুতির সমাধান হওয়া মূল্য প্রেরণ করবে)

export const updateState = (key, value)=>
Promise.resolve({
  type:'UPDATE_STATE',
  key, value
})

তারপর উপাদান

this.props.dispatch(updateState(key, value)).then(()=>{
   alert(this.props.value)
})

২.ডুডেক্স-থাঙ্ক

export const updateState = (key, value) => dispatch => {
  dispatch({
    type: 'UPDATE_STATE',
    key,
    value,
  });
  return Promise.resolve();
};

তারপর উপাদান

this.props.dispatch(updateState(key, value)).then(()=>{
   alert(this.props.value)
})

6
আপনার redux-thunkউদাহরণে, আপনি dispatchএটি সিঙ্ক্রোনাস হিসাবে ব্যবহার করুন । এটাই কি?
ড্যানি হার্ডিং

4
@ ড্যানিহার্ডিং dispatchসিঙ্ক্রোনাস নয়। ছাড়া Promise.resolve(), this.props.valueএখনও পুরানো মান ফিরে আসবে। কিছু ধরণের অ্যাসিনকি ডিফারাল এখনও প্রয়োজন ( setTimeoutউদাহরণস্বরূপ একটি এর মধ্যে থেকে রেফারেন্সিংও কাজ করবে)।
ড্রাজেন বিজেলভুক

4
@ ড্রাজেনবিজেলোভুক আমি ভাবছি কারণ রিডেক্স-থাঙ্ক উদাহরণের আপডেট স্টেট ফাংশনটিতে প্রেরণ (সামান্য কিছু) অবিলম্বে ফিরতি প্রতিশ্রুতি। প্রতিশ্রুতি তত্ক্ষণাত্‍ সমাধান হয়, যা আমি কল্পনা করি যে রিডুএক্স স্টোর আপডেট এবং .একটি উপাদানটিতে ডেকে আনা হয়েছে condition কারণ প্রেরণ কোনও প্রতিশ্রুতি দেয় না বা কোনও কলব্যাক গ্রহণ করে না, তাই আমি কখনই রেডুএক্স স্টোরটি আপডেট করা হয়েছে তা জানার সঠিক উপায় বলে আমি মনে করি না। আমি মনে করি যে জাস্ট-বরিসের উত্তর এই ক্ষেত্রে সঠিক
ড্যানি হার্ডিং

4
@ ড্যানিহার্ডিং হ্যাঁ আমি সম্মত হই যে এই পদ্ধতিটি সম্ভবত একটি নিশ্চিত অগ্নি গ্যারান্টি নয়, কেবল উদাহরণস্বরূপ যে প্রেরণটি সমকালীন নয়।
ড্র্যাজেন বেজেভোভুক

4
আমি এখানে হ্রাস-থাঙ্ক সমাধানটি ব্যবহার করার চেষ্টা করছি, তবে আমি কেবল পাই TypeError: _this.props.dispatch is not a function?
ক্রিলকো

14

প্রতিক্রিয়া সম্পর্কে সর্বাধিক গুরুত্বপূর্ণ বিষয় হচ্ছে একমুখী ডেটা প্রবাহ। আপনার উদাহরণে এর অর্থ হ'ল, কোনও পদক্ষেপ প্রেরণ এবং রাষ্ট্রীয় পরিবর্তন হ্যান্ডলিংটি ডিউপল করা উচিত।

"আমি করেছি A, এখন Xহয়ে যায় Yএবং আমি এটি পরিচালনা করি" এর মতো আপনার ভাবা উচিত নয় , তবে কোনও সম্পর্ক ছাড়াই " আমি Xহয়ে গেলে আমি কী করব Y" A। স্টোর স্টেটটি একাধিক উত্স থেকে আপডেট করা যেতে পারে, আপনার উপাদান ছাড়াও, টাইম ট্র্যাভেলও রাষ্ট্র পরিবর্তন করতে পারে এবং এটি আপনার Aপ্রেরণের পয়েন্টের মধ্য দিয়ে যাবে না ।

মূলত এর অর্থ componentWillReceivePropsহ'ল @ ইউট্রোর প্রস্তাব অনুসারে আপনার ব্যবহার করা উচিত


এটিই উত্তরটি সত্যই সন্ধান করছে (যদিও দেখে মনে হচ্ছে তিনি এ সম্পর্কে অবগত নন ..)
রেফেলিও

4
আমি সম্মত তবে এটিকে একটি অ্যান্টিপ্যাটার্ন হিসাবে বিবেচনা করা হবে: হ্যাকারুন.ন.ম.২
গিয়াকোমো সারকোনে

4
componentWillReceivePropsঅবহেলিত আমরা এখন কী করব ? static getDerivedStateFromProps()এটি কোনও কলব্যাক কল করতে পারে না বলে উপযুক্ত প্রতিস্থাপন বলে মনে হচ্ছে না, যতদূর আমি বলতে পারি
M3RS

10

হুকস এপিআই সহ:

useEffect ইনপুট হিসাবে প্রপ সঙ্গে।

import React, { useEffect} from 'react'
import { useSelector } from 'react-redux'

export default function ValueComponent() {
   const value = useSelector(store => store.pathTo.value)

   useEffect(() => {
     console.log('New value', value) 
     return () => {
        console.log('Prev value', value) 
     }

   }, [value])

   return <div> {value} </div>
}

গৃহীত উত্তরটি প্রতিক্রিয়া হুক্সের আগে লেখা হয়েছিল। হুক প্রবর্তনের পরে এটি এখনই গ্রহণযোগ্য উত্তর হওয়া উচিত। পরিবর্তনগুলি পরিচালনা করার এটি আরও প্রতিক্রিয়াশীল উপায়।
tif

5

আপনি subscribeশ্রোতাদের ব্যবহার করতে পারেন এবং কোনও ক্রিয়া প্রেরণ করা হলে এটি ডাকা হবে। শ্রোতার অভ্যন্তরে আপনি সর্বশেষ স্টোরের ডেটা পাবেন।

http://redux.js.org/docs/api/Store.html# সাবস্ক্রাইবলিস্টেনার


4
subscribeকোনও অ্যাকশন প্রেরণ করা হলে কেবল গুলি চালায়। subscribeআপনার এপিআই কল কোনও ডেটা ফিরিয়ে দিয়েছে কিনা এমন কোনও উপায় আপনাকে জানাতে পারে না .. আমার মনে হয়! : ডি
মিহির

আপনার অনুরোধটি সম্পূর্ণ হলে (সফলভাবে বা অসফল) আপনি অন্য ক্রিয়া প্রেরণ করতে পারেন।
জাম

আমি নিশ্চিত নই যে এখানে প্রস্তাবিত অন্য যে কোনও সমাধান আসলেই কাজ করে, কারণ রাজ্য আপডেট হওয়ার পরে সমাধানের প্রতিশ্রুতি বা আগুনের কলব্যাকের কোনও উপায় আমি দেখতে পাই না। এই ইভেন্টটি প্রতিটি স্টোর আপডেটের জন্য ডেকে আনে, কেবল আপনার ইভেন্টের পরে ঘটে এমন একটি নয়, তবে এটির কাজ করা খুব বেশি কঠিন হওয়া উচিত নয়। বিশেষত, লিঙ্কটি যে পৃষ্ঠায় আপনি লিঙ্ক করেছেন সেগুলি থেকে একটি কাস্টম অবজেক্ট স্টোর ইউটিলিটি লিখুন খুব সহায়ক।
নাট কুহন

লিঙ্ক পৃষ্ঠাটি পাওয়া যায় নি
ভারত মোদি

2

আপনি একটি কলব্যাক দিয়ে একটি থঙ্ক ব্যবহার করতে পারেন

myThunk = cb => dispatch =>
  myAsyncOp(...)
    .then(res => dispatch(res))
    .then(() => cb()) // Do whatever you want here.
    .catch(err => handleError(err))

আমার যা প্রয়োজন ছিল তার জন্য পারফেক্ট!
JSON C11

-1

একটি সহজ সমাধান হিসাবে আপনি ব্যবহার করতে পারেন: রিডেক্স-প্রতিশ্রুতি

তবে আপনি যদি রিডেক্স-থাঙ্ক ব্যবহার করেন তবে আপনার এইরকম স্ট্যান্ড করা উচিত:

function addCost(data) {
  return dispatch => {
    var promise1 = new Promise(function(resolve, reject) {
      dispatch(something);
     });
    return promise1;
  }
}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.