Hay un controlador de eventos para hacer clic y cuando se activa, quiero extraer datos específicos de redux usando el selector donde se implementa toda la lógica de muchos a muchos. Necesito pasarle una identificación para recibir sus datos individuales. Según las reglas de reacción, los ganchos se pueden llamar en una función que no es un componente de la función React ni una función React Hook personalizada.
Entonces, ¿cuál es la manera de resolver mi problema?
const handleMediaItemClick = (media: any): void => { // For example i check media type and use this selector to pull redux data by id const data = useSelector(playlistWithMediaSelector(imedia.id)); };Como se indica en el mensaje de error, no puede llamar a ganchos dentro de funciones. Llamas a un gancho dentro de un componente funcional y usas ese valor dentro de la función. El useSelector actualiza la variable cada vez que cambia el estado y representa ese componente.
Además, cuando obtenga datos con useSelector , debe escribir el nombre del reductor que necesita del estado redux.
const CustomComponent = () => { // The data will be updated on each state change and the component will be rendered const data = useSelector((state) => state.REDUCER_NAME); const handleMediaItemClick = () => { console.log(data); }; }Puede consultar esta página para obtener más información. https://react-redux.js.org/api/hooks#useselector
Probablemente debería usar el valor del estado local para rastrear eso.
const Component = () => { const [imediaId, setImediaId] = useState(null); const data = useSelector(playlistWithMediaSelector(imediaId)); function handleMediaClick(id) { setImediaId(id) } useEffect(() => { // do something on data }, [imediaId, data]) return <div>...</div> }¿Eso ayuda?
EDITAR: deduzco que lo que quieres hacer es poder llamar al selector donde lo necesites. Algo así como (considerando el código anterior) data(id) en handleMediaClick . Apuesto a que tienes que devolver una función curry de useSelector , en lugar de valor. Entonces lo llamarías. Por desgracia, no he descubierto cómo hacerlo, si es posible y si es un patrón aceptable o no.