İlk oluşturmadan sonra özel bir kanca nasıl yeniden oluşturulur

0

Soru

Adında özel bir kancam var useIsUserSubscribed bu, belirli bir kullanıcının abone olup olmadığını kontrol eder. Kullanıcı abone olduysa true, kullanıcı abone olmadıysa false değerini döndürür...

import { useState, useEffect } from "react";
import { useSelector } from "react-redux";
import { checkSubscription } from "../services";

// this hook checks if the current user is subscribed to a particular user(publisherId)
function useIsUserSubscribed(publisherId) {
  const [userIsSubscribed, setUserIsSubscribed] = useState(null);
  const currentUserId = useSelector((state) => state.auth.user?.id);

  useEffect(() => {
    if (!currentUserId || !publisherId) return;

    async function fetchCheckSubscriptionData() {
      try {
        const res = await checkSubscription(publisherId);
        setUserIsSubscribed(true);
      } catch (err) {
        setUserIsSubscribed(false);
      }
    }

    fetchCheckSubscriptionData();
  }, [publisherId, currentUserId]);

  return userIsSubscribed;
}

export default useIsUserSubscribed;

...Bu kancayı kullanarak, döndürülen boolean değerine göre koşullu olarak metin oluşturan bir düğmem var useIsUserSubscribed...

import React, { useEffect, useState } from "react";
import { add, remove } from "../../services";
import useIsUserSubscribed from "../../hooks/useIsUserSubscribed";

const SubscribeUnsubscribeBtn = ({profilePageUserId}) => {

  const userIsSubscribed = useIsUserSubscribed(profilePageUserId);
  
  const onClick = async () => {
    if (userIsSubscribed) {
       // this is an API Call to the backend
      await removeSubscription(profilePageUserId);

    } else {
      // this is an API Call to the backend
      await addSubscription(profilePageUserId);
    }
    // HOW CAN I RERENDER THE HOOK HERE!!!!?
  }

  return (
    <button type="button" className="sub-edit-unsub-btn bsc-button" onClick={onClick}>
          {userIsSubscribed ? 'Subscribed' : 'Unsubscribed'}
    </button>
  );
} 

Sonra onClick Ben benim rerender istiyorum useIsUserSubscribed düğme metnimin geçiş yapmasını sağlayın. Bu yapılabilir mi?

3

En iyi cevabı

2

bu amaçla kancanızdaki useeffect'i kullanamazsınız bunu deneyin :

kanca :

function useIsUserSubscribed() {
  const currentUserId = useSelector((state) => state.auth.user?.id);


  const checkUser = useCallback(async (publisherId, setUserIsSubscribed) => {
    if (!currentUserId || !publisherId) return;
      try {
        const res = await checkSubscription(publisherId);
        setUserIsSubscribed(true);
      } catch (err) {
        setUserIsSubscribed(false);
      }
    
  }, [currentUserId]);

  return {checkUser};
}

export default useIsUserSubscribed;

bileşen :

const SubscribeUnsubscribeBtn = ({profilePageUserId}) => {
    const [userIsSubscribed,setUserIsSubscribed]=useState(false);
    const { checkUser } = useIsUserSubscribed();

     useEffect(()=>{
        checkUser(profilePageUserId,setUserIsSubscribed)
     },[checkUser,profilePageUserId]);
  
  const onClick = async () => {
    if (userIsSubscribed) {
       // this is an API Call to the backend
      await removeSubscription(profilePageUserId);

    } else {
      // this is an API Call to the backend
      await addSubscription(profilePageUserId);
    }
    // HOW CAN I RERENDER THE HOOK HERE!!!!?
    checkUser(profilePageUserId,setUserIsSubscribed)
  }

  return (
    <button type="button" className="sub-edit-unsub-btn bsc-button" onClick={onClick}>
          {userIsSubscribed ? 'Subscribed' : 'Unsubscribed'}
    </button>
  );
} 

ayrıca, kancanıza bir miktar yükleme durumu ekleyebilir ve işlemin zaten yapılıp yapılmadığını kontrol edebilmeniz için bunları da döndürebilirsiniz

2021-11-24 03:03:13

Uygulama varsa bu mantığı diğer bölümlerde yeniden kullanmayı planlıyorum. Kanca en iyi yaklaşım değilse, bunu yeniden kullanılabilir hale getirmenin daha iyi bir yolu nedir?
Simone Anthony

@SimoneAnthony kancalarla ilgili yanlış bir şey yok ve bunu kullanabilirsiniz, ancak redux kullandığınızı da fark ettim, böylece redux-thunk eylemlerini de kullanabilirsiniz
Mohammad
2

Useısusersubscribed'ın useEffect bir dependece ekleyin.

kanca :

function useIsUserSubscribed(publisherId) {
    const [userIsSubscribed, setUserIsSubscribed] = useState(null);
    const currentUserId = useSelector((state) => state.auth.user?.id);
    // add refresh dependece
    const refresh = useSelector((state) => state.auth.refresh);

    useEffect(() => {
        ...
    }, [publisherId, currentUserId, refresh]);
    ...
}

bileşen :

const onClick = async () => {
    ...
    // HOW CAN I RERENDER THE HOOK HERE!!!!?
    // when click, you can dispatch a refresh flag.
    dispatch(refreshSubState([]))
}

forceUpdate yöntemini açığa çıkarın.

kanca :

function useIsUserSubscribed(publisherId) {
    const [update, setUpdate] = useState({});
    const forceUpdate = () => {
        setUpdate({});
    }  

    return {userIsSubscribed, forceUpdate};
}

bileşen :

const {userIsSubscribed, forceUpdate} = useIsUserSubscribed(profilePageUserId);

const onClick = async () => {
    ...
    forceUpdate();
}
2021-11-24 02:56:11
0

İşte @bitspook kullanıcısı tarafından başka bir çözüm

SubscribeUnsubscribeBtn bağımlılığa sahiptir useIsUserSubscribed, ama useIsUserSubscribed hiçbir şeye bağımlı olma SubscribeUnsubscribeBtn. Yerine, useIsUserSubscribed yerel bir devlet tutuyor. Burada birkaç seçeneğin var.:

  1. Redux'u kullandığınızdan, belki de Redux'ta olduğundan, kullanıcının abone olup olmadığına ilişkin durumu bir seviye yukarı taşıyın.
  2. İletişim için useIsUserSubscribed iç durumunu değiştirmen gerektiğini.

İçin 1)

  const [userIsSubscribed, setUserIsSubscribed] = useState(null);

bu durumu Redux store'a taşıyın ve useSelector ile kullanın.

İçin 2), bir dizi değeri döndürür ve yalnızca değer yerine kancadan geri çağırır. Bu, bileşenden kancaya geri iletişim kurmanıza izin verecektir.

İçinde useIsUserSubscribed,

  return [userIsSubscribed, setUserIsSubscribed];

Sonra içeri onClick, arayabilirsin setUserIsSubscribed(false), kancanın iç durumunu değiştirme ve bileşeninizi yeniden oluşturma.

2021-11-24 03:37:35

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................