问题描述
我对 React 还很陌生,我想尝试在我的 React 组件中加入一些纯 Javascript。我有一个我想使用的脚本标签的 html 文件,它可以工作,但显然在 React 中它比添加一些脚本标签要复杂一些。从我阅读的内容来看,我似乎需要学习 JSX。无论哪种方式,这里都是我想要使用的 html 代码片段,然后是我尝试在其中使用它的 React 组件。任何帮助将不胜感激,谢谢大家。
HTML 工作代码:
<!-- grabs foo element (list itself) and sets a timeout of 1 second so we
can toggle off the hidden text class -->
<script>
const text = document.querySelector("#foo");
setTimeout(() => {
text.classList.toggle("hidden-text");
},1000);
</script>
</body>
反应组件:
import React from 'react';
import { Link } from 'react-router-dom';
import './HeroSec.css';``
/* Need to figure out how to use Javascript tags in React Component
const Hello = () => {
return React.createElement(
'script'
)
}*/
function HeroSec(){
return(
<div className='hero-container'>
解决方法
欢迎使用 StackOverflow 和 React! React 的伟大之处在于它建立在 Javascript 之上。这意味着您绝对可以将纯 javascript 功能作为应用程序的一部分。这是一个简单的示例应用:
function App(){
const SomeObject = {title:'Amazing',val:42};
const SomeArray = Object.entries(SomeObject);
const SomeResult = <PassVal passed={SomeArray} />;
// Javascript function
function PassVal(props){
const value = props.passed[0][1];
return value;
}
return (
<>
<p>{SomeResult}</p>
</>
)
}
ReactDOM.render(
<App />,document.getElementById('root')
);
这是一些将加载外部脚本的代码:
function App() {
const status = useScript(
'https://pm28k14qlj.codesandbox.io/test-external-script.js'
);
return (
<div>
<div>
Script status: <b>{status}</b>
</div>
{status === "ready" && (
<div>
Script function call response: <b>{TEST_SCRIPT.start()}</b>
</div>
)}
</div>
);
}
// Hook
function useScript(src) {
// Keep track of script status ("idle","loading","ready","error")
const [status,setStatus] = React.useState(src ? "loading" : "idle");
React.useEffect(
() => {
// Allow falsy src value if waiting on other data needed for
// constructing the script URL passed to this hook.
if (!src) {
setStatus("idle");
return;
}
// Fetch existing script element by src
// It may have been added by another intance of this hook
let script = document.querySelector(`script[src="${src}"]`);
if (!script) {
// Create script
script = document.createElement("script");
script.src = src;
script.async = true;
script.setAttribute("data-status","loading");
// Add script to document body
document.body.appendChild(script);
// Store status in attribute on script
// This can be read by other instances of this hook
const setAttributeFromEvent = (event) => {
script.setAttribute(
"data-status",event.type === "load" ? "ready" : "error"
);
};
script.addEventListener("load",setAttributeFromEvent);
script.addEventListener("error",setAttributeFromEvent);
} else {
// Grab existing script status from attribute and set to state.
setStatus(script.getAttribute("data-status"));
}
// Script event handler to update status in state
// Note: Even if the script already exists we still need to add
// event handlers to update the state for *this* hook instance.
const setStateFromEvent = (event) => {
setStatus(event.type === "load" ? "ready" : "error");
};
// Add event listeners
script.addEventListener("load",setStateFromEvent);
script.addEventListener("error",setStateFromEvent);
// Remove event listeners on cleanup
return () => {
if (script) {
script.removeEventListener("load",setStateFromEvent);
script.removeEventListener("error",setStateFromEvent);
}
};
},[src] // Only re-run effect if script src changes
);
return status;
}
ReactDOM.render(
<App />,document.getElementById('root')
);
,
反应方式
“我告诉你 Neo,当你正确使用 React 时,你就不必这样做了。” 在这里查看代码https://codesandbox.io/s/brave-bohr-vzp2h?file=/src/App.tsx
import { useEffect,setState } from 'react';
const App = () => {
const [show,setShow] = useState(false);
useEffect(() => {
setTimeout(() => {
setShow(true);
},1000);
},[]);
return (
<div>
<h1>My App</h1>
{show ? <p>Hidden Text</p> : null}
</div>
);
}
所以这个想法是你专注于改变单个渲染通道的逻辑,而不是改变特定的 DOM 元素。专注于变量状态,不要担心弄乱 DOM 细节。调用 setShow(true)
告诉 react 自动重新渲染场景。
我个人很喜欢 codeandbox.io 上的这些快速设置项目,并鼓励您尝试一下,避免首先担心设置问题。
这是下面的示例,您可以随意使用它。