2016-10-07 2 views
2

Я смущен, почему React настаивает на том, чтобы я дал своим управляемым компонентам ввода текста собственное внутреннее состояние. Я следил за официальной документацией для создания управляемого ввода, и React кричит на меня через консоль:Почему я не могу передать состояние через реквизиты в контролируемый текстовый компонент?

* warning.js: 36 Предупреждение: ClientInfoTextInput меняет неконтролируемый ввод текста типа, который нужно контролировать. Элементы ввода не должны переключаться с неконтролируемого на управляемый (или наоборот). Решите, используя управляемый или неконтролируемый входной элемент для времени жизни компонента.

render() { 
 
    return (
 
     <input type="text" 
 
     className={styles.ClientInfoTextInput} 
 
     value={this.props.propToPass} 
 
     onChange={this.props.propMethodToPass} 
 
     /> 
 
    )

Так почему я не могу пройти вниз состояние через реквизита к входной компонент, управляемый без Реагировать расстраиваться?

+0

Трудно сказать, не в полной мере отображаемый код компонента. Имя компонента ClientInfoTextInput? Если это так, я думаю, ваша проблема в том, что при инициализации «this.props.propToPass» не определено. Вы можете сделать проверку для undefined, а затем передать значение по умолчанию, если оно есть. –

+0

Пожалуйста, покажите весь файл, это облегчит нам понимание того, что происходит. Скорее всего, то, что сказал @ericg, - это ваша проблема, но мы не будем знать, пока не увидим больше. – finalfreq

ответ

3

Это трудно отладить компонент, не видя полный код, но один из способов передачи вниз состояние с помощью реквизита к входной компонент, управляемый следующим образом: http://codepen.io/PiotrBerebecki/pen/bwLjaE

class App extends React.Component { 
    constructor() { 
    super(); 
    this.state = { 
     textInParent: '' 
    }; 
    this.handleTextFromChild = this.handleTextFromChild.bind(this); 
    } 

    handleTextFromChild(data) { 
    this.setState({ 
     textInParent: data 
    }); 
    } 

    render() { 
    return (
     <div> 
     <InputForm propMethodToPass={this.handleTextFromChild} 
        propToPass={this.state.textInParent} /> 
     </div> 
    ); 
    } 
} 


class InputForm extends React.Component { 
    render() { 
    return (
     <div> 
     <input type="text" 
       value={this.props.propToPass} 
       onChange={(event) => this.props.propMethodToPass(event.target.value)} /> 
     <p>Text received from Parent via props: {this.props.propToPass}</p> 
     </div> 
    ); 
    } 
} 


ReactDOM.render(
    <App />, 
    document.getElementById('app') 
); 
+0

Sneetsches, вы мне что-нибудь ответили или это даст вам решение? –

+0

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

+0

Я, как правило, консультируюсь с документами React и поддерживаю состояние пользовательского интерфейса. Также это может быть полезно для ваших соображений: https://facebook.github.io/react/tips/props-in-getInitialState-as-anti-pattern.html, где они объясняют, что «это не анти-шаблон, если вы делаете ясно, что prop - это только данные семян для внутреннего состояния компонента ». Смотрите также здесь: http://spraso.com/managing-react-controlled-component-state/ –

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