2016-10-21 3 views
2

Это для реактивного проекта JS (jsfiddle). Текстовое поле должно обновляться с флажком с проверкой true/false, но это не так. Может кто-нибудь объяснить, почему?Не удается взаимодействовать между компонентами реакции

var AutoGenerateCheckbox = React.createClass ({ 
    getInitialState: function() { 
    return {checked: false}; 
    }, 
    update() { 
    this.state.checked = !this.state.checked; 
    alert(this.state.checked); 
    this.props.onUpdate(this.state.checked); 
    }, 
    render() { 
    return (
     <input type="checkbox" checked={this.state.checked} onChange={this.update} /> 
    ); 
    } 
}); 

var TBox = React.createClass({displayName: 'TextBox', 
    render: function() { 
    return (
     <div> 
     Checkbox value: {this.props.data} 
     </div> 
    ); 
    } 
}); 

var KApp = React.createClass({ 
    getInitialState: function() { 
    return {autoChecked: false}; 
    }, 
    handleAutogenChange: function(val) { 
    alert('handleAutogenChange:' + val); 
    this.setState({autoChecked : val}); 
    }, 
    render: function() { 
    return (
     <div> 
     <AutoGenerateCheckbox onUpdate={this.handleAutogenChange}/> 
     <TBox data={this.state.autoChecked}/> 
     </div> 
    ); 
    } 
}); 

ReactDOM.render(
    <KApp />, 
    document.getElementById('content') 
); 
+2

'this.state.checked =! This.state.checked' Почему вы изменяете состояние напрямую, не используя' setState() '? – lux

+0

@lux Потому что я только начал учиться реагировать, и я понятия не имею, что я делаю. Спасибо за подсказку, я посмотрю на setState. – KyleM

+0

Ах, круто, было смущено, так как вы использовали «setState» в другом компоненте, поэтому просто хотели, чтобы я ничего не пропустил. – lux

ответ

1

Причина вы не видите что-либо распечатаны происходит потому, что вы пытаетесь напечатать значение boolean здесь

<div> 
    Checkbox value: {this.props.data} 
</div> 

попробовать

<div> 
    Checkbox value: {this.props.data.toString()} 
</div> 

вместо этого.

В качестве дополнительного совета вам действительно не нужно удерживать состояние флажка как в своем собственном состоянии, так и в состоянии его родительского компонента. Вам действительно нужно только иметь его в состоянии родительского компонента.

Просмотреть fiddle Я сделал.

+0

Удивительное спасибо за подсказку. Логично, я думаю, что флажок управляет своим собственным значением ... так я его разработал (с родителем, управляющим взаимодействием между флажком и текстовым полем) наилучшим образом? Есть ли другая «лучшая практика»? Я продолжаю читать о refs и о многом, и я немного подавляю. – KyleM

+0

Является ли флажок правильно контролировать свое значение? Или флажок - это просто переключатель для изменения состояния вашего приложения (компонент «KApp»), который затем распространяется до его дочерних компонентов? :) О части «лучший способ», то, что вы здесь сделали, в значительной степени зависит от того, как государство должно проходить от родителя к детям. Выяснение того, где должно жить государство, является частью мышления в «реакционном пути». –

+0

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

1

Реагировать не определяют логическое значение, чтобы быть для печати информации, попробуйте вместо этого:

<div> 
    Checkbox value: {this.props.data.toString()} 
</div> 
Смежные вопросы