从顶级应用更改 React 上下文 class
Changing the React context from the top-level App class
我想在 Typescript 中创建异步对话框(将等待用户交互),我可以从应用程序中的任何位置添加这些对话框。现在从确认对话框开始。我在让它工作时遇到问题,因此 App
class 可以以某种方式将新对话框存储到 DialogsContext
并且 Dialogs
组件将在创建新对话框时收到通知。
我想使用我的顶级 App
class 的 showConfirmDialog
来处理对话框创建。
请注意 App
class 不是 实际的 React 组件,我不希望它是。顶层 class 控制最终呈现所有组件的整个应用程序很简单。
我该如何解决这个问题?
export class App {
public async showConfirmDialog(): Promise<boolean> {
return new Promise((resolve, reject) => {
// NOTE: This is not an actual code - unfinished
// How do I push new dialog into the confirmDialogs array in DialogsContext?
// confirmDialogs.push(<ConfirmDialog onClick={() => resolve(true)} />);
});
}
public async setup(): Promise<void> {
const React = await import('react');
const { render } = await import('react-dom');
const Dialogs = await import('./components/dialogs');
const DialogsContext = await import ("./components/context/dialogs-context");
const app = (
<DialogsContext.Provider>
<Dialogs />
</DialogsContext.Provider>
);
const rendered = render(app, document.getElementById('output'));
return rendered;
}
}
对话框-context.tsx
const DialogsContext = React.createContext({
confirmationDialogs: []
});
export default DialogsContext;
对话框-component.tsx
const Dialogs : React.FunctionComponent = props => {
const dialogs = useContext(DialogsContext);
return (
<div key="dialogs" className="dialogs">
Total dialogs: {dialogs.confirmDialogs.length}
{dialogs.confirmDialogs.map((dlg: React.ReactElement, i: number) => (
<div key={i} className="dialog">
{dlg}
</div>
))}
</div>
);
}
export default Dialogs;
我制作了这个沙箱,按照我的理解来做这些事情。
https://codesandbox.io/s/affectionate-glitter-buj6x
我想在 Typescript 中创建异步对话框(将等待用户交互),我可以从应用程序中的任何位置添加这些对话框。现在从确认对话框开始。我在让它工作时遇到问题,因此 App
class 可以以某种方式将新对话框存储到 DialogsContext
并且 Dialogs
组件将在创建新对话框时收到通知。
我想使用我的顶级 App
class 的 showConfirmDialog
来处理对话框创建。
请注意 App
class 不是 实际的 React 组件,我不希望它是。顶层 class 控制最终呈现所有组件的整个应用程序很简单。
我该如何解决这个问题?
export class App {
public async showConfirmDialog(): Promise<boolean> {
return new Promise((resolve, reject) => {
// NOTE: This is not an actual code - unfinished
// How do I push new dialog into the confirmDialogs array in DialogsContext?
// confirmDialogs.push(<ConfirmDialog onClick={() => resolve(true)} />);
});
}
public async setup(): Promise<void> {
const React = await import('react');
const { render } = await import('react-dom');
const Dialogs = await import('./components/dialogs');
const DialogsContext = await import ("./components/context/dialogs-context");
const app = (
<DialogsContext.Provider>
<Dialogs />
</DialogsContext.Provider>
);
const rendered = render(app, document.getElementById('output'));
return rendered;
}
}
对话框-context.tsx
const DialogsContext = React.createContext({
confirmationDialogs: []
});
export default DialogsContext;
对话框-component.tsx
const Dialogs : React.FunctionComponent = props => {
const dialogs = useContext(DialogsContext);
return (
<div key="dialogs" className="dialogs">
Total dialogs: {dialogs.confirmDialogs.length}
{dialogs.confirmDialogs.map((dlg: React.ReactElement, i: number) => (
<div key={i} className="dialog">
{dlg}
</div>
))}
</div>
);
}
export default Dialogs;
我制作了这个沙箱,按照我的理解来做这些事情。 https://codesandbox.io/s/affectionate-glitter-buj6x