Nano Hash - криптовалюты, майнинг, программирование

Объекты недопустимы как дочерние объекты React. Если вы хотели отобразить коллекцию дочерних элементов, используйте вместо этого массив. ошибка

Я пытаюсь передать объект user в качестве значения моего React Context.Provider, как в <UserContext.Provider value={user} />. Однако React не любит идею передачи объектов как дочерних. Вот сообщение об ошибке, которое я получаю:

Ошибка: объекты недопустимы как дочерние объекты React (найдено: объект с ключами {id, username, first_name, last_name, email, avatar}). Если вы хотели отобразить коллекцию дочерних элементов, используйте вместо этого массив.

Надеюсь, кто-нибудь сможет помочь. Вот мой компонент 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 моему провайдеру контекста. Почему? Как я могу это решить?

Вдобавок вот мой <Context.Consumer />:

  <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>

  • Если у вас есть новый вопрос, задайте его как новый вопрос, а не полностью заменяйте старый вопрос. Похоже, вы повторно использовали один и тот же пост для ряда вопросов с тех пор, как установили награду ... 19.10.2020
  • Извините, но вы не можете просто переработать вопросы. Мы создаем долговременное хранилище вопросов и ответов на них, чтобы будущие посетители могли извлечь из этого пользу. На ваш исходный вопрос было дано два ответа, и вместе они составляют единое целое, над чем вы работали вместе с ответившими. Пожалуйста, не аннулируйте их усилия, удалив исходный вопрос. Мы откатили сообщение до последнего правильного состояния и удалили награду. 20.10.2020

Ответы:


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>;
}
14.10.2020

2

CodeSandbox: 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;
14.10.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..