コンテンツにスキップ

Disabling JavaScript

このコンテンツはまだ日本語訳がありません。

禁用 JavaScript

您是否曾经查看过网站上的某个页面并想过我们为什么要加载所有这些 JavaScript?这个页面上除了链接什么都没有!对于 JavaScript 框架来说,这似乎有点奇怪,但您可以使用布尔值轻松关闭 JavaScript,而您的数据加载、链接甚至表单仍将正常工作。

我们喜欢这样做:

打开您想要包含 JavaScript 的每个路由模块并添加一个句柄。这是您向父路由提供有关路由的任何类型的元信息的一种方式(稍后您将看到)。

export const handle = { hydrate: true };

现在打开root.tsx,引入useMatches并添加以下内容:

app/root.tsx
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")
}
}
});
`,
}}
/>
</>
);