Импорт и использование функций vanila JS в компоненте React

#javascript #reactjs #draw.io

#javascript #reactjs #draw.io

Вопрос:

Я очень новичок в react.js и JavaScript, так что заранее приношу свои извинения. Я пытаюсь интегрировать https://diagrams.net на другую веб-страницу, используя файл, который непосредственно предоставляется diagrams.net здесь:

https://github.com/jgraph/drawio-integration/blob/master/diagram-editor.js?fbclid=IwAR1FMViVLW3Tba8RqMOUJtv16vIvPPycLYyu4rEtRTbuhbyztlrLXu5UyHo.

Итак, как это можно увидеть в этом примере здесь: http://jgraph.github.io/drawio-integration/javascript.html , когда пользователь дважды щелкает по диаграмме, они должны быть перенаправлены на diagrams.net паутина и нарисуйте свою собственную диаграмму.

Проблема в том, что мой веб в настоящее время построен на React, и все diagrams.net построен на ванильном JS. Изучив приведенный выше пример, они, по-видимому, используют:

 <img 
style="cursor:pointer;" 
title="Click to edit image" 
onclick="DiagramEditor.editElement(this);" 
src="data:image/png;base64,iVBORw0...
 

в HTML-формате для отображения изображения диаграммы. Я попытался изменить его на react-like, изменив его на:

 <img alt="Click to edit image" 
onClick={EditDiagram.DiagramEditor.editElement(this)}
src="data:image/png;base64,iVBORw0..."/>
 

и импортирует файл JavaScript с помощью import * as EditDiagram from "../components/workarea/workarea-diagram-editor"; , но он возвращается TypeError: Cannot read properties of undefined (reading 'editElement') .

Я также пытался использовать dangerouslySetInnerHTML следующим образом:

 <div
dangerouslySetInnerHTML={{
__html:
"<img style='cursor:pointer;' 
title='Click to edit image' onclick='DiagramEditor.editElement(this);' 
src='data:image/png;base64,iVBORw0...'/>",
}}/>
 

но таким образом, к этому DiagramEditor.editElement(this) нельзя получить доступ таким образом.

Я пытался заставить это работать в течение последних 12 часов, но просто не могу заставить его работать. Есть ли какой-нибудь способ заставить это работать?

Большое вам спасибо.

Ниже приведен код React, в который добавляется JavaScript.

 const WorkArea = () => {
  const router = useRouter();
  const formik = useFormik({
    initialValues: {
      scenario: "This is scenario",
    },
    validationSchema: Yup.object({
      scenario: Yup.string().max(255).required("Scenario is required"),
    }),
    onSubmit: () => {
      router.push("/");
    },
  });

  const [countList, setCountList] = useState([0]);
  //   const [inputList, setInputList] = useState([]);

  const AddScenario = () => {
    let countArr = [...countList];
    let counter = countArr.slice(-1)[0];
    counter  ;
    countArr.push(counter);
    setCountList(countArr);
  };

  const DeleteScenario = () => {
    let countArr = [...countList];
    let counter = countArr.slice(-1)[0];
    counter--;
    countArr.pop(counter);
    setCountList(countArr);
  };

  //   const onAddBtnClick = (event) => {
  //     setInputList(inputList.concat(<SetScenario key={inputList.length} />));
  //   };

  return (
    <>
      <Head>
        <title>Work Area | Cybersecurity Requirements Generator</title>
      </Head>
      <Box
        component="main"
        sx={{
          alignItems: "center",
          display: "flex",
          flexGrow: 1,
          minHeight: "100%",
        }}
      >
        <Container maxWidth="xl">
          <NextLink href="/projects" passHref>
            <Button component="a" startIcon={<ArrowBackIcon fontSize="small" />}>
              Back to Projects
            </Button>
          </NextLink>
          <form onSubmit={formik.handleSubmit}>
            <Box sx={{ my: 3 }}>
              <Typography color="textPrimary" variant="h4">
                Use Case Diagram
              </Typography>
              <Typography color="textSecondary" gutterBottom variant="body2">
                Make your own diagram!
              </Typography>
            </Box>

            <Box
              sx={{
                py: 2,
              }}
            >
              {/* <div
                dangerouslySetInnerHTML={{
                  __html:
                    "<img style='cursor:pointer;' title='Click to edit image' onclick='DiagramEditor.editElement(this);' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHkAAAA9CAYAAACJM8YzAAADT3RFWHRteGZpbGUAJTNDbXhmaWxlJTIwaG9zdCUzRCUyMmVtYmVkLmRpYWdyYW1zLm5ldCUyMiUyMG1vZGlmaWVkJTNEJTIyMjAyMS0wMS0xMVQxMCUzQTQxJTNBMzQuMjQ4WiUyMiUyMGFnZW50JTNEJTIyNS4wJTIwKE1hY2ludG9zaCUzQiUyMEludGVsJTIwTWFjJTIwT1MlMjBYJTIwMTFfMV8wKSUyMEFwcGxlV2ViS2l0JTJGNTM3LjM2JTIwKEtIVE1MJTJDJTIwbGlrZSUyMEdlY2tvKSUyMENocm9tZSUyRjg3LjAuNDI4MC44OCUyMFNhZmFyaSUyRjUzNy4zNiUyMiUyMGV0YWclM0QlMjJtNXI1QVhFdDE3eWx2WWlEWXo5UyUyMiUyMHZlcnNpb24lM0QlMjIxNC4xLjklMjIlMjB0eXBlJTNEJTIyZW1iZWQlMjIlM0UlM0NkaWFncmFtJTIwaWQlM0QlMjJlbVlSU0REUmtEUDJZZDNFWnkzciUyMiUyMG5hbWUlM0QlMjJQYWdlLTElMjIlM0VqWkxOVG9Rd0VJQ2ZwbGV6MEloNkZkZjE0Z2tUejVXT3ROblNrbElXOE9sdDdWUm9OaVplWU9hYjZmd1RXdmZMeWJKQnZCb09pcFFIdmhENlJNcXlxS283JTJGd3RramVTV1BrVFFXY2tqT215Z2tWJTJCQUx4T2RKSWNSV1VUT0dPWGtrTVBXYUEydHl4aXoxc3k1MjZkUmVkYUJkWkI1Qk5DMFRGM1RkOG1kaVBTJTJCckRiJTJCQXJJVEtYTlJZWDhmckQxMzFrd2E4Mm1qSVZwNmxzSmdEYU5nM013N1JJJTJCRTF0WVlGNlYlMkJxVUdGc2VZVGUlMkY3RGlpV1BiazFOcEZvdGFQZXZDS21KQzFNVHhuZ1RjZ3d1NGNQQ0ZtQjBOMWVaWmlFZE5BTnJnejc3a3lEMFViaGVlYTN3NG5VaFdPd0ZySU5saDdDd0U1Z2VuRjI5QzFyVDBOWmNuYmZsRkltSjNXSXFaQXp2b2ZzTnZNM0JDemlLcEc0NyUyQkxIdGJwd2V2d0UlM0QlM0MlMkZkaWFncmFtJTNFJTNDJTJGbXhmaWxlJTNFoE8CRAAABV1JREFUeF7tm1lIlVsYht NXoSipGkIGpoDBYqiKIIQSCiRSigOCV2odZuSw51KoYaR8xCkGDmiaCDiVM5JSQiKoSiFaVk5UoKK4nz4Fmd73KmdvZX28ez1rZst7rXW/7/vs961vl/8FQB2wU2nHVAQ5J2dHZ0WKbM4PT29XQF5d5fDrIsLgbgyZF0ku08TQ9ZxwCSPITNkCRyQQCInmSFL4IAEEjnJDFkCBySQyElmyBI4IIFETjJDlsABCSRykhmyBA5IIJGTzJAlcEACiZxkhiyBAxJI5CQzZAkckEAiJ5khS CABBJPTZLpRra3t6Gvry B7dqVqDXI379/h5WV1ZHq2tvbERUVha9fvx7o8 DBA3z /BmlpaVquaNpf7UmBfDlyxf09/cjNDRU3SEq/U46/lgX1eZ/a1JK5 bmxH2 f/8efn5 4tPMzEz8bnR09EjIk5OTWF9fx XLl9XSqWl/tSYF0NjYiHv37uHTp0/qDlHpd9Lxx7qoNiHvv8GBgQG4u7tjfn4e5ubm4quOjg7cunULd 7cQUVFBc6fP4 ioiLR79mzZ5idnUViYiLq6 uRn58PmiMwMBCFhYUwNjZW0a9pfxqcnp6OyspKbG1twd/fHxkZGfTWwd68tHB8fHwwMTGB4OBgvHjxQqQ6ISEBHz58wLVr15CTk4Nz585hcXERtJvU1NSIRfzo0SM4OTkdGH9caJqO09p2rQ5kX19fBAUF4fbt28Iwejeru7sb9 /fB5mcnZ0tFkVtbS1MTEwQHx PiIgIxMXFqejWtP/w8LAAUFxcLOal7fjp06fiXpRtdXUVeXl5yM3NRWtrKywtLWFhYYHo6GiEhITg8ePHWFpaQm9vLzIzM8WiffjwIV6 fImkpCT8/PlTzKkc7 bmpimrY/c/dZBXVlZgaGgojLx586YwTgktLS0N1tbWKCgoQGRkpDBubW0Nly5dOhSyuv3HxsZE jw9PfHt2zcBmdJM193f9m 3BCsrKwtTU1NQKBQizXSczMzMIDU1Fe/evUNZWRkcHR3x9u1bENTOzs4TbffHpXyqINN2rTy337x5gytXrohXPJSQy8vLhbG0RVIjEJR4BweHQyGr25 KPToK6JgwMjISc9Eu8TvIlGA6Kn5ttCucPXsW4eHhAq6trS1iY2Nx9 7dE5/pOgF5f3V9GGQCSom7cOEC vr6BAT6uaqq6lDI6vYnCJQ8OkNppwgLCxMJ/B3k5ORkvHr1Cj09PeLam5ubGBkZgYeHBz5 /IiLFy/ix48faGhoQExMjCgsx8fHOcn/BpkqW29vbwwNDYmEEAQqwJqamg6FrG7/gIAAAYWOgcHBQXENGpuSkqIyb3Nzs6gX6HGwq6tLFFuvX78WYKlQe/LkifiOzmhnZ2fQQlheXhbFGM07PT29N54mpp3gxo0bQsufbKdqu/4dZHrGpOdkSlldXZ2ovmlbfP78Oby8vA5A1qR/W1ubAEONCjt6vCMAtJhcXFz25iZIrq6u4rp0BtOWTsUgNbqf6upqXL16VRSL9Knc umeS0pKBGTleJrbwMAALS0tuH79 p9k/P98q5EAbmxsHDiLj3JKnf70HE4QbGxsRCG1sLAAU1NTlccomp8esajYUwKkflRH2Nvb48yZM3u3QAUj/QHHzs5OFJLK9uv4P0r378n/kyRrQxhf4x8HGLIEq4EhM2QJHJBAIieZIUvggAQSOckMWQIHJJDISWbIEjgggUROMkOWwAEJJHKSGbIEDkggkZPMkCVwQAKJnGSGLIEDEkjkJDNkCRyQQCInmSFL4IAEEjnJDFkCBySQqJJkCfRKK1GhUOz BbaftLWDFNYjAAAAAElFTkSuQmCC'/>",
                }}
              /> */}

              <img
                alt="Click to edit image"
                onClick={EditDiagram.DiagramEditor.editElement(this)}
                src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHkAAAA9CAYAAACJM8YzAAADT3RFWHRteGZpbGUAJTNDbXhmaWxlJTIwaG9zdCUzRCUyMmVtYmVkLmRpYWdyYW1zLm5ldCUyMiUyMG1vZGlmaWVkJTNEJTIyMjAyMS0wMS0xMVQxMCUzQTQxJTNBMzQuMjQ4WiUyMiUyMGFnZW50JTNEJTIyNS4wJTIwKE1hY2ludG9zaCUzQiUyMEludGVsJTIwTWFjJTIwT1MlMjBYJTIwMTFfMV8wKSUyMEFwcGxlV2ViS2l0JTJGNTM3LjM2JTIwKEtIVE1MJTJDJTIwbGlrZSUyMEdlY2tvKSUyMENocm9tZSUyRjg3LjAuNDI4MC44OCUyMFNhZmFyaSUyRjUzNy4zNiUyMiUyMGV0YWclM0QlMjJtNXI1QVhFdDE3eWx2WWlEWXo5UyUyMiUyMHZlcnNpb24lM0QlMjIxNC4xLjklMjIlMjB0eXBlJTNEJTIyZW1iZWQlMjIlM0UlM0NkaWFncmFtJTIwaWQlM0QlMjJlbVlSU0REUmtEUDJZZDNFWnkzciUyMiUyMG5hbWUlM0QlMjJQYWdlLTElMjIlM0VqWkxOVG9Rd0VJQ2ZwbGV6MEloNkZkZjE0Z2tUejVXT3ROblNrbElXOE9sdDdWUm9OaVplWU9hYjZmd1RXdmZMeWJKQnZCb09pcFFIdmhENlJNcXlxS283JTJGd3RramVTV1BrVFFXY2tqT215Z2tWJTJCQUx4T2RKSWNSV1VUT0dPWGtrTVBXYUEydHl4aXoxc3k1MjZkUmVkYUJkWkI1Qk5DMFRGM1RkOG1kaVBTJTJCckRiJTJCQXJJVEtYTlJZWDhmckQxMzFrd2E4Mm1qSVZwNmxzSmdEYU5nM013N1JJJTJCRTF0WVlGNlYlMkJxVUdGc2VZVGUlMkY3RGlpV1BiazFOcEZvdGFQZXZDS21KQzFNVHhuZ1RjZ3d1NGNQQ0ZtQjBOMWVaWmlFZE5BTnJnejc3a3lEMFViaGVlYTN3NG5VaFdPd0ZySU5saDdDd0U1Z2VuRjI5QzFyVDBOWmNuYmZsRkltSjNXSXFaQXp2b2ZzTnZNM0JDemlLcEc0NyUyQkxIdGJwd2V2d0UlM0QlM0MlMkZkaWFncmFtJTNFJTNDJTJGbXhmaWxlJTNFoE8CRAAABV1JREFUeF7tm1lIlVsYht NXoSipGkIGpoDBYqiKIIQSCiRSigOCV2odZuSw51KoYaR8xCkGDmiaCDiVM5JSQiKoSiFaVk5UoKK4nz4Fmd73KmdvZX28ez1rZst7rXW/7/vs961vl/8FQB2wU2nHVAQ5J2dHZ0WKbM4PT29XQF5d5fDrIsLgbgyZF0ku08TQ9ZxwCSPITNkCRyQQCInmSFL4IAEEjnJDFkCBySQyElmyBI4IIFETjJDlsABCSRykhmyBA5IIJGTzJAlcEACiZxkhiyBAxJI5CQzZAkckEAiJ5khS CABBJPTZLpRra3t6Gvry B7dqVqDXI379/h5WV1ZHq2tvbERUVha9fvx7o8 DBA3z /BmlpaVquaNpf7UmBfDlyxf09/cjNDRU3SEq/U46/lgX1eZ/a1JK5 bmxH2 f/8efn5 4tPMzEz8bnR09EjIk5OTWF9fx XLl9XSqWl/tSYF0NjYiHv37uHTp0/qDlHpd9Lxx7qoNiHvv8GBgQG4u7tjfn4e5ubm4quOjg7cunULd 7cQUVFBc6fP4 ioiLR79mzZ5idnUViYiLq6 uRn58PmiMwMBCFhYUwNjZW0a9pfxqcnp6OyspKbG1twd/fHxkZGfTWwd68tHB8fHwwMTGB4OBgvHjxQqQ6ISEBHz58wLVr15CTk4Nz585hcXERtJvU1NSIRfzo0SM4OTkdGH9caJqO09p2rQ5kX19fBAUF4fbt28Iwejeru7sb9 /fB5mcnZ0tFkVtbS1MTEwQHx PiIgIxMXFqejWtP/w8LAAUFxcLOal7fjp06fiXpRtdXUVeXl5yM3NRWtrKywtLWFhYYHo6GiEhITg8ePHWFpaQm9vLzIzM8WiffjwIV6 fImkpCT8/PlTzKkc7 bmpimrY/c/dZBXVlZgaGgojLx586YwTgktLS0N1tbWKCgoQGRkpDBubW0Nly5dOhSyuv3HxsZE jw9PfHt2zcBmdJM193f9m 3BCsrKwtTU1NQKBQizXSczMzMIDU1Fe/evUNZWRkcHR3x9u1bENTOzs4TbffHpXyqINN2rTy337x5gytXrohXPJSQy8vLhbG0RVIjEJR4BweHQyGr25 KPToK6JgwMjISc9Eu8TvIlGA6Kn5ttCucPXsW4eHhAq6trS1iY2Nx9 7dE5/pOgF5f3V9GGQCSom7cOEC vr6BAT6uaqq6lDI6vYnCJQ8OkNppwgLCxMJ/B3k5ORkvHr1Cj09PeLam5ubGBkZgYeHBz5 /IiLFy/ix48faGhoQExMjCgsx8fHOcn/BpkqW29vbwwNDYmEEAQqwJqamg6FrG7/gIAAAYWOgcHBQXENGpuSkqIyb3Nzs6gX6HGwq6tLFFuvX78WYKlQe/LkifiOzmhnZ2fQQlheXhbFGM07PT29N54mpp3gxo0bQsufbKdqu/4dZHrGpOdkSlldXZ2ovmlbfP78Oby8vA5A1qR/W1ubAEONCjt6vCMAtJhcXFz25iZIrq6u4rp0BtOWTsUgNbqf6upqXL16VRSL9Knc umeS0pKBGTleJrbwMAALS0tuH79 p9k/P98q5EAbmxsHDiLj3JKnf70HE4QbGxsRCG1sLAAU1NTlccomp8esajYUwKkflRH2Nvb48yZM3u3QAUj/QHHzs5OFJLK9uv4P0r378n/kyRrQxhf4x8HGLIEq4EhM2QJHJBAIieZIUvggAQSOckMWQIHJJDISWbIEjgggUROMkOWwAEJJHKSGbIEDkggkZPMkCVwQAKJnGSGLIEDEkjkJDNkCRyQQCInmSFL4IAEEjnJDFkCBySQqJJkCfRKK1GhUOz BbaftLWDFNYjAAAAAElFTkSuQmCC"
              />

              {/* <Tester /> */}
            </Box>
            <Box sx={{ my: 3 }}>
              <Typography color="textPrimary" variant="h4">
                Scenario
              </Typography>
              <Typography color="textSecondary" gutterBottom variant="body2">
                Enter scenarios
              </Typography>
            </Box>

            <SetScenario countList={countList} />
            <Box
              sx={{
                alignItems: "center",
                display: "flex",
                ml: -1,
              }}
            ></Box>
            {Boolean(formik.touched.policy amp;amp; formik.errors.policy) amp;amp; (
              <FormHelperText error>{formik.errors.policy}</FormHelperText>
            )}
            <Box
              sx={{
                py: 2,
                display: "flex",
                justifyContent: "flex-end",
                justifyContent: "space-between",
              }}
            >
              <Box>
                <Button
                  color="primary"
                  disabled={formik.isSubmitting}
                  size="large"
                  variant="contained"
                  onClick={AddScenario}
                  sx={{
                    marginRight: 1,
                  }}
                >
                  Add Row
                </Button>
                <Button
                  color="primary"
                  disabled={formik.isSubmitting}
                  size="large"
                  variant="contained"
                  onClick={DeleteScenario}
                >
                  Delete Row
                </Button>
              </Box>

              <NextLink href="/requirements" passHref>
                <Button
                  color="primary"
                  disabled={formik.isSubmitting}
                  size="large"
                  type="submit"
                  variant="contained"
                >
                  Submit
                </Button>
              </NextLink>
            </Box>
          </form>
        </Container>
      </Box>
    </>
  );
};

WorkArea.getLayout = (page) => <DashboardLayout>{page}</DashboardLayout>;
export default WorkArea;

 

Комментарии:

1. попробуйте это, onClick={ () => EditDiagram . DiagramEditor.editElement(это) }

2. @Emmanuel С этой строкой изображение действительно отображается, но щелчок по-прежнему не работает. Спасибо за помощь!