ReactJS提供者-->使用者访问属性时返回未定义

gjmwrych  于 2023-01-12  发布在  React
关注(0)|答案(1)|浏览(96)

你好,我有一个上下文,我试图从一个提供者传递给一个消费者。它是完美的工作,但突然停止工作。这里是我的代码的一个例子。
我有一个名为AppContext.tsx的文件,它是应用程序的根,由index.js呈现
tsx包含以下代码。

import * as React from 'react';
import { App } from './App';

interface iHigherStateOfContextProps {
username: string;
}

export const higherStateOfContext = React.createContext({} as iHigherStateOfContextProps);

interface IAppContextProps {}

interface IAppContextState {
userName: string;
}

export class AppContext extends React.Component<IAppContextProps, IAppContextState> {
    constructor(props: IAppContextProps) {
    super(props);
        this.state = {
userName:"Some Name"
}

    render() {
        return (<div>
            <higherStateOfContext.Provider value={{
                userName: this.state.userName;
            }}>
                <App />
            </higherStateOfContext.Provider>

        </div>
           
        );
    }
}

树中更靠下的使用者,我们将其称为TopBar.tsx,导出的Navigation元素从AppContext呈现的App.Tsx中调用。tsx的编码如下......
所以App.tsx看起来像这样......

import * as React from 'react';
import TopNavigation from './components/Navigation/TopBar';

export const App = function (props: {  }) { 
    const [appTitle, setAppTitle] = useState<string>("App Name");
    useEffect(() =>
    {
   }, []); 

        return (
            <div>
               {appTitle}
                <TopNavigation />
               
            </div>
        );
    //}
}

这是导入的导航/TopBar. tsx中的代码。

import * as React from 'react';
import { higherStateOfContext } from '../../AppContext';
const Navigation = () => {
    return (
    <higherStateOfContext.Consumer>
        {({  userName }) => (

            <TopBar userName={userName} />
        )}
    </higherStateOfContext.Consumer>

);
}

export default Navigation;

interface ITopBarProps {
    userName: string;

}

interface ITopsBarState {

}

class TopBar extends React.Component<ITopBarProps, ITopsBarState>   {

    constructor(props: ITopBarProps) {
        super(props);

        this.state = { };

 render() {
        return (<div>{this.props.userName}</div>); // <----- This is undefined
}
}

这个问题是,在TopBar.tsx中,消费者从AppContext提供程序返回undefined,因此不会呈现。

iq3niunx

iq3niunx1#

下面是stackblitz project示例代码,其中userName is displayed
可能其他问题来自其他地方。如果您修改导航渲染如下:

{(contextValue) => {
    console.log("contextValue", contextValue);
    return <TopBar userName={contextValue?.userName} />;
}}

你可能会看到上下文值的真实样子。

相关问题