es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo abrir un modal de React Material-UI y poblarse mediante una llamada Ajax al hacer clic en un botón?

Intenté buscar una pregunta similar pero no encontré ninguna, disculpen si me perdí alguna. Estoy usando React Material-UI para crear una aplicación web simple. Tengo un XGrid que lista una serie de productos y varias estadísticas sobre un rango de fechas seleccionado por el usuario. Cada fila tiene un botón que el usuario puede hacer clic. La idea es que, al hacer clic en el botón, la aplicación llame a una API para obtener información relevante sobre el producto en esa fila. Me gustaría que la información devuelta por la API se muestre en un modal de Material-UI.

Me estoy atascando en cómo pasar la información desde la API al componente de Modal y mostrarla. Tengo un ejemplo simple en el código a continuación que es cercano a lo que quiero lograr.

import "./styles.css";
import React from "react";
import { Button, Modal, Typography, Box } from "@material-ui/core";

export default function App() {
  const [open, setOpen] = React.useState(false);
  const handleClose = () => setOpen(false);

return (
    <div classname="App">
      <button variant="outlined" color="primary" onclick="{()" ==""> {
          setOpen(true);
          (async () => {
            let response = await fetch("https://jsonplaceholder.typicode.com/todos/1");
            let apiCall = await response.json();
            let grouped_data = JSON.parse(apiCall.data);
          })();
        }}
      >
        Click Here
      </button>
      <modal open="{open}" onclose="{handleClose}">
        <box>
          <typography>Texto Aleatorio</typography>
        </box>
      </modal>
    </div>
  );
}

En este ejemplo, he aislado el código en un solo App.js en codesandbox. Sin embargo, en la práctica tendría el Button y Modal combinados en un archivo de componente separado con la URL de API pasada como una prop al componente. También usé JSONPlaceholder en lugar de mi API real. Actualmente, el botón muestra un modal que dice “Texto Aleatorio”. Sin embargo, me gustaría que muestre la información recuperada usando la llamada fetch.

Además, la tabla tendrá miles de filas, así que me gustaría evitar llamar a la API hasta que el usuario realmente haga clic en el botón. De esa manera, no sobrecargo al servidor con miles de llamadas de API separadas cada vez que alguien cargue la página. Agradezco cualquier ayuda que alguien pudiera proporcionar.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Puede lograr esto utilizando el hook useState para almacenar los datos de la llamada a la API en una variable de estado. Luego, puede pasar estos datos al componente Modal como una propiedad.

    En el código de ejemplo, puede almacenar los datos de la llamada a la API en la variable grouped_data y pasarlos al componente Modal de la siguiente manera:

    import "./styles.css";
    import React, { useState } from "react";
    import { Button, Modal, Typography, Box } from "@material-ui/core";
    
    export default function App() {
      const [open, setOpen] = useState(false);
      const [groupedData, setGroupedData] = useState(null);
      const handleClose = () => setOpen(false);
    
      return (
        <div classname="App">
          <button variant="outlined" color="primary" onclick="{()" ==""> {
              setOpen(true);
              (async () => {
                let response = await fetch("https://jsonplaceholder.typicode.com/todos/1");
                let apiCall = await response.json();
                let grouped_data = JSON.parse(apiCall.data);
                setGroupedData(grouped_data);
              })();
            }}
          >
            Click Here
          </button>
          <modal open="{open}" onclose="{handleClose}" data="{groupedData}">
            <box>
              <typography>Random Text</typography>
            </box>
          </modal>
        </div>
      );
    }
    

    Luego, puede acceder a los datos en el componente Modal utilizando la variable props.data.

Comments are closed.