为了更改Typescript中来自Consumer的上下文,设置什么作为Provider的值?

特蕾莎修女

我正在尝试学习如何在React中使用钩子和上下文,但是需要使用TypeScript(以及它的新功能)。

我的用例是授权:用户已登录或未登录,并且具有角色(例如,“管理员”,“超级管理员”)。根据其授权状态,导航栏的呈现方式会有所不同。

除其他外,我尝试遵循示例,以简化我的需求。

到目前为止,这是我的上下文和提供者:

import React, { createContext, useContext, Context, FC SetStateAction, useState } from 'react';

export interface IAuth {
    loggedIn: boolean,
    role: string
}

export const AuthContext = React.createContext<IAuth>({
    loggedIn: false,
    role: ''
});

const AuthProvider: FC = ({children}) => {

    const [auth, setAuth] = useState({
        loggedIn: false,
        role: ''
    });

    return (
        <AuthContext.Provider value={/*What to set as value?*/}>
            {children}
        </AuthContext.Provider>
    )

}

export default AuthProvider;

然后是我的NavBar,它使用了上下文的Consumer:

class Nav extends React.Component {

    render() {

        return (

            <AuthContext.Consumer>
                {context => (
                    < div >
                       .. stuff ...
                        </div>
                        <ul className="nav">
                            {context.loggedIn ? (
                                <Fragment> .. links .. </Fragment>
                            ) : (<Fragment> .. links .. </Fragment>
                            )}
                        </ul>
                    </div>

                )
                }
            </AuthContext.Consumer>

        )
    }
} export default Nav;

如果我将提供者的值设置为这样,则所有这些工作正常:

<AuthContext.Provider value={{
    loggedIn: false,
    role: 'someRole'
}}>

但是,我也想提供该setAuth功能,以便从Login组件等更改这些值。

使用以下命令给我错误:

<EmailContext.Provider value={[state, setState]}>

Type '({ loggedIn: boolean; role: string; } | Dispatch<SetStateAction<{ loggedIn: boolean; role: string; }>>)[]' is missing the following properties from type 'IAuth': loggedIn, role

使用以下内容也会给我错误:

   <AuthContext.Provider value={{data: auth,
                                    updateAuth: () => { setAuth({... auth, loggedIn: true})}
        }}>

错误data: authType '{ data: { loggedIn: boolean; role: string; }; updateAuth: () => void; }' is not assignable to type 'IAuth'. Object literal may only specify known properties, and 'data' does not exist in type 'IAuth'.

我尝试过的其他其他事情也有类似的错误。

这些都是打字稿错误。如何set以与Typescript兼容的方式设置提供程序的值-并包括操作而不只是值?

阿萨夫·阿维夫(Asaf Aviv)

首先定义一个接口,其中包含应通过上下文传递的所有内容

export interface IAuth {
    loggedIn: boolean;
    role: string;
    logIn: () => void;
    logOut: () => void;
}

然后提供者

export const AuthContext = React.createContext<IAuth>(null);

const AuthProvider: FC = ({ children }) => {
    const [auth, setAuth] = useState({
        loggedIn: false,
        role: ""
    });

    const logIn = () => {
        setAuth(prevState => ({
            ...prevState,
            loggedIn: true
        }));
    };

    const logOut = () => {
        setAuth(prevState => ({
            ...prevState,
            loggedIn: false
        }));
    };

    return (
        <AuthContext.Provider
            // Here as value you need to pass the same interface as IAuth
            // You can also just pass setAuth and do whatever you want
            // from the children
            value={{ 
                ...auth,
                logIn,
                logOut
            }}>
            {children}
        </AuthContext.Provider>
    );
};

然后,在您的使用者中,您可以使用useContext钩子来访问值

const Child: FC = () => {
    const { loggedIn, role, logIn, logOut } = useContext(AuthContext);

    return (
        <div>
            <p>{`loggedIn: ${loggedIn}`}</p>
            <p>{`role: ${role}`}</p>
            <button onClick={logIn}>logIn</button>
            <button onClick={logOut}>logOut</button>
        </div>
    );
};

最后将渲染ChildAuthProvider

const App: FC = () => (
    <AuthProvider>
        <Child />
    </AuthProvider>
);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么来自父上下文的更改会自动转到子上下文?

来自分类Dev

什么是 PyCharm 2018.02 中更改列表的跟踪上下文

来自分类Dev

如何更改功能组件中的上下文值?

来自分类Dev

是否在从React中相同上下文派生的Provider实例之间共享上下文值?

来自分类Dev

扩展按钮类中的上下文意味着什么?什么是上下文的默认值?

来自分类Dev

在React中设置默认上下文

来自分类Dev

在Angular中设置上下文范围

来自分类Dev

在JavaScript中更改“ this”的上下文

来自分类Dev

在$ .each()中更改上下文

来自分类Dev

react-redux provider的上下文实例支持什么?

来自分类Dev

来自上下文的tFTPConnection设置密码不起作用

来自分类Dev

我不明白为什么使用set属性设置在构造函数的执行上下文中定义的值不会更改该值

来自分类Dev

什么设置导致 ContextLoaderListener 的(根上下文)成为 DispatcherServlet 上下文的“父”上下文?

来自分类Dev

更新来自类组件的React上下文值

来自分类Dev

在 Ionic React 中的页面更改后,如何更改上下文的值而不重置它?

来自分类Dev

设置上下文属性值的函数为空但有效。为什么?

来自分类Dev

为什么保存受管对象上下文更改为isDeleted值?

来自分类Dev

将状态上下文作为附加方法参数嵌入状态中的利弊是什么?

来自分类Dev

为什么将绑定数据上下文设置为控件的数据上下文?

来自分类Dev

使用 TypeScript、功能组件和钩子在 React 上下文提供程序中设置状态

来自分类Dev

使用来自 Activity 的上下文从 Adapter 类中的 Viewholder 创建对象 - 没有为“上下文”传递值

来自分类Dev

从React上下文API中的列表中删除记录后,无法设置道具值

来自分类Dev

Django:来自上下文的数据未显示在模板中

来自分类Dev

为什么要在 Corda off node 中设置序列化上下文?

来自分类Dev

在RPM .spec中设置SELinux上下文的正确方法是什么?

来自分类Dev

为什么“等待”更改WinForms program.cs中的线程上下文

来自分类Dev

如何从上下文设置用户字段值?

来自分类Dev

React&TypeScript:避免上下文默认值

来自分类Dev

UIBezierPath设置上下文

Related 相关文章

  1. 1

    为什么来自父上下文的更改会自动转到子上下文?

  2. 2

    什么是 PyCharm 2018.02 中更改列表的跟踪上下文

  3. 3

    如何更改功能组件中的上下文值?

  4. 4

    是否在从React中相同上下文派生的Provider实例之间共享上下文值?

  5. 5

    扩展按钮类中的上下文意味着什么?什么是上下文的默认值?

  6. 6

    在React中设置默认上下文

  7. 7

    在Angular中设置上下文范围

  8. 8

    在JavaScript中更改“ this”的上下文

  9. 9

    在$ .each()中更改上下文

  10. 10

    react-redux provider的上下文实例支持什么?

  11. 11

    来自上下文的tFTPConnection设置密码不起作用

  12. 12

    我不明白为什么使用set属性设置在构造函数的执行上下文中定义的值不会更改该值

  13. 13

    什么设置导致 ContextLoaderListener 的(根上下文)成为 DispatcherServlet 上下文的“父”上下文?

  14. 14

    更新来自类组件的React上下文值

  15. 15

    在 Ionic React 中的页面更改后,如何更改上下文的值而不重置它?

  16. 16

    设置上下文属性值的函数为空但有效。为什么?

  17. 17

    为什么保存受管对象上下文更改为isDeleted值?

  18. 18

    将状态上下文作为附加方法参数嵌入状态中的利弊是什么?

  19. 19

    为什么将绑定数据上下文设置为控件的数据上下文?

  20. 20

    使用 TypeScript、功能组件和钩子在 React 上下文提供程序中设置状态

  21. 21

    使用来自 Activity 的上下文从 Adapter 类中的 Viewholder 创建对象 - 没有为“上下文”传递值

  22. 22

    从React上下文API中的列表中删除记录后,无法设置道具值

  23. 23

    Django:来自上下文的数据未显示在模板中

  24. 24

    为什么要在 Corda off node 中设置序列化上下文?

  25. 25

    在RPM .spec中设置SELinux上下文的正确方法是什么?

  26. 26

    为什么“等待”更改WinForms program.cs中的线程上下文

  27. 27

    如何从上下文设置用户字段值?

  28. 28

    React&TypeScript:避免上下文默认值

  29. 29

    UIBezierPath设置上下文

热门标签

归档