Come integrare JavaScript semplice (vanigliato) all'interno di ReactJS?
Sto cercando di utilizzare questa visualizzazione gio 3D nella mia applicazione ReactJs. Il codice è scritto in vanilla JavaScript. Ho anche trovato il wrapper per React e l'ho provato ma non sono in grado di scegliere il paese selezionato ( onCountryPicked()) come mostrato nella loro demo . Questo è il motivo principale per cui vado avanti con l'implementazione di JavaScript vanilla invece del wrapper. Tuttavia, trovo che l'implementazione di JavaScript vanilla sia difficile da integrare con la mia applicazione ReactJs.
Mi sono guardato intorno per risolvere il problema ma le risorse che ho trovato non mi hanno aiutato. I seguenti sono alcuni dei luoghi che ho visitato.
- Come utilizzare javascript vanilla all'interno del componente Reactjs?
- https://reactjs.org/docs/integrating-with-other-libraries.html
helloworld.js
var container = document.getElementById("globalArea");
var controller = new GIO.Controller(container, {
color: {...},
brightness: {...},
});
controller.onCountryPicked(callback);
controller.setInitCountry("FR");
controller.showOutOnly(false);
controller.showInOnly(false);
function callback(selectedCountry) {
$("#countryArea").text(selectedCountry.name + " picked!"); $("#infoBoard").fadeIn(300);
setTimeout(function () {
$("#infoBoard").fadeOut(1000); }, 3000); } axios .get("./test_data.json") .then(function (response) { controller.addData(response.data); }) .catch(function (error) { console.log(error); }) .then(function () { controller.init(); }); var d3Graphs = { tiltBtnInterval: -1, }; function showHud() { $("#hudButtons").show();
$(".tiltBtn").on("mousedown touchstart", d3Graphs.tiltBtnClick); $(".tiltBtn").on("mouseup touchend touchcancel", d3Graphs.tiltBtnMouseup);
}
function tiltBtnClick() {
var delta;
if ($(this).hasClass("sideViewBtn")) {
delta = 10;
} else {
delta = -10;
}
d3Graphs.doTilt(delta);
d3Graphs.tiltBtnInterval = setInterval(d3Graphs.doTilt, 50, delta);
}
function doTilt(delta) {
tilt += delta * 0.01;
tilt = constrain(tilt, 0, Math.PI / 2);
camera.position.y = 300 * Math.sin(-tilt);
camera.position.z = 100 + 300 * Math.cos(-tilt);
camera.lookAt(new THREE.Vector3(0, 0, 300));
tiltTarget = undefined;
}
............
home.html
<html lang="en">
<head>
<meta charset="UTF-8" />
<script src="./lib/jquery-3.3.1.min.js"></script>
<script src="./lib/three.min.js"></script>
<script src="./lib/gio.min.js"></script>
<script src="./lib/axios.min.js"></script>
<script src="https://d3js.org/d3.v5.js"></script>
<script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>
<link rel="stylesheet" href="helloworld.css" />
</head>
<body>
<div class="b">
<div id="infoBoard">
<div id="countryArea"></div>
<div id="explanation">Infos here</div>
</div>
<script src="helloworld.js"></script>
</div>
</body>
</html>
................
Sample.js
export class Sample extends React.Component {
componentDidMount() {
}
render() {
return (
<div className="App">
...
</div>
);
}
}
Risposte
Ecco un punto di partenza. Ho annotato le parti in cui React interagisce con Gio.js.
const Globe = () => {
// use a React ref whenever you need to directly target a DOM element
// - this is required as an argument to the GIO.Controller constructor
const ref = useRef(null);
const [country, setCountry] = useState(initCountry);
useEffect(() => {
// useEffect with empty dependency array
// - this will run once when the component mounts
const controller = new GIO.Controller(ref.current, {
control: {
initCountry
}
});
// import and add data here if you want the glowing lines
controller.addData([]);
controller.init();
// here's the callback for when the user clicks a country
// we can use the React setState hook inside the callback
controller.onCountryPicked((country) => {
setCountry(country.ISOCode);
});
}, []);
return (
<>
<div>
<strong>Selected country: {displayName.of(country)}</strong>
</div>
<div style={{ height: 500 }} ref={ref}></div>
</>
);
};
Demo di CodeSandbox
Se metti il tuo file javascript vanilla sullo stesso livello gerarchico del tuo index.htmle lo colleghi normalmente, dovresti essere in grado di implementare il tuo javascript vanilla senza interferire con il tuo javascript di reazione. Basta collegarlo in basso come al solito con un <script>tag.
In alternativa, da utilizzare useStatenel codice di reazione:
import React, {useState} from "react";
import ReactDOM from "react-dom";
const Country = () => {
const [country, setCountry] = useState('');
///your javascript here
setCountry(//return from javascript function// );
return (
<h1>{country}</h1>
)
}
ReactDOM.render(<Country/>, document.getElementById("countryArea"));
Dovrai importare eventuali dipendenze aggiuntive per il tuo javascript vanilla (es. axios) In questo file.