2015-08-26 2 views
0

Это немного упрощенный пример моего текущего кода React.js.Как обновить состояние, не передавая его дочернему компоненту

https://jsfiddle.net/69z2wepo/14668/

var Main = React.createClass({ 
    getInitialState: function(){ 
     return { 
      showText: false 
     } 
    }, 
    handleClick: function(){ 
     this.setState({ 
      showText: true 
     }) 
    }, 
    render: function() { 
     return (
      <div> 
       <button onClick={this.handleClick}>Press me</button> 
       <Child showText={this.state.showText} /> 
      </div> 
     ) 
    } 
}); 

var Child = React.createClass({ 
    render: function(){ 
     if(this.props.showText){ 
      return (
       <div> 
        Pressed 
       </div> 
      ) 
     } 
     return (
      <div> 
       Default text 
      </div> 
     ) 
    } 
}); 

React.render(<Main/>, document.getElementById('container')); 

Когда я изменить showText свойство верно и передать его вниз к моему ребенку компонент, как я могу немедленно переключить showText ложь?

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

handleClick: function(){ 
    this.setState({ 
     showText: true 
    }, function(){ 
     showText: false 
    }) 
} 

Мой Main компонент должен отправить только истинные, чтобы ребенок при нажатии кнопки. В противном случае я хочу, чтобы это состояние было ложным все время.

+0

Вы хотите, чтобы перевернуть значение 'showText' на Main обратно в ложь, не вызывая изменения в опору ребенка? Итак, в основном, Ребенок будет когда-либо переходить от «По умолчанию текст» к «Нажато» и никогда не возвращается к «По умолчанию текст»? Если это так, то почему вам нужно установить 'showText' обратно на false? – Tom

ответ

0

Из того, что я могу собрать из вашего описания, то это может быть, что вы хотите: https://jsfiddle.net/4vL3mubf/2/

Компонент Ребенок никогда не изменится после первого щелчка, но это то, что я предположил, что вы хотели.

В основном Основной компонент может перевернуть состояние с помощью этой функции:

componentDidUpdate: function(prevProps, prevState) { 
    if (this.state.showText === true) { 
     this.setState({showText: false}); 
    } 
}, 

Update

Изменено скрипку с использованием Джима shouldComponentUpdate. https://jsfiddle.net/4vL3mubf/3/

+0

Я хочу, чтобы 'showText' был ложным после того, как он был отправлен в качестве истины. Когда он превращается в false, он больше не должен перерисовывать ребенка. И это проблематично, потому что 'setState()' всегда будет повторно отображать. Рабочий процесс должен выглядеть следующим образом: 'showText: false' -> кнопка нажатия нажатием кнопки ->' showText: true' -> «Прессованный» текст появляется в дочерних -> 'showText' обновлениях false, но больше не отправляет его дочернему , – PineappleChunks

+0

Посмотрите мой jsfiddle - пока он все равно отправит showText ребенку в качестве опоры (не думайте, что все равно избегать этого), ребенок будет игнорировать значение, если значение prop равно false. Использование Jim mustComponentUpdate для ребенка, вероятно, является лучшим решением для моего, поскольку это означает, что ребенок не поддерживает состояние. – Tom

0

Вызов setState на ваш родительский компонент будет вызывать функцию render огонь, который, в свою очередь, будет вновь сделать свой Child компонент также. Вам нужно только когда-нибудь понадобиться setState для вашего родителя, а остальная часть иерархии должна перерисовываться в соответствии с этим родительским состоянием.

0
var updating = false; 

var Main = React.createClass({ 
    getInitialState: function(){ 
     return { 
      showText: false 
     } 
    }, 
    handleClick: function(){ 
     updating = !updating; 
     alert('is updating: ' + updating); 
     if(updating) { 
      this.setState({ 
       showText: true 
      }); 
     } 
    }, 
    render: function() { 
     return (
      <div> 
       <button onClick={this.handleClick}>Press me</button> 
       <Child showText={this.state.showText} /> 
      </div> 
     ) 
    } 
}); 

или другой способ:

var Child = React.createClass({ 
    shouldComponentUpdate: function(nextProps, nextState) { 
     return nextProps.showText; 
    }, 
    render: function(){ 
     if(this.props.showText){ 
      return (
       <div> 
        Pressed 
       </div> 
      ) 
     } 
     return (
      <div> 
       Default text 
      </div> 
     ) 
    } 
}); 

https://jsfiddle.net/69z2wepo/14670/

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