“对象作为 React 子级无效。如果您要渲染一组子级,请改用数组。”错误

Posted

技术标签:

【中文标题】“对象作为 React 子级无效。如果您要渲染一组子级,请改用数组。”错误【英文标题】:"Objects are not valid as a React child. If you meant to render a collection of children, use an array instead." error 【发布时间】:2021-01-02 00:39:27 【问题描述】:

我正在尝试将 user 对象作为我的 React Context.Provider 的值传递给 <UserContext.Provider value=user />。然而,React 不喜欢将对象作为子对象传递的想法。这是我收到的错误消息:

错误:对象作为 React 子对象无效(找到:带键的对象 id、用户名、名字、姓氏、电子邮件、头像)。如果你打算 渲染一组孩子,使用数组代替。

我希望有人可以提供帮助。这是我的 React 组件,所有这些都发生在这里:

class MyApp extends App 
  constructor(props) 
    super(props);
    this.state = 
      user: ,
      authenticating: false,
    ;
  

  logout = () => 
    ...
  ;

  render() 
    const  Component, pageProps  = this.props;
    const user = 
      user: this.state.user,
      logout: this.logout,
    ;
    return (
      <>
        !this.state.authenticating && (
          <UserContext.Provider value=user>
            <Navbar />
            <Component ...pageProps />
          </UserContext.Provider>
        )
      </>
    );
  

有趣的是,当我改变时

const user = 
  user: this.state.user,
  logout: this.logout,
;

到(例如)

const user = 
  username: this.state.user.username,
  logout: this.logout,
;

一切都很好。

所以(正如上面的错误消息所暗示的那样)问题在于将this.state.user 传递给我的上下文提供程序。为什么?我该如何解决这个问题?

另外,这是我的&lt;Context.Consumer /&gt;

  <UserContext.Consumer>
    user => (
      <>
        user.user ? (
          <>
            <Avatar user=user.user />
            <Button onClick=user.logout>Logout</Button>
          </>
        ) : (
          <>
            <Nav.Link href="/users/login">Log in</Nav.Link>
            <Nav.Link href="/users/signup">Sign up</Nav.Link>
          </>
        )
      </>
    )
  </UserContext.Consumer>

【问题讨论】:

如果您有新问题,请将其作为新问题提出,而不是完全替换旧问题。自从您设置赏金以来,您似乎一直在针对一系列问题重复使用同一个帖子... 抱歉,您不能只回收问题帖子。我们正在建立一个持久的问题及其答案库,供未来的访问者从中受益。您的原始问题已收到两个答案,它们共同构成一个整体,这是您与回答者一起合作完成的。请不要通过删除原始问题来使 他们的 努力无效。我们已将帖子回滚到上次正确的状态并取消了赏金。 【参考方案1】:

替换

function Avatar( user ) 
  return <Nav.Link href="/users/login">user</Nav.Link>;

function Avatar( user ) 
  return <Nav.Link href="/users/login">user.something</Nav.Link>;

【讨论】:

【参考方案2】:

代码沙盒: https://codesandbox.io/s/trusting-rubin-7rcc8

您很可能试图像这样呈现上下文,这会导致错误,而不是解构上下文/用户对象。

// this results in
// Objects are not valid as a React child (found: object with
// keys username, age). If you meant to render a collection of 
// children, use an array instead.

<Consumer>
(ctx) => (
<>
 ctx.user
</>
)
</Consumer>

App.js

import React from "react";
import UserState,  Consumer  from "./UserState";

const Avatar = ( user ) => (
  <>
    <div>user.username</div>
    <div>user.age</div>
  </>
);

const UserData = () => 
  return (
    <Consumer>
      (ctx) => (
        <>
          ctx.user && (
            <>
              <Avatar user=ctx.user />
            </>
          )
        </>
      )
    </Consumer>
  );
;

export default function App() 
  const userState = 
    user: 
      username: "hi",
      age: 18
    
  ;

  return (
    <UserState.Provider value=userState>
      <UserData />
    </UserState.Provider>
  );

UserState.js

import React from "react";

const UserState = React.createContext();

export default UserState;

export const  Consumer  = UserState;

【讨论】:

以上是关于“对象作为 React 子级无效。如果您要渲染一组子级,请改用数组。”错误的主要内容,如果未能解决你的问题,请参考以下文章