У меня есть следующий iframe, который нужно добавить в мой проект Next.js.
<iframe
class = "plot"
aria-label = "Map"
id = "datawrapper-chart-${id}"
src = "https://datawrapper.dwcdn.net/${id}/1/"
style = "width: 0; min-width: 100% !important; overflow: scroll; flex-grow: 1"
data-external = "1"
></iframe>
<script type = "text/javascript">
!(function () {
"use strict";
window.addEventListener("message", function (a) {
if (void 0 !== a.data["datawrapper-height"]) {
var e = document.querySelectorAll("iframe");
for (var t in a.data["datawrapper-height"])
for (var r = 0; r < e.length; r++)
if (e[r].contentWindow === a.source) {
var i = a.data["datawrapper-height"][t] + "px";
e[r].style.height = i;
}
}
});
})();
</script>
Я попробовал использовать dangerouslySetInnerHTML, и это сработало, но мне интересно, есть ли более «реагирующий» способ сделать это.
Способы ниже не сработали.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Для этого вам не обязательно использовать тег сценария, это способ сделать это с помощью реакции.
// components/DataWrapperChart.js
import { useEffect } from 'react';
const DataWrapperChart = ({ id }) => {
useEffect(() => {
const handleMessage = (event) => {
if (event.data["datawrapper-height"]) {
const iframes = document.querySelectorAll("iframe");
for (let iframe of iframes) {
if (iframe.contentWindow === event.source) {
const height = event.data["datawrapper-height"][id] + "px";
iframe.style.height = height;
}
}
}
};
window.addEventListener("message", handleMessage);
return () => {
window.removeEventListener("message", handleMessage);
};
}, [id]);
return (
<iframe
className = "plot"
aria-label = "Map"
id = {`datawrapper-chart-${id}`}
src = {`https://datawrapper.dwcdn.net/${id}/1/`}
style = {{ width: '0', minWidth: '100% !important', overflow: 'scroll', flexGrow: '1' }}
data-external = "1"
></iframe>
);
};
export default DataWrapperChart;
тогда мы сможем использовать его на какой-нибудь странице вроде этой
// pages/somepage.js
import DataWrapperChart from '../components/DataWrapperChart';
const SomePage = () => {
const chartId = "your-chart-id";
return (
<div>
<h1>Your Page</h1>
<DataWrapperChart id = {chartId} />
</div>
);
};
export default SomePage;