当前位置: 首页 > 知识库问答 >
问题:

React一个对象的Native setState/useState

莘光华
2023-03-14

我对React Native是新手,不太理解对象的初始状态的概念,并且当我有多个属性要设置时更新状态。

错误(编辑#2):

Objects are not valid as a React child (found: object with keys {userRole}). If you meant to render a collection of children, use an array instead.

应用程序。js

const initialLoginState = {
    userRole: null,
    userId: null,
};

const [user, setUser] = useState(initialLoginState);
const [isReady, setIsReady] = useState(false);

const restoreUser = async () => {
    const user = await authStorage.getUser();
    if (user) setUser(user);
};

if (!isReady) {
    return (
        <AppLoading
            startAsync={restoreUser}
            onFinish={() => setIsReady(true)}
            onError={console.warn}
        />
    );
}

//render
return (
    <AuthContext.Provider value={{ user, setUser }}>
        <NavigationContainer>
            {user.userRole ? <ViewTest /> : <AuthNavigator />}
        </NavigationContainer>
    </AuthContext.Provider>
);

当我收到数据时更新用户:

const logIn = (data, authToken) => {
        setUser((prevState) => ({
            userRole: {
                ...prevState.userId, 
                userRole: data.USERROLE,
            },
        }));
        authStorage.storeToken(data.USERID);
    };

共有3个答案

百里渊
2023-03-14

在@P. hunter、@Erdenezaya和@Felkun的帮助下,我得到了正确的答案。

问题出在状态init和setUser()中。

  1. 应用程序。js
    const initialLoginState = {
        userRole: null,
        userId: null,
    };

    const [user, setUser] = useState({
        initialLoginState,
    });
    const [isReady, setIsReady] = useState(false);

    const restoreUser = async () => {
        const user = await authStorage.getUser();
        if (user) setUser(user);
    };

    if (!isReady) {
        return (
            <AppLoading
                startAsync={restoreUser}
                onFinish={() => setIsReady(true)}
                onError={console.warn}
            />
        );
    }

    //syntax error was found in {user.userRole}
    return (
        <AuthContext.Provider value={{ user, setUser }}>
            <NavigationContainer>
                {user.userRole ? <ViewTest /> : <AuthNavigator />}
            </NavigationContainer>
        </AuthContext.Provider>
    );
export default useAuth = () => {
    const { user, setUser } = useContext(AuthContext);

    const logIn = (data, authToken) => {

        setUser({ ...user, userRole: data.USERROLE });

        authStorage.storeToken(data.USERID);
    };

    const logOut = () => {
        setUser({ ...user, userRole: null });
        authStorage.removeToken();
    };

    return { user, logIn, logOut };
};

谢谢大家的帮助!

闾丘朗
2023-03-14

对象作为React子对象无效(找到:带有键{userRole}的对象)。如果要呈现子集合,请改为使用数组。

    <AuthContext.Provider value={{ user, setUser }}>  // <---- the problem is here
        <NavigationContainer>
            {user.userRole ? <ViewTest /> : <AuthNavigator />}
        </NavigationContainer>
    </AuthContext.Provider>

我不知道是什么。提供者是,但它试图将对象(用户)呈现为html元素,请确保您知道该组件的value prop接受哪种类型的数据。

子车修平
2023-03-14

在功能组件中不需要prevState。用户是设置新状态之前的状态

const logIn = (data, authToken) => {
  setUser({...user, userRole: data.USERROLE});
  authStorage.storeToken(data.USERID);
};
 类似资料:
  • 我举了一个例子: 如何设置lang1.name?当我这样做时,它不起作用: 我是新来的,我不太明白

  • 本文向大家介绍new一个对象的过程和clone一个对象的区别?相关面试题,主要包含被问及new一个对象的过程和clone一个对象的区别?时的应答技巧和注意事项,需要的朋友参考一下 new 操作符的本意是分配内存。程序执行到 new 操作符时,首先去看 new 操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构

  • 问题内容: 我正在尝试为通过map函数创建的自定义组件创建动态引用。 在返回正确的DOM节点,但在循环的那些,它返回一个对象。 有人可以指出我正确的方向吗? 问题答案: 似乎是一个连接的组件,而您实际上需要包装的组件。 与连接 然后通常添加一个引用: 从文档: 如果已传递给,则向连接的包装器组件添加一个ref实际上将返回被包装组件的实例。 与连接 然后用于获取基础的连接组件: 从文档: [with

  • 问题内容: 请帮我。我不知道为什么这段代码不起作用。 它给我一个错误:“对象作为React子对象无效(找到:带有键{itemss}的对象)。如果要渲染子对象的集合,请改用数组。” 为什么{i.title}是对象。这只是一个字符串。我怎样才能解决这个问题?以及实际上如何迭代嵌套对象? 问题答案: 问题是因为你回来了 这是的等效即 您将返回具有键和的对象。你可以写 要么 要么 PS请注意,前两种方法将

  • 我对RxJS很陌生,所以如果这个问题已经得到回答,我提前道歉。 我有一个Angular 2应用程序,在其中一个组件中有一个普通对象。我将UI绑定到这个对象。我想做的是能够捕获对这个对象的所有更改,无论它们来自代码还是来自用户更改其中一个字段。 我正在查看可观察对象,但似乎只有通过Emit方法推送新对象时,订阅者才能接收通知。例如,在属性绑定到输入字段的情况下,这将如何工作? 有更好的方法吗? 这是

  • 为什么我不能这样做? 我得到: 致命错误:常量表达式包含无效操作 这有什么办法吗?