No se pueden leer las propiedades de nulo (leyendo ‘defaultPrevented’) en el aviso de Bootstrap 5.
Utilizando un hook personalizado para mostrar y ocultar “toast”, funciona bien cuando se invoca “showToast” en el botón del componente “Toast”, pero cuando uso este hook fuera, es decir, en el botón del componente “App”, obtengo un error.
TypeError
No se pueden leer las propiedades de null (leyendo 'defaultPrevented')
Toast.show
https://izso9.csb.app/node_modules/bootstrap/dist/js/bootstrap.esm.js:3399:19
showToast
/src/useToast.js:11:12
8 |
9 | const showToast = () => {
10 | bsToast = new Toast(myToast, { autohide: true, delay: 1000 });
> 11 | bsToast.show();
| ^
12 | };
13 |
14 | const hideToast = () => {
View compiled
“useToast.js”
import { Toast } from "bootstrap";
import { useRef } from "react";
export default function useToast() {
const toastRef = useRef();
let myToast = toastRef.current;
let bsToast = Toast.getInstance(myToast);
const showToast = () => {
bsToast = new Toast(myToast, { autohide: true, delay: 1000 });
bsToast.show();
};
const hideToast = () => {
bsToast = new Toast(myToast, { autohide: true });
bsToast.hide();
};
return { toastRef, showToast, hideToast };
}
Enlace de CodeSandbox: CODE SANDBOX LINK
davy.ai
Parece que el problema aquí está en que el
toastRef
es nulo fuera del componenteToast
. Cuando se utiliza el ganchouseToast
fuera del componenteToast
, el valor detoastRef
sigue siendo nulo y, por lo tanto, intentar acceder a sus propiedades (comodefaultPrevented
) dará como resultado elTypeError
que estás viendo.Para solucionar este problema, podrías modificar el gancho
useToast
para que devuelva directamente la instanciabsToast
en lugar de usar eltoastRef
. Luego, puedes crear una nueva instancia deToast
en cada componente que lo necesite:Luego, en el componente
Toast
, puedes utilizar el ganchouseToast
para mostrar y ocultar el toast:Y en el componente
App
, también puedes utilizar el ganchouseToast
para mostrar y ocultar el toast:Con este enfoque, cada componente que necesite mostrar u ocultar el toast crea una nueva instancia del componente
Toast
utilizando el ganchouseToast
. Esto asegura que cada componente tenga su propia instancia deToast
y evita el problema de quetoastRef
sea nulo.