你是否曾经浏览过你网站上的某个页面,然后想“为什么我们要加载所有这些 JavaScript?这个页面上只有链接!” 这对于一个 JavaScript 框架来说可能看起来有点奇怪,但你可以很容易地使用一个布尔值来关闭 JavaScript,而你的数据加载、链接甚至表单仍然可以正常工作。
以下是如何操作
打开你想包含 JavaScript 的每个路由模块,并添加一个“handle”。这是一种向父路由提供关于路由的元信息的方式(正如你将在稍后看到的)。
export const handle = { hydrate: true };
现在打开 root.tsx
,引入 useMatches
并添加以下代码
import {
Meta,
Links,
Scripts,
Outlet,
useMatches,
} from "@remix-run/react";
export default function App() {
const matches = useMatches();
// If at least one route wants to hydrate, this will return true
const includeScripts = matches.some(
(match) => match.handle?.hydrate
);
// then use the flag to render scripts or not
return (
<html lang="en">
<head>
<Meta />
<Links />
</head>
<body>
<Outlet />
{/* include the scripts, or not! */}
{includeScripts ? <Scripts /> : null}
</body>
</html>
);
}
所有数据加载仍然可以在服务器端渲染,并且所有 <Link>
都渲染为普通的 <a>
标签,因此它们将继续工作。
在任何页面,随时可以切换到纯 HTML 和完整的客户端过渡。
如果你需要一点点交互,请使用 <script dangerouslySetInnerHTML>
。
return (
<>
<select id="qty">
<option>1</option>
<option>2</option>
<option value="contact">
Contact Sales for more
</option>
</select>
<script
dangerouslySetInnerHTML={{
__html: `
document.addEventListener('DOMContentLoaded', () => {
document.getElementById('qty').onchange = (event) => {
if (event.target.value === "contact") {
window.location.assign("/contact")
}
}
});
`,
}}
/>
</>
);