State Management এবং Hooks

Mobile App Development - রিঅ্যাক্ট নেটিভ (React Native)
231

React Native, যেমন React.js, একটি শক্তিশালী লাইব্রেরি যা ব্যবহারকারী ইন্টারফেস (UI) তৈরি করতে ব্যবহৃত হয়। এর প্রধান ধারণাগুলোর মধ্যে State Management এবং Hooks অত্যন্ত গুরুত্বপূর্ণ ভূমিকা পালন করে। এগুলি অ্যাপ্লিকেশনের ডেটা ফ্লো এবং UI স্টেট ম্যানেজ করতে সহায়ক, যা অ্যাপ্লিকেশনটির কার্যকারিতা এবং রিয়্যাক্টিভিটি বৃদ্ধি করে।


State Management

State হল সেই ডেটা যা একটি কম্পোনেন্টের মধ্যে সংরক্ষিত থাকে এবং যেটি UI পরিবর্তন করতে সাহায্য করে। State Management বলতে বোঝায় অ্যাপ্লিকেশনের একাধিক কম্পোনেন্টে ডেটা এবং স্টেট কিভাবে সঠিকভাবে পরিচালনা এবং ভাগ করা হবে।

React Native বা React এ, State মূলত দুটি ভাবে ম্যানেজ করা হয়: Local State এবং Global State


১. Local State

Local state এমন একটি স্টেট যা একটি নির্দিষ্ট কম্পোনেন্টের মধ্যে ব্যবহৃত হয়। এটি কম্পোনেন্টের UI এর আচরণ বা উপস্থাপন পরিবর্তন করার জন্য ব্যবহৃত হয়।

Local State ম্যানেজ করার জন্য React এ useState হুক ব্যবহৃত হয়। উদাহরণস্বরূপ:

import React, { useState } from 'react';
import { View, Button, Text } from 'react-native';

const Counter = () => {
  const [count, setCount] = useState(0);  // Local state initialization

  return (
    <View>
      <Text>Count: {count}</Text>
      <Button title="Increment" onPress={() => setCount(count + 1)} />
    </View>
  );
};

export default Counter;

এই উদাহরণে, count হল একটি স্টেট ভ্যালু এবং setCount হল স্টেট আপডেট করার ফাংশন। যখন Increment বাটনে ক্লিক করা হবে, তখন count এর মান বাড়ানো হবে।


২. Global State

Global state এমন একটি স্টেট যা অ্যাপের বিভিন্ন কম্পোনেন্টে ব্যবহৃত হয়। একাধিক কম্পোনেন্ট যদি একই ডেটার উপর নির্ভর করে, তাহলে সেই ডেটার সেন্ট্রালাইজড ম্যানেজমেন্ট খুবই গুরুত্বপূর্ণ। React-এ global state ম্যানেজ করার জন্য সাধারণত Context API অথবা Redux ব্যবহার করা হয়।

Context API ব্যবহার করার উদাহরণ:

import React, { useState, createContext, useContext } from 'react';
import { View, Text, Button } from 'react-native';

// Creating Context
const CounterContext = createContext();

const CounterProvider = ({ children }) => {
  const [count, setCount] = useState(0);
  
  return (
    <CounterContext.Provider value={{ count, setCount }}>
      {children}
    </CounterContext.Provider>
  );
};

const CounterDisplay = () => {
  const { count } = useContext(CounterContext);
  
  return <Text>Count: {count}</Text>;
};

const CounterButton = () => {
  const { setCount } = useContext(CounterContext);
  
  return <Button title="Increment" onPress={() => setCount(prev => prev + 1)} />;
};

const App = () => {
  return (
    <CounterProvider>
      <View>
        <CounterDisplay />
        <CounterButton />
      </View>
    </CounterProvider>
  );
};

export default App;

এখানে CounterContext ব্যবহার করে আমরা অ্যাপের মধ্যে global state ম্যানেজ করেছি, যেখানে CounterProvider কম্পোনেন্ট স্টেট প্রদান করে এবং অন্য কম্পোনেন্টগুলো সেই স্টেট ব্যবহার করছে।


Hooks in React Native

React এবং React Native-এ Hooks হল ফাংশনাল কম্পোনেন্টের মধ্যে স্টেট এবং অন্যান্য React ফিচার ব্যবহারের জন্য একটি সিম্পল এবং শক্তিশালী পদ্ধতি। React 16.8 তে Hooks চালু হয়েছিল, এবং এটি ফাংশনাল কম্পোনেন্টের মধ্যে বিভিন্ন বৈশিষ্ট্য যোগ করতে সহায়ক।

প্রধান React Hooks

  1. useState

    • useState একটি হুক যা কম্পোনেন্টের স্টেট ম্যানেজ করতে ব্যবহৃত হয়। এর মাধ্যমে আপনি কম্পোনেন্টের ভিতরে স্টেট ভ্যারিয়েবল তৈরি করতে পারেন এবং সেই স্টেট আপডেট করতে পারেন।

    উদাহরণ:

    const [state, setState] = useState(initialValue);
  2. useEffect

    • useEffect হুকটি সাইড এফেক্ট পরিচালনা করতে ব্যবহৃত হয়। এটি যখন কম্পোনেন্ট রেন্ডার হয় তখন বা স্টেট/প্রপস পরিবর্তন হলে কার্যকর হয়। এটি componentDidMount, componentDidUpdate, এবং componentWillUnmount এর কাজ সম্পাদন করে।

    উদাহরণ:

    useEffect(() => {
      // Perform a side effect like fetching data or subscribing to events
      console.log('Component Mounted');
      
      return () => {
        // Cleanup or unsubscribe from events
        console.log('Component Unmounted');
      };
    }, []);  // Empty dependency array ensures it runs once after mount
  3. useContext

    • useContext হুকটি React Context API ব্যবহার করার জন্য ব্যবহৃত হয়। এটি গ্লোবাল স্টেট বা ডেটা সহজে কম্পোনেন্টের মধ্যে শেয়ার করতে সাহায্য করে।

    উদাহরণ:

    const value = useContext(MyContext);
  4. useReducer

    • useReducer হুকটি স্টেট ম্যানেজমেন্টের জন্য ব্যবহার করা হয়, যেখানে অনেকগুলি স্টেট ট্রানজিশন এবং কন্ডিশন থাকে। এটি useState এর মতো কাজ করে, তবে স্টেট পরিবর্তনগুলির জন্য রিডিউসার ফাংশন ব্যবহৃত হয়।

    উদাহরণ:

    const [state, dispatch] = useReducer(reducer, initialState);
  5. useRef

    • useRef হুকটি DOM এলিমেন্ট বা ফাংশনাল কম্পোনেন্টের রেফারেন্স তৈরি করতে ব্যবহৃত হয়। এটি স্টেটের মতো রেন্ডার কন্ট্রোল করে না, তাই পারফরম্যান্সে কোনও প্রভাব ফেলে না।

    উদাহরণ:

    const inputRef = useRef(null);

State Management এবং Hooks এর সারাংশ

  • State Management হল আপনার অ্যাপের স্টেট ডেটা কীভাবে ম্যানেজ করা হবে তা নির্ধারণ করা, যা local এবং global স্টেটে ভাগ করা হয়। React Native-এ, Context API এবং Redux ব্যবহৃত হয় গ্লোবাল স্টেট ম্যানেজমেন্টের জন্য।
  • Hooks React Native এবং React এ ফাংশনাল কম্পোনেন্টে স্টেট, সাইড এফেক্ট এবং অন্যান্য React ফিচার ব্যবহারের জন্য ব্যবহৃত হয়। প্রধান হুকগুলোর মধ্যে useState, useEffect, useContext, useReducer, এবং useRef অন্তর্ভুক্ত।

Hooks এবং State Management React Native অ্যাপ ডেভেলপমেন্টের জন্য খুবই গুরুত্বপূর্ণ ধারণা, কারণ এগুলি আপনার অ্যাপের কার্যকারিতা এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে সাহায্য করে।

Content added By

useState এবং useEffect Hooks এর ব্যবহার

307

React Hooks হল React 16.8 এ পরিচিত একটি ফিচার যা ফাংশনাল কম্পোনেন্টে স্টেট এবং লাইফসাইকেল ফিচার ব্যবহারের সুযোগ দেয়। এর মধ্যে useState এবং useEffect দুটি গুরুত্বপূর্ণ হুক। চলুন, এগুলোর ব্যবহার বিস্তারিতভাবে দেখে নেওয়া যাক।


useState Hook

useState হুক React ফাংশনাল কম্পোনেন্টে স্টেট ম্যানেজমেন্ট করার জন্য ব্যবহৃত হয়। এটি আপনাকে কম্পোনেন্টের মধ্যে স্টেট তৈরি ও আপডেট করতে সহায়তা করে।

ব্যবহার:

import React, { useState } from 'react';

function Counter() {
  // useState ব্যবহার করে 'count' নামের একটি স্টেট তৈরি করা হলো এবং সেটি 0 দ্বারা ইনিশিয়ালাইজ করা হয়েছে।
  const [count, setCount] = useState(0);

  // স্টেট পরিবর্তন করার জন্য 'setCount' ফাংশনটি ব্যবহার করা হবে
  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increase</button>
      <button onClick={() => setCount(count - 1)}>Decrease</button>
    </div>
  );
}

export default Counter;

বিস্তারিত ব্যাখ্যা:

  • useState(0) একটি স্টেট ভ্যারিয়েবল তৈরি করে যার প্রাথমিক মান 0। এই ভ্যারিয়েবলটি হলো count, এবং স্টেট আপডেট করার জন্য ব্যবহৃত ফাংশনটি হলো setCount
  • setCount(count + 1) বা setCount(count - 1) ব্যবহার করে স্টেট আপডেট করা হয়। যখনই স্টেট পরিবর্তিত হয়, কম্পোনেন্টটি পুনরায় রেন্ডার হয় এবং UI আপডেট হয়।

useEffect Hook

useEffect হুক React ফাংশনাল কম্পোনেন্টে লাইফসাইকেল মেথড (যেমন componentDidMount, componentDidUpdate, componentWillUnmount) ব্যবহার করার জন্য ব্যবহৃত হয়। এটি সাইড ইফেক্ট (side effects) পরিচালনা করতে, যেমন ডেটা ফেচিং, সাবস্ক্রিপশন, টাইটল আপডেট ইত্যাদি, কাজে আসে।

ব্যবহার:

import React, { useState, useEffect } from 'react';

function Timer() {
  const [seconds, setSeconds] = useState(0);

  useEffect(() => {
    const interval = setInterval(() => {
      setSeconds(prevSeconds => prevSeconds + 1);
    }, 1000);

    // Clean-up function: interval বন্ধ করার জন্য
    return () => clearInterval(interval);
  }, []);  // Empty dependency array means this effect runs only once when the component mounts.

  return (
    <div>
      <p>Time: {seconds} seconds</p>
    </div>
  );
}

export default Timer;

বিস্তারিত ব্যাখ্যা:

  • useEffect এর প্রথম আর্গুমেন্ট হলো একটি ফাংশন, যা কম্পোনেন্টের রেন্ডার হওয়ার পর রান হবে।
  • setInterval ফাংশন ব্যবহার করে প্রতি সেকেন্ডে seconds স্টেট আপডেট করা হচ্ছে।
  • দ্বিতীয় আর্গুমেন্ট [] নির্ধারণ করে যে এই ইফেক্টটি কেবল কম্পোনেন্টের প্রথম রেন্ডার (mount) এর সময়ই রান করবে। এর মানে হলো, এটি কম্পোনেন্টটি প্রথমবার রেন্ডার হওয়ার পর একবারই কার্যকর হবে।
  • clearInterval(interval) হল ক্লিনআপ ফাংশন, যা useEffect এর ভিতরে ডিফাইন করা হয় এবং কম্পোনেন্টটি আনমাউন্ট (unmount) হওয়ার পর সেটি ইনটারভ্যালকে ক্লিয়ার করে।

useState এবং useEffect এর মধ্যে সম্পর্ক

  • useState স্টেট ম্যানেজমেন্টের জন্য ব্যবহৃত হয়, যেখানে useEffect সেই স্টেটের পরিবর্তনের ভিত্তিতে বা কম্পোনেন্টের জীবনের বিভিন্ন পর্যায়ে সাইড ইফেক্ট পরিচালনা করতে ব্যবহৃত হয়।
  • সাধারণত, useState ব্যবহার করে স্টেট তৈরি করা হয় এবং useEffect ব্যবহার করে স্টেটের পরিবর্তন বা কম্পোনেন্টের রেন্ডার শেষে সাইড ইফেক্ট তৈরি বা আপডেট করা হয়।

উদাহরণ: স্টেট পরিবর্তনের পর ডেটা ফেচিং

import React, { useState, useEffect } from 'react';

function DataFetcher() {
  const [data, setData] = useState(null);
  const [isLoading, setIsLoading] = useState(true);

  // useEffect ব্যবহার করে ডেটা ফেচিং
  useEffect(() => {
    fetch('https://api.example.com/data')
      .then(response => response.json())
      .then(data => {
        setData(data);
        setIsLoading(false);
      });
  }, []); // কম্পোনেন্ট মাউন্ট হওয়ার পর একবারই রান হবে

  if (isLoading) {
    return <div>Loading...</div>;
  }

  return (
    <div>
      <h1>Fetched Data</h1>
      <pre>{JSON.stringify(data, null, 2)}</pre>
    </div>
  );
}

export default DataFetcher;

বিস্তারিত ব্যাখ্যা:

  • useState দ্বারা data এবং isLoading স্টেট তৈরি করা হয়েছে।
  • useEffect এর মাধ্যমে fetch API কল করা হয়েছে এবং ডেটা ফেচিংয়ের পর সেটি setData দিয়ে স্টেটে রাখা হয়েছে।
  • যখন ডেটা আসবে, তখন isLoading স্টেট false হয়ে যাবে এবং UI আপডেট হবে।

সারাংশ

  • useState: ফাংশনাল কম্পোনেন্টে স্টেট ম্যানেজমেন্ট করতে ব্যবহৃত হয়।
  • useEffect: লাইফসাইকেল মেথডের মতো কাজ করে এবং সাইড ইফেক্টগুলি পরিচালনা করতে ব্যবহৃত হয়, যেমন ডেটা ফেচিং, সাবস্ক্রিপশন, ইভেন্ট লিসেনার যোগ করা ইত্যাদি।
Content added By

Context API দিয়ে Global State ম্যানেজমেন্ট

296

React এ State এমন একটি ধারণা যা অ্যাপ্লিকেশনটির ডেটা বা স্টেট ম্যানেজমেন্টের জন্য ব্যবহৃত হয়। তবে, যখন আপনার অ্যাপ্লিকেশনটি বড় হয় এবং একাধিক কম্পোনেন্টে একে অপরের সাথে ডেটা শেয়ার করার প্রয়োজন হয়, তখন সাধারণভাবে props ব্যবহার করে এটি করা খুবই কঠিন হয়ে পড়ে। এখানে React Context API একটি শক্তিশালী সমাধান হিসাবে আসে, যা গ্লোবাল স্টেট ম্যানেজমেন্টের জন্য ব্যবহৃত হয়। Context API আপনাকে একটি স্টেট বা ডেটা সহজেই অ্যাপ্লিকেশনটির বিভিন্ন অংশে শেয়ার করতে দেয়, যা props drilling (props দিয়ে ডেটা পাঠানো) কে এড়াতে সহায়ক।

Context API এর সাহায্যে আপনি স্টেটকে একটি কেন্দ্রীয় অবস্থানে রাখেন এবং অ্যাপ্লিকেশনের বিভিন্ন কম্পোনেন্টে সেই স্টেট অ্যাক্সেস করতে পারেন।


Context API দিয়ে Global State ম্যানেজমেন্টের প্রক্রিয়া

১. Context তৈরি করা

প্রথমে আপনাকে একটি Context তৈরি করতে হবে। createContext() ফাংশনটি Context তৈরির জন্য ব্যবহৃত হয়।

import React, { createContext, useState } from 'react';

// Context তৈরি করা
const AppContext = createContext();

export default AppContext;

এখানে AppContext একটি কাস্টম Context তৈরি করা হয়েছে।


২. Context Provider তৈরি করা

Context Provider একটি কম্পোনেন্ট যা স্টেট প্রদান করবে এবং যেসব কম্পোনেন্ট এই স্টেটটি ব্যবহার করতে চায়, তাদেরকে এটি প্রদান করবে। Provider একটি প্রপস হিসেবে value নেয়, যা Context-এ শেয়ার করা ডেটা।

import React, { useState } from 'react';
import AppContext from './AppContext';

const AppProvider = ({ children }) => {
  // Global state তৈরি করা
  const [count, setCount] = useState(0);

  // স্টেট আপডেট করার ফাংশন
  const increment = () => setCount(count + 1);

  return (
    <AppContext.Provider value={{ count, increment }}>
      {children}
    </AppContext.Provider>
  );
};

export default AppProvider;

এখানে, AppProvider একটি Context Provider যা count এবং increment ফাংশন value প্রপস হিসেবে প্রদান করছে।


৩. Context Consumer ব্যবহার করা

এখন আপনাকে যেসব কম্পোনেন্টে Global State অ্যাক্সেস করতে চান, সেখানে Context Consumer ব্যবহার করতে হবে। এর মাধ্যমে আপনি useContext হুক ব্যবহার করে Global State অ্যাক্সেস করতে পারবেন।

import React, { useContext } from 'react';
import AppContext from './AppContext';

const Counter = () => {
  const { count, increment } = useContext(AppContext);

  return (
    <div>
      <h1>Count: {count}</h1>
      <button onClick={increment}>Increment</button>
    </div>
  );
};

export default Counter;

এখানে, useContext(AppContext) হুক ব্যবহার করে আমরা AppContext থেকে count এবং increment ফাংশন প্রাপ্ত করছি। এটি পরবর্তী কম্পোনেন্টে গ্লোবাল স্টেট ব্যবহারের সুবিধা দেয়।


৪. App কম্পোনেন্টে Context Provider ব্যবহার করা

আপনি আপনার অ্যাপ্লিকেশনের মূল কম্পোনেন্টে (যেমন App.js) AppProvider ব্যবহার করে Context Provider হস্তান্তর করবেন।

import React from 'react';
import AppProvider from './AppProvider';
import Counter from './Counter';

const App = () => {
  return (
    <AppProvider>
      <Counter />
    </AppProvider>
  );
};

export default App;

এখানে, AppProvider এর মাধ্যমে Counter কম্পোনেন্টে গ্লোবাল স্টেট প্রদান করা হয়েছে।


Context API দিয়ে Global State ব্যবস্থাপনার সুবিধা

  1. Props Drilling বন্ধ করা
    Context API এর মাধ্যমে আপনি প্রপস ড্রিলিং সমস্যার সমাধান করতে পারেন, যা ছোট এবং মাঝারি আকারের অ্যাপ্লিকেশনে প্রপস মাধ্যমে ডেটা পাঠানো খুব কঠিন হয়ে পড়ে।
  2. একটি কেন্দ্রীয় স্থানে স্টেট সংরক্ষণ
    আপনি অ্যাপ্লিকেশনের সমস্ত গ্লোবাল স্টেট একটি কেন্দ্রীয় স্থানে রাখতে পারবেন এবং যে কোনও কম্পোনেন্ট সহজে তা অ্যাক্সেস করতে পারবে।
  3. সহজ এবং সহজলভ্য
    Context API ব্যবহারের মাধ্যমে স্টেট ম্যানেজমেন্ট করা অনেক সহজ হয়ে যায়। Redux বা MobX এর মতো জটিল লাইব্রেরি ব্যবহার না করেও স্টেট ম্যানেজমেন্ট করা যায়।
  4. একাধিক কম্পোনেন্টে স্টেট শেয়ার করা
    Context API এর মাধ্যমে আপনি একই স্টেটকে একাধিক কম্পোনেন্টে শেয়ার করতে পারবেন, যা অ্যাপ্লিকেশনের কাঠামোকে পরিষ্কার রাখে এবং ডেটা ব্যবস্থাপনাকে আরও কার্যকর করে।

সারাংশ

React Context API একটি শক্তিশালী টুল যা গ্লোবাল স্টেট ম্যানেজমেন্টের জন্য ব্যবহৃত হয়। এটি স্টেট শেয়ার করার একটি সহজ উপায় প্রদান করে, যেখানে আপনি প্রপস ড্রিলিং এড়াতে পারেন এবং সমস্ত কম্পোনেন্টে এককভাবে স্টেট ব্যবহার করতে পারেন। Context API একাধিক কম্পোনেন্টে স্টেট শেয়ার করতে সহায়ক, এবং অ্যাপ্লিকেশনটি সহজ এবং মেইনটেনেবল রাখতে সাহায্য করে।

Content added By

Redux এর মাধ্যমে Complex State ম্যানেজমেন্ট

228

Redux একটি ওপেন সোর্স লাইব্রেরি যা JavaScript অ্যাপ্লিকেশনগুলির জন্য স্টেট ম্যানেজমেন্ট সহজ করে তোলে। এটি বিশেষভাবে React অ্যাপ্লিকেশনগুলির জন্য জনপ্রিয়, তবে অন্য JavaScript লাইব্রেরির সাথেও এটি ব্যবহার করা যেতে পারে। Redux অ্যাপ্লিকেশনের স্টেট (অথবা ডেটা) পরিচালনা এবং একটি কেন্দ্রীয় স্থানে (store) রাখার জন্য ব্যবহৃত হয়, যার ফলে অ্যাপ্লিকেশনটি আরও সুসংগঠিত এবং স্কেলেবল হয়।

Redux এর প্রধান ধারণা

Redux মূলত তিনটি প্রধান অংশে বিভক্ত:

  1. Store: স্টোরে অ্যাপ্লিকেশনের পুরো স্টেট থাকে।
  2. Actions: অ্যাপ্লিকেশনের ডেটা পরিবর্তনের জন্য actions ব্যবহার করা হয়।
  3. Reducers: reducers একটি ফাংশন যা স্টেট পরিবর্তন করতে সাহায্য করে, যেগুলি actions দ্বারা চালিত হয়।

Redux এর মাধ্যমে complex state ম্যানেজমেন্টের সুবিধা এবং কার্যপ্রণালী নিম্নে আলোচনা করা হয়েছে:


১. State Management Centralization

Redux অ্যাপ্লিকেশনের সমস্ত স্টেট একটি কেন্দ্রীয় স্টোরে রাখে। এতে অ্যাপ্লিকেশনের যে কোনও অংশ থেকে স্টেট অ্যাক্সেস করা সহজ হয় এবং কমপ্লেক্স ডেটা ম্যানিপুলেশন সহজ হয়। স্টোরে সমস্ত ডেটা এক জায়গায় থাকবে, যাতে অ্যাপ্লিকেশনের যেকোনো অংশ থেকে সেই ডেটা অ্যাক্সেস এবং পরিবর্তন করা যায়।

উদাহরণ:

// Redux store
const store = createStore(reducer);

২. Actions

Actions হল JavaScript অবজেক্ট যা অ্যাপ্লিকেশনের স্টেটে পরিবর্তন আনার জন্য ট্রিগার করা হয়। এই actions গুলি ডিসপ্যাচ করা হয় এবং reducers এই actions এর মাধ্যমে স্টেটে পরিবর্তন ঘটায়।

উদাহরণ:

// Action
const ADD_TODO = 'ADD_TODO';
const addTodo = (todo) => {
  return {
    type: ADD_TODO,
    payload: todo
  };
};

৩. Reducers

Reducers হল পিউর ফাংশন, যেগুলি স্টেট এবং action প্যারামিটার নেয় এবং একটি নতুন স্টেট প্রদান করে। Reducers স্টেট পরিবর্তন করে না, তারা নতুন স্টেট ফেরত দেয়।

উদাহরণ:

// Reducer
const initialState = {
  todos: []
};

const todoReducer = (state = initialState, action) => {
  switch (action.type) {
    case ADD_TODO:
      return {
        ...state,
        todos: [...state.todos, action.payload]
      };
    default:
      return state;
  }
};

৪. Dispatching Actions

Actions dispatch করতে Redux এ dispatch() মেথড ব্যবহার করা হয়। এটি অ্যাকশনকে ট্রিগার করে এবং Reducer এর মাধ্যমে স্টেট পরিবর্তন করে।

উদাহরণ:

// Dispatch Action
store.dispatch(addTodo({ text: 'Learn Redux', completed: false }));

৫. Select and Connect State

Redux অ্যাপ্লিকেশনের যেকোনো অংশে স্টেট অ্যাক্সেস করা সহজ করে দেয়। React এর ক্ষেত্রে, connect() হাইঅর্ডার কম্পোনেন্ট (HOC) ব্যবহার করে Redux স্টেট রিড করতে পারেন। এছাড়া, React Redux লাইব্রেরির useSelector এবং useDispatch হুক ব্যবহার করে স্টেট অ্যাক্সেস এবং actions dispatch করা যায়।

উদাহরণ (React):

// Using useSelector to read state
import { useSelector } from 'react-redux';

const TodoList = () => {
  const todos = useSelector(state => state.todos);
  return (
    <ul>
      {todos.map(todo => (
        <li key={todo.text}>{todo.text}</li>
      ))}
    </ul>
  );
};

৬. Complex State Management with Redux

Redux দিয়ে Complex State ম্যানেজমেন্টের মূল সুবিধা হল এটি স্টেটকে বিচ্ছিন্ন রাখার মাধ্যমে আরও সহজে ডেটা ম্যানিপুলেট করতে সহায়ক। আপনি nested states বা complex states Redux এর মাধ্যমে ভালোভাবে ম্যানেজ করতে পারেন। উদাহরণস্বরূপ, আপনি অ্যাপ্লিকেশনের বিভিন্ন অংশে ভিন্ন ভিন্ন স্টেট রাখতে পারেন এবং Redux এর মাধ্যমে এইগুলোকে একত্রিত করতে পারেন।

উদাহরণ (Complex State Example):

// Complex State Example
const initialState = {
  user: {
    name: '',
    email: ''
  },
  todos: [],
  settings: {
    theme: 'light',
    notifications: true
  }
};

// Reducer
const rootReducer = (state = initialState, action) => {
  switch (action.type) {
    case 'SET_USER':
      return { ...state, user: { ...state.user, ...action.payload } };
    case 'ADD_TODO':
      return { ...state, todos: [...state.todos, action.payload] };
    case 'UPDATE_SETTINGS':
      return { ...state, settings: { ...state.settings, ...action.payload } };
    default:
      return state;
  }
};

৭. Middleware Support

Redux স্টেট ম্যানেজমেন্ট প্রক্রিয়াকে আরও শক্তিশালী এবং কার্যকরী করতে middleware সাপোর্ট দেয়। Redux Middleware যেমন redux-thunk, redux-saga বা redux-logger অ্যাসিনক্রোনাস অ্যাকশন, লগিং এবং অন্যান্য কাস্টম ফিচারগুলির জন্য ব্যবহৃত হয়।

উদাহরণ (redux-thunk):

// redux-thunk for async actions
const fetchTodos = () => {
  return dispatch => {
    fetch('/todos')
      .then(response => response.json())
      .then(data => dispatch({ type: 'FETCH_TODOS_SUCCESS', payload: data }));
  };
};

সুবিধাসমূহ

  1. Predictable State: Redux এ স্টেট পরিবর্তন প্রেডিক্টেবল থাকে, কারণ স্টেট শুধু এক জায়গায় থাকে এবং actions এবং reducers দ্বারা নিয়ন্ত্রিত হয়।
  2. Centralized State: সমস্ত স্টেট একটি কেন্দ্রীয় স্টোরে থাকে, যা অ্যাপ্লিকেশনের যেকোনো অংশ থেকে অ্যাক্সেস করা যায়।
  3. Debugging Tools: Redux DevTools ব্যবহার করে অ্যাপ্লিকেশনের স্টেট পরিবর্তন এবং actions ট্র্যাক করা সহজ হয়।
  4. Maintainability: অ্যাপ্লিকেশন বড় হলে Redux এর মাধ্যমে স্টেট ম্যানেজমেন্ট সহজ হয় এবং কোড মেইনটেন করা সহজ হয়।
  5. Scalability: Redux অ্যাপ্লিকেশন বড় হওয়ার সাথে সাথে আরও স্কেলেবল হয়ে ওঠে, কারণ এটি স্টেট ম্যানেজমেন্টের জন্য একটি কাঠামো তৈরি করে।

সারাংশ

Redux একটি শক্তিশালী টুল যা জটিল স্টেট ম্যানেজমেন্ট সহজ করে তোলে। এটি অ্যাপ্লিকেশনের সমস্ত স্টেট একটি কেন্দ্রীয় স্থানে রাখে, যার মাধ্যমে একাধিক কম্পোনেন্টে ডেটা শেয়ার করা সহজ হয়। Actions এবং Reducers এর মাধ্যমে স্টেট পরিবর্তন করা হয় এবং এই স্টেট ম্যানেজমেন্ট পদ্ধতি বৃহৎ এবং স্কেলযোগ্য অ্যাপ্লিকেশনের জন্য অত্যন্ত উপযোগী।

Content added By

Redux Thunk এবং Redux Saga দিয়ে Async Actions হ্যান্ডেল করা

236

Redux তে Async Actions হ্যান্ডেল করার জন্য দুটি জনপ্রিয় মেথড হলো Redux Thunk এবং Redux Saga। দুটি মেথডই একে অপর থেকে ভিন্ন, তবে উভয়ই অ্যাসিঙ্ক্রোনাস অপারেশন (যেমন API কল বা ডেটা ফেচিং) পরিচালনা করার জন্য ব্যবহৃত হয়।

1. Redux Thunk

Redux Thunk হল একটি middleware যা Redux স্টোরের ডিসপ্যাচের জন্য ফাংশন বা সাধারণ অ্যাকশন অবজেক্ট সমর্থন করে। এটি অ্যাসিঙ্ক্রোনাস ফাংশনগুলিকে ডিসপ্যাচ করতে সাহায্য করে। Redux Thunk ব্যবহার করে আপনি asynchronous operations (যেমন API কল) সহজভাবে হ্যান্ডেল করতে পারেন।

Redux Thunk দিয়ে Async Actions হ্যান্ডেল করার পদ্ধতি:

  1. Redux Thunk ইন্সটলেশন
    প্রথমে আপনাকে redux-thunk ইন্সটল করতে হবে:

    npm install redux-thunk
  2. Redux Thunk Middleware যুক্ত করা
    Redux store কনফিগারেশনে thunk middleware যোগ করুন:

    import { createStore, applyMiddleware } from 'redux';
    import thunk from 'redux-thunk';
    import rootReducer from './reducers';
    
    const store = createStore(rootReducer, applyMiddleware(thunk));
  3. Async Action Creator তৈরি করা
    Redux Thunk ব্যবহার করে আপনি অ্যাকশন ক্রিয়েটরকে ফাংশন হিসেবে ব্যবহার করবেন। এখানে একটি উদাহরণ দেওয়া হলো:

    // actions.js
    export const fetchData = () => {
      return async (dispatch) => {
        try {
          dispatch({ type: 'FETCH_DATA_REQUEST' });
    
          const response = await fetch('https://api.example.com/data');
          const data = await response.json();
    
          dispatch({ type: 'FETCH_DATA_SUCCESS', payload: data });
        } catch (error) {
          dispatch({ type: 'FETCH_DATA_FAILURE', error: error.message });
        }
      };
    };
  4. Reducer তৈরি করা
    Reducer-এ অ্যাকশন অনুযায়ী স্টেট পরিবর্তন করুন:

    // reducer.js
    const initialState = {
      loading: false,
      data: [],
      error: '',
    };
    
    const dataReducer = (state = initialState, action) => {
      switch (action.type) {
        case 'FETCH_DATA_REQUEST':
          return { ...state, loading: true };
        case 'FETCH_DATA_SUCCESS':
          return { ...state, loading: false, data: action.payload };
        case 'FETCH_DATA_FAILURE':
          return { ...state, loading: false, error: action.error };
        default:
          return state;
      }
    };
    
    export default dataReducer;
  5. Component এ Async Action ডাকা
    React কম্পোনেন্টে, Redux Thunk এর মাধ্যমে অ্যাসিঙ্ক্রোনাস অ্যাকশন চালাতে হবে:

    import React, { useEffect } from 'react';
    import { useDispatch, useSelector } from 'react-redux';
    import { fetchData } from './actions';
    
    const DataComponent = () => {
      const dispatch = useDispatch();
      const { data, loading, error } = useSelector((state) => state.data);
    
      useEffect(() => {
        dispatch(fetchData());
      }, [dispatch]);
    
      if (loading) return <div>Loading...</div>;
      if (error) return <div>Error: {error}</div>;
    
      return (
        <div>
          <h1>Data</h1>
          <ul>
            {data.map((item) => (
              <li key={item.id}>{item.name}</li>
            ))}
          </ul>
        </div>
      );
    };
    
    export default DataComponent;

2. Redux Saga

Redux Saga হল আরেকটি middleware যা অ্যাসিঙ্ক্রোনাস কার্যক্রম হ্যান্ডেল করার জন্য ব্যবহৃত হয়। এটি generator ফাংশন ব্যবহার করে ডেটা ফেচিং এবং অন্যান্য অ্যাসিঙ্ক্রোনাস কার্যক্রম পরিচালনা করে। Redux Saga দিয়ে আপনি কোডকে সিঙ্ক্রোনাসভাবে লিখতে পারেন, তবে প্রকৃতপক্ষে এটি অ্যাসিঙ্ক্রোনাস অপারেশন পরিচালনা করে।

Redux Saga দিয়ে Async Actions হ্যান্ডেল করার পদ্ধতি:

  1. Redux Saga ইন্সটলেশন
    প্রথমে redux-saga ইন্সটল করুন:

    npm install redux-saga
  2. Redux Saga Middleware যুক্ত করা
    Redux store কনফিগারেশনে saga middleware যোগ করুন:

    import { createStore, applyMiddleware } from 'redux';
    import createSagaMiddleware from 'redux-saga';
    import rootReducer from './reducers';
    import rootSaga from './sagas';
    
    const sagaMiddleware = createSagaMiddleware();
    
    const store = createStore(rootReducer, applyMiddleware(sagaMiddleware));
    
    sagaMiddleware.run(rootSaga);
  3. Saga তৈরি করা
    Redux Saga দিয়ে সাগা তৈরি করতে হবে। এখানে একটি উদাহরণ:

    // sagas.js
    import { call, put, takeEvery } from 'redux-saga/effects';
    
    function* fetchDataSaga() {
      try {
        const response = yield call(fetch, 'https://api.example.com/data');
        const data = yield response.json();
        yield put({ type: 'FETCH_DATA_SUCCESS', payload: data });
      } catch (error) {
        yield put({ type: 'FETCH_DATA_FAILURE', error: error.message });
      }
    }
    
    function* rootSaga() {
      yield takeEvery('FETCH_DATA_REQUEST', fetchDataSaga);
    }
    
    export default rootSaga;
  4. Reducer তৈরি করা
    Reducer-এ অ্যাকশন অনুযায়ী স্টেট পরিবর্তন করুন (Redux Thunk এর মতো):

    // reducer.js
    const initialState = {
      loading: false,
      data: [],
      error: '',
    };
    
    const dataReducer = (state = initialState, action) => {
      switch (action.type) {
        case 'FETCH_DATA_REQUEST':
          return { ...state, loading: true };
        case 'FETCH_DATA_SUCCESS':
          return { ...state, loading: false, data: action.payload };
        case 'FETCH_DATA_FAILURE':
          return { ...state, loading: false, error: action.error };
        default:
          return state;
      }
    };
    
    export default dataReducer;
  5. Component এ Async Action ডাকা
    React কম্পোনেন্টে, Redux Saga এর মাধ্যমে অ্যাসিঙ্ক্রোনাস অ্যাকশন চালাতে হবে:

    import React, { useEffect } from 'react';
    import { useDispatch, useSelector } from 'react-redux';
    
    const DataComponent = () => {
      const dispatch = useDispatch();
      const { data, loading, error } = useSelector((state) => state.data);
    
      useEffect(() => {
        dispatch({ type: 'FETCH_DATA_REQUEST' });
      }, [dispatch]);
    
      if (loading) return <div>Loading...</div>;
      if (error) return <div>Error: {error}</div>;
    
      return (
        <div>
          <h1>Data</h1>
          <ul>
            {data.map((item) => (
              <li key={item.id}>{item.name}</li>
            ))}
          </ul>
        </div>
      );
    };
    
    export default DataComponent;

Redux Thunk vs Redux Saga

  • Redux Thunk:
    • সরল এবং সহজ ব্যবহারের জন্য উপযোগী।
    • অ্যাসিঙ্ক্রোনাস অ্যাকশন ব্যবস্থাপনা জন্য কমপ্লেক্সিটি কম।
    • তবে কোডে লজিকাল বিভ্রাট হতে পারে।
  • Redux Saga:
    • কমপ্লেক্স অ্যাসিঙ্ক্রোনাস কাজের জন্য উপযুক্ত।
    • Generator functions ব্যবহার করে অ্যাসিঙ্ক্রোনাস কাজকে সিঙ্ক্রোনাসভাবে পরিচালনা করা যায়।
    • অ্যাসিঙ্ক্রোনাস কাজের জন্য আরও শক্তিশালী এবং ফ্লেক্সিবল।

সারাংশ

  • Redux Thunk ব্যবহার করলে আপনি সরাসরি অ্যাসিঙ্ক্রোনাস ফাংশনকে dispatch করতে পারেন এবং এতে কমপ্লেক্সিটি কম থাকে।
  • Redux Saga ব্যবহার করলে আপনি অ্যাসিঙ্ক্রোনাস লজিককে আরও সিস্টেমেটিকভাবে এবং স্কেলেবলভাবে পরিচালনা করতে পারেন, বিশেষত যখন কাজটি জটিল হয় এবং একাধিক অ্যাসিঙ্ক্রোনাস অ্যাকশন পরিচালনা করতে হয়।

আপনার প্রোজেক্টের চাহিদা অনুযায়ী আপনি Redux Thunk বা Redux Saga নির্বাচন করতে পারেন।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...