【发布时间】:2020-10-19 19:05:00
【问题描述】:
我正在开发一个用于 React 练习的 Twitch 克隆应用程序,并且我正在为用户想要删除视频流时创建一个模式弹出窗口。基本上他们有一个流列表,他们单击其中一个流上的删除按钮,然后使用ReactDOM.createPortal打开一个模式
这里是删除按钮
import React from "react";
import Modal from "../Modal";
const StreamDelete = () => {
return (
<>
<Modal />
</>
);
};
export default StreamDelete;
这是模态的代码
import React from "react";
import ReactDOM from "react-dom";
import { Redirect } from "react-router-dom";
const Modal = () => {
return ReactDOM.createPortal(
<div
className="ui dimmer modals visible active"
onClick={ () => {
return <Redirect to="/" />;
} }
>
<div className="ui standard modal visible active">
<div className="header">Delete Stream</div>
<div className="content">
Are you sure you want to delete this stream?
</div>
<div className="actions">
<button className="ui primary button">Delete</button>
<button className="ui button">Cancel</button>
</div>
</div>
</div>,
document.querySelector("#modal")
);
};
export default Modal;
这个modal只能在React-Router Route上查看/streams/:id/delete
我的预期行为是,当我单击深色背景时,我的 onClick 函数应该返回 <Redirect to="/">,因此应该关闭模态窗口,因为它没有在该路径中呈现。
我得到的行为是单击深色背景没有重定向,尽管我也没有收到任何错误。
有关其他上下文,此项目的 GIT 存储库位于此处Glitch Client
到目前为止,我对这个项目的所有部分都有大量的注释Ncoughlin: Tag Twitch Clone
【问题讨论】:
-
Redirect组件不是这样工作的,它需要作为可渲染 JSX 的一部分返回,而不是作为onClick回调的返回值。如果您能够访问history路由属性,或将其传递给模式,那么您可以强制发出导航。或者,您可以创建一些应该发生重定向的组件状态并有条件地呈现Redirect。您能否提供路由器代码,以便我们查看StreamDelete是如何呈现的? -
是的,路由器在这里可用:App.js
-
出于本文ncoughlin:programmatic navigationncoughlin:programmatic navigation 中的原因,我特别试图避免手动触摸历史道具
-
是的。但是您从 onClick 返回重定向而不是示例从渲染返回重定向。
-
避免使用
history属性来发出导航操作作为副作用,而不是Route或Redirect组件似乎完全取决于意见。 IMO 他们都有自己的有效用例,完全使用其中一个或另一个将导致奇怪的代码模式(如下所示),您需要先保存一些状态,等待组件更新和重新渲染,然后 导航。这是一个浪费的渲染周期。那篇文章已有 2 年多的历史了,react 组件现在有了效果的概念,这不一定与总是先更新 some 状态才能做任何事情保持一致。
标签: javascript reactjs react-router react-portal