Передача компонента в значение React setState

У меня есть приложение Meteor, использующее React. Я добавил переменные сеанса и хочу передать новое значение сеанса (которое будет другим компонентом React) в другой компонент реакции.

Пользователь щелкнет p-тег в SideNav и сбросит сеанс на компонент React.

Компонент SideNav:

import React from 'react';
import { Session } from 'meteor/session';
import SonataContent from './sonata-content';

export default () => {
  injectSonataText = () => {
    const sonataContent = <SonataContent/>;
    Session.set('MainContent', sonataContent); /* Set Session value to component */
  };

  return (
    <div className = "side-nav">
      <h2>Explore</h2>
      <p onClick = {this.injectSonataText.bind(this)}><i className = "material-icons">child_care</i><span>&nbsp;Sonatas</span></p>
    </div>
  )
}

В MainWindow Tracker.autorun повторно запускается и устанавливает состояние для компонента и отображает новое значение состояния.

Компонент главного окна:

import React from 'react';
import { Session } from 'meteor/session';
import { Tracker } from 'meteor/tracker';


export default class MainWindow extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      text: ""
    }
  }

  componentDidMount() {
    this.mainWindowTracker = Tracker.autorun(() => {
      const text = Session.get('MainContent');
      this.setState({text: text});
  });
}

  componentWillUnmount() {
    this.mainWindowTracker.stop();
  }

  render() {
    return (
      <p>{this.state.text}</p>
    )
  }
}

Я получаю сообщение об ошибке «Неизменяемое нарушение: объекты недопустимы в качестве дочерних элементов React». Это вызвано компонентом, используемым в setState? Есть ли способ сделать это?

возьмите this.state.text из return и console.info сразу после рендеринга вне return. Что это

Omar 26.03.2018 19:58

На самом деле он печатается как неопределенный. Хм.

flimflam57 26.03.2018 20:11

Если я console.info сам компонент, я получаю объект. Если я console.info значение сеанса, я получаю {key: null, ref: null, props: {}, _owner: null, _store: {}}. Если я console.info this.state.text в ManiWindow, я получаю undefined.

flimflam57 26.03.2018 20:20

Ответ - прекратить использовать сеанс - это означает, что вы пытаетесь сделать что-то не так! Вам необходимо реализовать компонент-оболочку вокруг ваших двух основных / побочных компонентов, которые могут управлять самим «состоянием» с помощью соответствующих методов («setState»), используя стандартный подход каскадных свойств для значений и обратных вызовов функций, устанавливающих состояние.

Andy Lorenz 26.03.2018 23:34

@ Энди Вы абсолютно правы. У сеансов есть своя польза, но это не одна из них.

flimflam57 27.03.2018 00:37
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
5
929
1

Ответы 1

Функция набора сеансов принимает значение EJSON-совместимый объект, которое, как мне кажется, может не работать с React Object.

Однако я бы попробовал (правда, только догадываться):

injectSonataText = () => {
  Session.set('MainContent', SonataContent); /* Set Session value to component */
};

...

export default class MainWindow extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      Component: null,
    }
  }

  componentDidMount() {
    this.mainWindowTracker = Tracker.autorun(() => {
      const MainContent = Session.get('MainContent');
      this.setState({Component: MainContent});
  });
}

  componentWillUnmount() {
    this.mainWindowTracker.stop();
  }

  render() {
    const { Component } = this.state;
    return (
      <p>
        {
          Component && <Component />
        }
      </p>
    )
  }
}

Не могу заставить это работать. console.infoging SonataContent показывает "function () {return React.createElement (" div ", null," Injected Sonata component ");}"

flimflam57 26.03.2018 21:16

Другие вопросы по теме