我似乎无法将按钮与实际功能 REACT 分开
I cant seem to seperate the button from the actual function REACT
所以我看了这个关于如何创建模态的很棒的教程:https://www.youtube.com/watch?v=9DwGahSqcEc
我已经成功了。但问题是视频中的那个人在同一个地方同时创建了按钮和模式,然后他在他的 App.js 中将其称为 <Modal />
但就我而言,我在主导航栏中有一个按钮,当我单击该按钮时,模式会在导航栏内打开,这不是最佳选择。
我已经尝试了很多东西,但遗憾的是我无法将按钮与模态组件分开,以至于按钮调用导航栏之外的函数。
模态组件如下所示:
import React, { useState } from "react";
export default function Modal() {
const [modal, setModal] = useState(false);
const toggleModal = () => {
setModal(!modal);
};
if (modal) {
document.body.classList.add("active-modal");
} else {
document.body.classList.remove("active-modal");
}
return (
<>
<button
onClick={toggleModal}
className="btn-modal"
class="block text-gray-900 dark:text-white font-bold rounded-lg text-sm px-5 py-2 text-center"
type="button"
>
Login
</button>
{modal && (
<div class="relative px-4 w-full max-w-md h-full md:h-auto">
<div class="relative bg-white rounded-lg shadow dark:bg-gray-700">
<div class="flex justify-end p-2">
<button
className="close-modal"
onClick={toggleModal}
type="button"
class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm p-1.5 ml-auto inline-flex items-center dark:hover:bg-gray-800 dark:hover:text-white"
>
<svg
class="w-5 h-5"
fill="currentColor"
viewBox="0 0 20 20"
xmlns="http://www.w3.org/2000/svg"
>
<path
fill-rule="evenodd"
d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"
clip-rule="evenodd"
></path>
</svg>
</button>
</div>
<form
class="px-6 pb-4 space-y-6 lg:px-8 sm:pb-6 xl:pb-8"
action="#"
>
<h3 class="text-xl font-medium text-gray-900 dark:text-white">
Sign in to our platform
</h3>
<div>
<label
for="email"
class="block mb-2 text-sm font-medium text-gray-900 dark:text-gray-300"
>
Your email
</label>
<input
type="email"
name="email"
id="email"
class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-600 dark:border-gray-500 dark:placeholder-gray-400 dark:text-white"
placeholder="name@company.com"
required
></input>
</div>
<div>
<label
for="password"
class="block mb-2 text-sm font-medium text-gray-900 dark:text-gray-300"
>
Your password
</label>
<input
type="password"
name="password"
id="password"
placeholder="••••••••"
class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-600 dark:border-gray-500 dark:placeholder-gray-400 dark:text-white"
required
></input>
</div>
<div class="flex justify-between">
<div class="flex items-start">
<div class="flex items-center h-5">
<input
id="remember"
aria-describedby="remember"
type="checkbox"
class="w-4 h-4 bg-gray-50 rounded border border-gray-300 focus:ring-3 focus:ring-blue-300 dark:bg-gray-600 dark:border-gray-500 dark:focus:ring-blue-600 dark:ring-offset-gray-800"
required
></input>
</div>
<div class="ml-3 text-sm">
<label
for="remember"
class="font-medium text-gray-900 dark:text-gray-300"
>
Remember me
</label>
</div>
</div>
<a
href="#"
class="text-sm text-blue-700 hover:underline dark:text-blue-500"
>
Lost Password?
</a>
</div>
<button
type="submit"
class="w-full text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800"
>
Login to your account
</button>
<div class="text-sm font-medium text-gray-500 dark:text-gray-300">
Not registered?{" "}
<a
href="#"
class="text-blue-700 hover:underline dark:text-blue-500"
>
Create account
</a>
</div>
</form>
</div>
</div>
)}
</>
);
}
这是 React 的一个常见问题,可以用 react portals 解决。
尝试阅读并理解它们的工作原理,这将有助于您理解我的回答。
简短说明:首先,您必须将模态组件拆分为一个 ModalButton 和一个 Modal。然后你可以使用 ReactDOM.createPortal
函数,在其他地方渲染 Modal 组件的内容。在我的示例中,它将呈现到 body
元素而不是导航中。
return ReactDOM.createPortal(
<div>
...
</div>,
document.body
);
Here is a codesandbox 使用您的代码的详细示例。
所以我看了这个关于如何创建模态的很棒的教程:https://www.youtube.com/watch?v=9DwGahSqcEc
我已经成功了。但问题是视频中的那个人在同一个地方同时创建了按钮和模式,然后他在他的 App.js 中将其称为 <Modal />
但就我而言,我在主导航栏中有一个按钮,当我单击该按钮时,模式会在导航栏内打开,这不是最佳选择。
我已经尝试了很多东西,但遗憾的是我无法将按钮与模态组件分开,以至于按钮调用导航栏之外的函数。
模态组件如下所示:
import React, { useState } from "react";
export default function Modal() {
const [modal, setModal] = useState(false);
const toggleModal = () => {
setModal(!modal);
};
if (modal) {
document.body.classList.add("active-modal");
} else {
document.body.classList.remove("active-modal");
}
return (
<>
<button
onClick={toggleModal}
className="btn-modal"
class="block text-gray-900 dark:text-white font-bold rounded-lg text-sm px-5 py-2 text-center"
type="button"
>
Login
</button>
{modal && (
<div class="relative px-4 w-full max-w-md h-full md:h-auto">
<div class="relative bg-white rounded-lg shadow dark:bg-gray-700">
<div class="flex justify-end p-2">
<button
className="close-modal"
onClick={toggleModal}
type="button"
class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm p-1.5 ml-auto inline-flex items-center dark:hover:bg-gray-800 dark:hover:text-white"
>
<svg
class="w-5 h-5"
fill="currentColor"
viewBox="0 0 20 20"
xmlns="http://www.w3.org/2000/svg"
>
<path
fill-rule="evenodd"
d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"
clip-rule="evenodd"
></path>
</svg>
</button>
</div>
<form
class="px-6 pb-4 space-y-6 lg:px-8 sm:pb-6 xl:pb-8"
action="#"
>
<h3 class="text-xl font-medium text-gray-900 dark:text-white">
Sign in to our platform
</h3>
<div>
<label
for="email"
class="block mb-2 text-sm font-medium text-gray-900 dark:text-gray-300"
>
Your email
</label>
<input
type="email"
name="email"
id="email"
class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-600 dark:border-gray-500 dark:placeholder-gray-400 dark:text-white"
placeholder="name@company.com"
required
></input>
</div>
<div>
<label
for="password"
class="block mb-2 text-sm font-medium text-gray-900 dark:text-gray-300"
>
Your password
</label>
<input
type="password"
name="password"
id="password"
placeholder="••••••••"
class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-600 dark:border-gray-500 dark:placeholder-gray-400 dark:text-white"
required
></input>
</div>
<div class="flex justify-between">
<div class="flex items-start">
<div class="flex items-center h-5">
<input
id="remember"
aria-describedby="remember"
type="checkbox"
class="w-4 h-4 bg-gray-50 rounded border border-gray-300 focus:ring-3 focus:ring-blue-300 dark:bg-gray-600 dark:border-gray-500 dark:focus:ring-blue-600 dark:ring-offset-gray-800"
required
></input>
</div>
<div class="ml-3 text-sm">
<label
for="remember"
class="font-medium text-gray-900 dark:text-gray-300"
>
Remember me
</label>
</div>
</div>
<a
href="#"
class="text-sm text-blue-700 hover:underline dark:text-blue-500"
>
Lost Password?
</a>
</div>
<button
type="submit"
class="w-full text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800"
>
Login to your account
</button>
<div class="text-sm font-medium text-gray-500 dark:text-gray-300">
Not registered?{" "}
<a
href="#"
class="text-blue-700 hover:underline dark:text-blue-500"
>
Create account
</a>
</div>
</form>
</div>
</div>
)}
</>
);
}
这是 React 的一个常见问题,可以用 react portals 解决。 尝试阅读并理解它们的工作原理,这将有助于您理解我的回答。
简短说明:首先,您必须将模态组件拆分为一个 ModalButton 和一个 Modal。然后你可以使用 ReactDOM.createPortal
函数,在其他地方渲染 Modal 组件的内容。在我的示例中,它将呈现到 body
元素而不是导航中。
return ReactDOM.createPortal(
<div>
...
</div>,
document.body
);
Here is a codesandbox 使用您的代码的详细示例。