2016-08-09 1 views
-1

Как я могу получить глобальную переменную в компоненте, к которому все методы имеют к нему доступ? Я не могу использовать состояние, потому что у меня есть вложенный рендеринг и, изменяя состояние переменной, я получаю предупреждение о том, что рендер должен быть чистым и не использовать setState внутри рендеринга ....! Поэтому мне нужно иметь регулярную глобальную переменную, доступную всеми методами компонента, и иметь возможность изменять ее значение там, где это необходимо. Кто-нибудь может мне помочь?Глобальная переменная в Reactjs

P.S. Почему я не должен менять такое состояние: this.state.variable = true;?

Так вот мой упрощенный код. this.setState({hidden: true}); сделает предупреждение, потому что этот компонент выполняет рендеринг внутри другого компонента. Мне нужно сделать hidden, чтобы вести себя как глобальная переменная и не использовать состояние!

const Component = React.createClass({ 
    mixins: [React.addons.PureRenderMixin], 
    getInitialState: function() { 
     return {hidden: false}; 
    }, 

    renderFixedFields(.....) { 
     var request_link; 
     if (!this.state.hidden) { 
      request_link = <Link to={`/${record.get('id')}/request`}>Send Request </Link> 
     } 
     else { 
      request_link = null 
     } 
     return (
      <div> 
       {request_link} 
      </div> 
      ) 
    }, 

    renderField(.....) { 
     var self = this; 
     //.... 
     if (fieldID == "open_access") { 
      this.setState({hidden: true}); 
     } 
     return (
      //..... 
     ); 
    }, 

    renderFieldBlock(........) { 
     const [maj, min] = getMajMinFields(s); 
     //.... 
     const minFields = min.entrySeq().map(
      ([id, f]) => this.renderField(fieldID, .....)); 

     return (
      //... 
      <div> 
       { minorFields } 
      </div> 
     ); 
    }, 
} 
+0

и где 'fieldID' установлен? –

+0

@chasenyc Обновлен вопрос. 'renderFieldBlock' отправляет' fieldID' как аргумент 'renderField' – Birish

ответ

0

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

componentWillReceiveProps: function(nextProps) { 
    this.setState({ 
    likesIncreasing: nextProps.likeCount > this.props.likeCount 
    }); 
} 
+0

@ chasenyc: мне нужно иметь логическую переменную, чтобы иметь возможность изменять ее несколько раз внутри разных методов. Он не переходит ни к какому другому компоненту, поэтому он не является опорой. Но mixins (AFAIU) предназначены только для изменения реквизита, верно? – Birish

+0

Можете ли вы немного рассказать о том, чего вы пытаетесь достичь? При каких обстоятельствах вы хотите, чтобы это логическое значение изменилось? –

+0

@ chasenyc: Я попытался сделать лето своего кода и обновил свой вопрос. надеюсь, что это поможет сделать мою проблему понятной. – Birish

Смежные вопросы