Ссылаться на переменную вне компонента в React?

#javascript #reactjs

#javascript #reactjs

Вопрос:

Это может показаться глупым вопросом, но мне любопытно, возможно ли это (рекомендуется). Рассмотрим следующее:

 export default class Example extends Component {

  constructor(props){
    super(props);

    this._variable = value;
  }

  render() {
    return (<div>{this.props.children}</div>);
  }
}
  

Теперь я знаю, что могу передать this._variable дочерним элементам так, чтобы:

 this._childrenWithProps = React.Children.map(this.props.children,
    (child) => React.cloneElement(child, {
        variable:   this._variable,
    })
);
  

Теперь у любого дочернего элемента есть доступ this.props.variable . Но (и я не совсем понимаю эту концепцию) могу ли я использовать контекст или что-то похожее, чтобы иметь возможность:

 // In another component some where ... 
render() {
  // reference variable (this._variable, or variable) here

  <Example>
    // Children here ...
  </Example>
}
  

для этого используется контекст? Или я делаю что-то ужасно неправильное? по сути, я хочу ссылаться на this._variable вне элемента, но установить его внутри элемента. Возможно ли это?

Комментарии:

1. redux я думаю, это может вам помочь.

2. Я хочу сделать это с помощью сторонних библиотек. Если возможно. @SteevePitis

Ответ №1:

Да, вы можете использовать context для передачи переменной всем потомкам компонента, но, как общее эмпирическое правило, вам следует избегать использования context, если он вам абсолютно не нужен. Контекст нарушает шаблон потока данных React и, как правило, затрудняет чтение кода, поскольку реквизиты могут быть неявными, а не явными. Согласно документам:

Использование контекста затруднит понимание вашего кода, поскольку делает поток данных менее понятным. Это похоже на использование глобальных переменных для передачи состояния через ваше приложение.

Обычно контекст лучше всего подходит для таких вещей, как информация о теме, и он также полезен в некоторых библиотеках маршрутизации. Обычно есть лучший способ передачи данных (ваш cloneElement React.Children пример on отлично подходит и является довольно распространенным фрагментом кода, который вы найдете во многих проектах React).

Если вы все еще хотите использовать context после этого предупреждения, вам нужно будет внести некоторые коррективы в компонент, который предоставляет контекст (обычно оболочку), и компоненты, которые получают контекст.

Вашему поставщику контекста нужна getChildContext функция, которая возвращает объект контекста, который вы хотите сделать доступным для всех его дочерних элементов. Вам также нужно будет объявить, что childContextTypes это такое, как свойство класса.

 class Example extends Component {

  getChildContext() {
    return { variable: 'foo' };
  }

  render() {
    return (<div>{this.props.children}</div>);
  }
}

Example.childContextTypes = {
  variable: React.PropTypes.string
};
  

Затем везде, где вы определяете компоненты, которые будут передаваться как дочерние, которые вы хотите получить в контексте, вам нужно будет добавить то же childContextTypes свойство. Он будет иметь доступ к контексту через this.context объект.

 class Child extends Component {

  render() {
    return (<div>{this.context.variable}</div>);
  }
}

Child.childContextTypes = {
  variable: React.PropTypes.string
};
  

childContextTypes Необходимо написать. Как вы можете видеть, использование контекста не всегда означает меньшее количество кода.