தமிழ்

உங்கள் பயன்பாடுகளில் நிலையை திறம்பட நிர்வகிக்க, செயல்திறனை மேம்படுத்த, மற்றும் தேவையற்ற மறு-ரெண்டர்களைத் தடுக்க மேம்பட்ட ரியாக்ட் கான்டெக்ஸ்ட் புரொவைடர் பேட்டர்ன்களை ஆராயுங்கள்.

ரியாக்ட் கான்டெக்ஸ்ட் புரொவைடர் பேட்டர்ன்கள்: செயல்திறனை மேம்படுத்துதல் மற்றும் மறு-ரெண்டர் சிக்கல்களைத் தவிர்த்தல்

ரியாக்ட் கான்டெக்ஸ்ட் ஏபிஐ (React Context API) உங்கள் பயன்பாடுகளில் குளோபல் ஸ்டேட்டை (global state) நிர்வகிக்க ஒரு சக்திவாய்ந்த கருவியாகும். இது ஒவ்வொரு மட்டத்திலும் ப்ராப்ஸ்களை (props) கைமுறையாக அனுப்பாமல், கூறுகளுக்கு (components) இடையில் தரவைப் பகிர அனுமதிக்கிறது. இருப்பினும், கான்டெக்ஸ்டை தவறாகப் பயன்படுத்துவது செயல்திறன் சிக்கல்களுக்கு, குறிப்பாக தேவையற்ற மறு-ரெண்டர்களுக்கு (re-renders) வழிவகுக்கும். இந்தக் கட்டுரை செயல்திறனை மேம்படுத்தவும் இந்தச் சிக்கல்களைத் தவிர்க்கவும் உதவும் பல்வேறு கான்டெக்ஸ்ட் புரொவைடர் பேட்டர்ன்களை ஆராய்கிறது.

பிரச்சனையைப் புரிந்துகொள்ளுதல்: தேவையற்ற மறு-ரெண்டர்கள்

இயல்பாக, ஒரு கான்டெக்ஸ்ட் மதிப்பு மாறும் போது, அந்த கான்டெக்ஸ்டைப் பயன்படுத்தும் அனைத்து கூறுகளும் மறு-ரெண்டர் ஆகும், அவை மாறிய கான்டெக்ஸ்டின் குறிப்பிட்ட பகுதியைச் சார்ந்து இல்லாவிட்டாலும் கூட. இது பெரிய மற்றும் சிக்கலான பயன்பாடுகளில் குறிப்பிடத்தக்க செயல்திறன் தடையாக இருக்கலாம். பயனர் தகவல், தீம் அமைப்புகள் மற்றும் பயன்பாட்டு விருப்பத்தேர்வுகள் அடங்கிய ஒரு கான்டெக்ஸ்டைக் கவனியுங்கள். தீம் அமைப்பு மட்டும் மாறினால், கருப்பொருளுடன் தொடர்புடைய கூறுகள் மட்டுமே மறு-ரெண்டர் ஆக வேண்டும், முழு பயன்பாடும் அல்ல.

விளக்க, பல நாடுகளில் அணுகக்கூடிய ஒரு உலகளாவிய இ-காமர்ஸ் பயன்பாட்டைக் கற்பனை செய்து பாருங்கள். நாணய விருப்பத்தேர்வு மாறினால் (கான்டெக்ஸ்டுக்குள் கையாளப்படுகிறது), முழு தயாரிப்புப் பட்டியலும் மறு-ரெண்டர் செய்யப்படுவதை நீங்கள் விரும்ப மாட்டீர்கள் - விலை காட்சிகள் மட்டுமே புதுப்பிக்கப்பட வேண்டும்.

பேட்டர்ன் 1: useMemo உடன் மதிப்பு மெமோசேஷன் (Value Memoization)

தேவையற்ற மறு-ரெண்டர்களைத் தடுப்பதற்கான எளிமையான அணுகுமுறை, useMemo ஐப் பயன்படுத்தி கான்டெக்ஸ்ட் மதிப்பை மெமோசைஸ் (memoize) செய்வதாகும். இது கான்டெக்ஸ்ட் மதிப்பு அதன் சார்புகள் (dependencies) மாறும்போது மட்டுமே மாறுவதை உறுதி செய்கிறது.

உதாரணம்:

எங்களிடம் பயனர் தரவு மற்றும் பயனரின் சுயவிவரத்தைப் புதுப்பிக்கும் ஒரு செயல்பாட்டை வழங்கும் `UserContext` இருப்பதாகக் கொள்வோம்.


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

const UserContext = createContext(null);

function UserProvider({ children }) {
  const [user, setUser] = useState({
    name: 'John Doe',
    email: 'john.doe@example.com',
    location: 'New York, USA'
  });

  const updateUser = (newUserData) => {
    setUser(prevState => ({ ...prevState, ...newUserData }));
  };

  const contextValue = useMemo(() => ({
    user,
    updateUser,
  }), [user, setUser]);

  return (
    
      {children}
    
  );
}

export { UserContext, UserProvider };

இந்த எடுத்துக்காட்டில், `useMemo` ஆனது `user` ஸ்டேட் அல்லது `setUser` செயல்பாடு மாறும்போது மட்டுமே `contextValue` மாறுவதை உறுதி செய்கிறது. இரண்டும் மாறவில்லை என்றால், `UserContext`-ஐப் பயன்படுத்தும் கூறுகள் மறு-ரெண்டர் ஆகாது.

நன்மைகள்:

குறைபாடுகள்:

பேட்டர்ன் 2: பல கான்டெக்ஸ்டுகளுடன் கவலைகளைப் பிரித்தல்

ஒரு நுணுக்கமான அணுகுமுறை என்னவென்றால், உங்கள் கான்டெக்ஸ்டை பல, சிறிய கான்டெக்ஸ்டுகளாகப் பிரிப்பது, ஒவ்வொன்றும் ஒரு குறிப்பிட்ட ஸ்டேட்டிற்கு பொறுப்பாகும். இது மறு-ரெண்டர்களின் வரம்பைக் குறைக்கிறது மற்றும் கூறுகள் தங்களுக்குத் தேவையான குறிப்பிட்ட தரவு மாறும்போது மட்டுமே மறு-ரெண்டர் செய்வதை உறுதி செய்கிறது.

உதாரணம்:

ஒரே `UserContext`-க்குப் பதிலாக, பயனர் தரவு மற்றும் பயனர் விருப்பத்தேர்வுகளுக்கு தனித்தனி கான்டெக்ஸ்டுகளை உருவாக்கலாம்.


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

const UserDataContext = createContext(null);
const UserPreferencesContext = createContext(null);

function UserDataProvider({ children }) {
  const [user, setUser] = useState({
    name: 'John Doe',
    email: 'john.doe@example.com',
    location: 'New York, USA'
  });

  const updateUser = (newUserData) => {
    setUser(prevState => ({ ...prevState, ...newUserData }));
  };

  return (
    
      {children}
    
  );
}

function UserPreferencesProvider({ children }) {
  const [theme, setTheme] = useState('light');
  const [language, setLanguage] = useState('en');

  const toggleTheme = () => {
    setTheme(prevTheme => (prevTheme === 'light' ? 'dark' : 'light'));
  };

  return (
    
      {children}
    
  );
}

export { UserDataContext, UserDataProvider, UserPreferencesContext, UserPreferencesProvider };

இப்போது, பயனர் தரவு மட்டுமே தேவைப்படும் கூறுகள் `UserDataContext`-ஐப் பயன்படுத்தலாம், மற்றும் தீம் அமைப்புகள் மட்டுமே தேவைப்படும் கூறுகள் `UserPreferencesContext`-ஐப் பயன்படுத்தலாம். தீமில் ஏற்படும் மாற்றங்கள் இனி `UserDataContext`-ஐப் பயன்படுத்தும் கூறுகளை மறு-ரெண்டர் செய்யாது, நேர்மாறாகவும்.

நன்மைகள்:

குறைபாடுகள்:

பேட்டர்ன் 3: கஸ்டம் ஹூக்ஸுடன் செலக்டர் செயல்பாடுகள்

இந்த பேட்டர்ன் கான்டெக்ஸ்ட் மதிப்பின் குறிப்பிட்ட பகுதிகளைப் பிரித்தெடுக்கும் கஸ்டம் ஹூக்ஸை உருவாக்குவதை உள்ளடக்கியது மற்றும் அந்த குறிப்பிட்ட பகுதிகள் மாறும்போது மட்டுமே மறு-ரெண்டர் செய்யும். உங்களிடம் பல பண்புகளுடன் ஒரு பெரிய கான்டெக்ஸ்ட் மதிப்பு இருக்கும்போது, ஆனால் ஒரு கூறுக்கு அவற்றில் சில மட்டுமே தேவைப்படும்போது இது மிகவும் பயனுள்ளதாக இருக்கும்.

உதாரணம்:

அசல் `UserContext`-ஐப் பயன்படுத்தி, குறிப்பிட்ட பயனர் பண்புகளைத் தேர்ந்தெடுக்க கஸ்டம் ஹூக்ஸை உருவாக்கலாம்.


import React, { useContext } from 'react';
import { UserContext } from './UserContext'; // Assuming UserContext is in UserContext.js

function useUserName() {
  const { user } = useContext(UserContext);
  return user.name;
}

function useUserEmail() {
  const { user } = useContext(UserContext);
  return user.email;
}

export { useUserName, useUserEmail };

இப்போது, ஒரு கூறு பயனரின் பெயர் மாறும்போது மட்டுமே மறு-ரெண்டர் செய்ய `useUserName`-ஐப் பயன்படுத்தலாம், மற்றும் பயனரின் மின்னஞ்சல் மாறும்போது மட்டுமே மறு-ரெண்டர் செய்ய `useUserEmail`-ஐப் பயன்படுத்தலாம். மற்ற பயனர் பண்புகளில் (எ.கா., இருப்பிடம்) ஏற்படும் மாற்றங்கள் மறு-ரெண்டர்களைத் தூண்டாது.


import React from 'react';
import { useUserName, useUserEmail } from './UserHooks';

function UserProfile() {
  const name = useUserName();
  const email = useUserEmail();

  return (
    

Name: {name}

Email: {email}

); }

நன்மைகள்:

குறைபாடுகள்:

பேட்டர்ன் 4: React.memo உடன் கூறு மெமோசேஷன்

React.memo என்பது ஒரு உயர்-வரிசை கூறு (HOC) ஆகும், இது ஒரு செயல்பாட்டுக் கூறுகளை மெமோசைஸ் செய்கிறது. இது அதன் ப்ராப்ஸ் மாறவில்லை என்றால் கூறு மீண்டும் ரெண்டர் செய்வதைத் தடுக்கிறது. செயல்திறனை மேலும் மேம்படுத்த இதை கான்டெக்ஸ்டுடன் இணைக்கலாம்.

உதாரணம்:

பயனரின் பெயரைக் காட்டும் ஒரு கூறு எங்களிடம் இருப்பதாகக் கொள்வோம்.


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

function UserName() {
  const { user } = useContext(UserContext);
  return 

Name: {user.name}

; } export default React.memo(UserName);

`UserName`-ஐ `React.memo` உடன் மூடுவதன் மூலம், `user` ப்ராப் (கான்டெக்ஸ்ட் வழியாக மறைமுகமாக அனுப்பப்பட்டது) மாறினால் மட்டுமே அது மறு-ரெண்டர் ஆகும். இருப்பினும், இந்த எளிமையான எடுத்துக்காட்டில், `React.memo` மட்டும் மறு-ரெண்டர்களைத் தடுக்காது, ஏனெனில் முழு `user` ஆப்ஜெக்ட்டும் இன்னும் ஒரு ப்ராப்பாக அனுப்பப்படுகிறது. அதை உண்மையிலேயே திறம்படச் செய்ய, நீங்கள் அதை செலக்டர் செயல்பாடுகள் அல்லது தனித்தனி கான்டெக்ஸ்டுகளுடன் இணைக்க வேண்டும்.

ஒரு திறமையான உதாரணம் `React.memo`-ஐ செலக்டர் செயல்பாடுகளுடன் இணைக்கிறது:


import React from 'react';
import { useUserName } from './UserHooks';

function UserName() {
  const name = useUserName();
  return 

Name: {name}

; } function areEqual(prevProps, nextProps) { // Custom comparison function return prevProps.name === nextProps.name; } export default React.memo(UserName, areEqual);

இங்கே, `areEqual` என்பது ஒரு தனிப்பயன் ஒப்பீட்டுச் செயல்பாடாகும், இது `name` ப்ராப் மாறிவிட்டதா என்பதைச் சரிபார்க்கிறது. அது மாறவில்லை என்றால், கூறு மறு-ரெண்டர் ஆகாது.

நன்மைகள்:

குறைபாடுகள்:

பேட்டர்ன் 5: கான்டெக்ஸ்ட் மற்றும் ரெடியூசர்களை இணைத்தல் (useReducer)

கான்டெக்ஸ்டை useReducer உடன் இணைப்பது சிக்கலான ஸ்டேட் தர்க்கத்தை நிர்வகிக்கவும், மறு-ரெண்டர்களை மேம்படுத்தவும் உங்களை அனுமதிக்கிறது. useReducer ஒரு கணிக்கக்கூடிய ஸ்டேட் மேலாண்மை முறையை வழங்குகிறது மற்றும் செயல்களின் அடிப்படையில் ஸ்டேட்டைப் புதுப்பிக்க உங்களை அனுமதிக்கிறது, இதன் மூலம் கான்டெக்ஸ்ட் வழியாக பல செட்டர் செயல்பாடுகளை அனுப்பும் தேவையைக் குறைக்கிறது.

உதாரணம்:


import React, { createContext, useReducer, useContext } from 'react';

const UserContext = createContext(null);

const initialState = {
  user: {
    name: 'John Doe',
    email: 'john.doe@example.com',
    location: 'New York, USA'
  },
  theme: 'light',
  language: 'en'
};

const reducer = (state, action) => {
  switch (action.type) {
    case 'UPDATE_USER':
      return { ...state, user: { ...state.user, ...action.payload } };
    case 'TOGGLE_THEME':
      return { ...state, theme: state.theme === 'light' ? 'dark' : 'light' };
    case 'SET_LANGUAGE':
      return { ...state, language: action.payload };
    default:
      return state;
  }
};

function UserProvider({ children }) {
  const [state, dispatch] = useReducer(reducer, initialState);

  return (
    
      {children}
    
  );
}

function useUserState() {
  const { state } = useContext(UserContext);
  return state.user;
}

function useUserDispatch() {
    const { dispatch } = useContext(UserContext);
    return dispatch;
}


export { UserContext, UserProvider, useUserState, useUserDispatch };

இப்போது, கூறுகள் கஸ்டம் ஹூக்ஸைப் பயன்படுத்தி ஸ்டேட்டை அணுகலாம் மற்றும் செயல்களை அனுப்பலாம். உதாரணமாக:


import React from 'react';
import { useUserState, useUserDispatch } from './UserContext';

function UserProfile() {
  const user = useUserState();
  const dispatch = useUserDispatch();

  const handleUpdateName = (e) => {
    dispatch({ type: 'UPDATE_USER', payload: { name: e.target.value } });
  };

  return (
    

Name: {user.name}

); }

இந்த பேட்டர்ன் ஸ்டேட் மேலாண்மைக்கு ஒரு கட்டமைக்கப்பட்ட அணுகுமுறையை ஊக்குவிக்கிறது மற்றும் சிக்கலான கான்டெக்ஸ்ட் தர்க்கத்தை எளிதாக்க முடியும்.

நன்மைகள்:

குறைபாடுகள்:

பேட்டர்ன் 6: ஆப்டிமிஸ்டிக் புதுப்பிப்புகள் (Optimistic Updates)

ஆப்டிமிஸ்டிக் புதுப்பிப்புகள் என்பது ஒரு செயல் வெற்றி பெற்றதாகக் கருதி, சர்வர் அதை உறுதி செய்வதற்கு முன்பே, UI-ஐ உடனடியாகப் புதுப்பிப்பதை உள்ளடக்கியது. இது பயனர் அனுபவத்தை கணிசமாக மேம்படுத்த முடியும், குறிப்பாக அதிக தாமதம் உள்ள சூழ்நிலைகளில். இருப்பினும், சாத்தியமான பிழைகளை கவனமாகக் கையாள வேண்டும்.

உதாரணம்:

பயனர்கள் இடுகைகளை விரும்பக்கூடிய ஒரு பயன்பாட்டைக் கற்பனை செய்து பாருங்கள். பயனர் லைக் பட்டனைக் கிளிக் செய்யும் போது ஒரு ஆப்டிமிஸ்டிக் புதுப்பிப்பு உடனடியாக லைக் எண்ணிக்கையை அதிகரிக்கும், பின்னர் சர்வர் கோரிக்கை தோல்வியுற்றால் மாற்றத்தைத் திரும்பப் பெறும்.


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

function LikeButton({ postId }) {
  const { dispatch } = useContext(UserContext);
  const [isLiking, setIsLiking] = useState(false);

  const handleLike = async () => {
    setIsLiking(true);
    // Optimistically update the like count
    dispatch({ type: 'INCREMENT_LIKES', payload: { postId } });

    try {
      // Simulate an API call
      await new Promise(resolve => setTimeout(resolve, 500));

      // If the API call is successful, do nothing (the UI is already updated)
    } catch (error) {
      // If the API call fails, revert the optimistic update
      dispatch({ type: 'DECREMENT_LIKES', payload: { postId } });
      alert('Failed to like post. Please try again.');
    } finally {
      setIsLiking(false);
    }
  };

  return (
    
  );
}

இந்த எடுத்துக்காட்டில், `INCREMENT_LIKES` செயல் உடனடியாக அனுப்பப்படுகிறது, பின்னர் API அழைப்பு தோல்வியுற்றால் திரும்பப் பெறப்படுகிறது. இது ஒரு பதிலளிக்கக்கூடிய பயனர் அனுபவத்தை வழங்குகிறது.

நன்மைகள்:

குறைபாடுகள்:

சரியான பேட்டர்னைத் தேர்ந்தெடுப்பது

சிறந்த கான்டெக்ஸ்ட் புரொவைடர் பேட்டர்ன் உங்கள் பயன்பாட்டின் குறிப்பிட்ட தேவைகளைப் பொறுத்தது. தேர்வு செய்ய உதவும் ஒரு சுருக்கம் இங்கே:

கான்டெக்ஸ்ட் செயல்திறனை மேம்படுத்துவதற்கான கூடுதல் குறிப்புகள்

முடிவுரை

ரியாக்ட் கான்டெக்ஸ்ட் ஏபிஐ ஒரு சக்திவாய்ந்த கருவி, ஆனால் செயல்திறன் சிக்கல்களைத் தவிர்க்க அதைச் சரியாகப் பயன்படுத்துவது அவசியம். இந்தக் கட்டுரையில் விவாதிக்கப்பட்ட கான்டெக்ஸ்ட் புரொவைடர் பேட்டர்ன்களைப் புரிந்துகொண்டு பயன்படுத்துவதன் மூலம், நீங்கள் நிலையை திறம்பட நிர்வகிக்கலாம், செயல்திறனை மேம்படுத்தலாம் மற்றும் மேலும் திறமையான மற்றும் பதிலளிக்கக்கூடிய ரியாக்ட் பயன்பாடுகளை உருவாக்கலாம். உங்கள் குறிப்பிட்ட தேவைகளை பகுப்பாய்வு செய்து, உங்கள் பயன்பாட்டின் தேவைகளுக்கு மிகவும் பொருத்தமான பேட்டர்னைத் தேர்ந்தெடுக்க நினைவில் கொள்ளுங்கள்.

ஒரு உலகளாவிய கண்ணோட்டத்தைக் கருத்தில் கொள்வதன் மூலம், டெவலப்பர்கள் ஸ்டேட் மேலாண்மை தீர்வுகள் வெவ்வேறு நேர மண்டலங்கள், நாணய வடிவங்கள் மற்றும் பிராந்திய தரவு தேவைகள் முழுவதும் தடையின்றி செயல்படுவதை உறுதி செய்ய வேண்டும். உதாரணமாக, ஒரு கான்டெக்ஸ்டுக்குள் இருக்கும் தேதி வடிவமைப்புச் செயல்பாடு பயனரின் விருப்பம் அல்லது இருப்பிடத்தின் அடிப்படையில் உள்ளூர்மயமாக்கப்பட வேண்டும், பயனர் எங்கிருந்து பயன்பாட்டை அணுகினாலும் நிலையான மற்றும் துல்லியமான தேதி காட்சிகளை உறுதி செய்கிறது.