Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

125
Views
Cómo volver a renderizar un gancho personalizado después del renderizado inicial

Tengo un enlace personalizado llamado useIsUserSubscribed que verifica si un usuario específico está suscrito. Devuelve verdadero si el usuario está suscrito y falso si el usuario no está suscrito...

 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;

... Tengo un botón que usa este gancho que representa el texto condicionalmente en función del valor booleano devuelto por 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> ); }

Después de hacer clic, me gustaría volver a representar mi useIsUserSubscribed onClick que el texto de mi botón cambie. Se puede hacer esto?

about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

no puede usar useEffect en su gancho para ese propósito, intente esto:

gancho :

 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;

componente :

 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> ); }

también puede agregar algún estado de carga en su enlace y devolverlos también para que pueda verificar si el proceso ya se completó o no

about 4 years ago · Juan Pablo Isaza Report

0

Agregue una dependencia en useEffect de useIsUserSubscribed.

gancho :

 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]); ... }

componente :

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

Exponga el método forceUpdate.

gancho :

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

componente :

 const {userIsSubscribed, forceUpdate} = useIsUserSubscribed(profilePageUserId); const onClick = async () => { ... forceUpdate(); }
about 4 years ago · Juan Pablo Isaza Report

0

Aquí hay otra solución del usuario @bitspook

SubscribeUnsubscribeBtn depende de useIsUserSubscribed , pero useIsUserSubscribed no depende de nada de SubscribeUnsubscribeBtn . En cambio, useIsUserSubscribed mantiene un estado local. Tienes un par de opciones aquí:

  1. Mueva el estado con respecto a si el usuario está suscrito o no un nivel más arriba, ya que está usando Redux, quizás en Redux.
  2. Comuníquese con useIsUserSubscribed que necesita cambiar su estado interno.

para 1)

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

mueva este estado a la tienda Redux y utilícelo con useSelector.

Para 2) , devuelva una matriz de valor y una devolución de llamada desde el gancho, en lugar de solo el valor. Le permitirá comunicarse desde el componente de vuelta al gancho.

En useIsUserSubscribed ,

 return [userIsSubscribed, setUserIsSubscribed];

Luego, en onClick , puede llamar a setUserIsSubscribed(false) , cambiar el estado interno del enlace y volver a representar su componente.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!