我正在尝试使用Portal,但是当我用包裹时,我得到未定义不是对象错误,基本上,门户网站使您可以在应用中移动组件等,而无需再次重新渲染。这是我在应用程序中遇到的错误,但我不知道为什么!错误:TypeError:未定义不是对象(评估PortalContext> PortalContext> Provider
PortalContext.tsx
import * as React from 'react'
export default PortalContext = React.createContext({
gates: {},
teleport: (gateName: string, element: JSX.Element) => {
return
}
})
PortalProvider.tsx
import * as React from 'react'
import { PortalContext } from './PortalContext'
interface IProps {
children: JSX.Element
}
class PortalProvider extends React.Component<IProps> {
public state = {
gates: {}
}
public render() {
const { children } = this.props
return (
<PortalContext.Provider value={{ gates: this.state.gates, teleport:
this.teleport }}>
{children}
</PortalContext.Provider>
)
}
private teleport = (gateName: string, element: JSX.Element) =>
this.setState({ gates: { ...this.state.gates, [gateName]: element }
})
}
export default PortalProvider
PortalGate.tsx
import * as React from 'react'
import { PortalContext } from './PortalContext'
function PortalGate(props: {
gateName: string
children?: (teleport: (gateName: string, element: JSX.Element) =>
void) => JSX.Element
}) {
const { gateName, children } = props
return (
<PortalContext.Consumer>
{value => {
return (
<React.Fragment>
{value.gates[gateName]}
{children && children(value.teleport)}
</React.Fragment>
)
}}
</PortalContext.Consumer>
)
}
export default PortalGate
app.js
import * as React from 'react'
import PortalProvider from './PortalProvider'
export default class App extends React.Component{
public render() {
return (
<PortalProvider>
<App/>
</PortalProvider>
)
}
}
发生这种情况是因为您默认导出上下文并将其与命名导入一起使用。
因此,更改此行:
import { PortalContext } from './PortalContext'
至:
import PortalContext from './PortalContext'