2016-06-04 6 views
1

Я пытаюсь написать простой компонент React, который подсчитывает количество символов, введенных в текстовое поле. Компонент визуализируется отлично, но когда я пытаюсь ссылаться на this.state, компонент разбивается, и экран пуст.My React Component разбивается, когда я использую this.state

Вот код:

HTML:

<div id="content"> 

</div> 

CSS:

#content { 
    width: 800px; 
    margin-left: auto; 
    margin-right: auto; 
} 

body { 
    background-color: #F1FAEE; ; 
} 

h1 { 
    font-family: Avenir; 
    color: black; 
    font-size: 44px; 
} 

JavaScript:

class Box extends React.Component { 

    getInitialState() { 
    return { 
     text: this.props.text 
    } 
    } 

    handleChange(event) { 
    this.setState({ 
     text: event.target.value 
    }) 
    } 

    render() { 
    return (
     <div> 
     <h1>This App Counts Letters</h1> 
     <textarea value = {this.props.text} onChange = {this.handleChange}> </textarea> 
     <h1>{this.state.text.length}</h1> 
     </div> 
    ); 
    } 
}; 

ReactDOM.render(<Box text = "I find this frustrating"/>,document.getElementById("content")) 

вопрос с {this.state.text. длина} вещей делают, если эта строка заменяется на {} this.props.text.length

+0

Вы пытались отладить? очевидно, что 'this.state.text' либо не определено, либо не имеет свойства' length'. Кроме того, неясно, что означает «перерывы». Обычно, если вы открываете консоль браузера, вы можете увидеть ошибку, чтобы избежать публикации таких вопросов. – akonsu

ответ

2

React ES6 классы уже не надо в getInitialState() функцию, вам нужно использовать функцию constructor, чтобы установить начальное состояние:

constructor(props) { 
    super(props); 
    this.state = {text: props.text}; 
} 

https://facebook.github.io/react/docs/reusable-components.html#es6-classes

Или вернуться к React.createClass()

+0

Спасибо за понимание! Я был очень расстроен этим скриптом. – WriterState

0

Существовали несколько заметок, чтобы сделать так, я просто хочу, чтобы переписать и комментарий, как я иду.

Я не тестировал его, но это должно сработать.

class Box extends React.Component { 

    // getInitialState() {} should be replaced in ES6 with: 
    constructor(props) { 
    super(props); 
    this.state = { 
     text: props.text 
    } 
    } 

    // This looks good. 
    handleChange(event) { 
    this.setState({ 
     text: event.target.value 
    }) 
    } 

Значение Textarea элемента находится между <textarea> и </textarea>. Не сохраняется как атрибут «значение», как вы его первоначально.

Далее, это значение должно быть STATE, а не PROPS, поскольку оно необходимо обновить.

И, наконец, у вас, вероятно, проблемы, потому что в handleChange this не связан правильно. Я заменил его на «() => this.handleChange()», потому что жирная стрелка в ES6 (=>) исправит это для вас.

render() { 
    return (
     <div> 
     <h1>This App Counts Letters</h1> 
     <textarea onChange = {() => this.handleChange()}>{this.state.text}</textarea> 
     <h1>{this.state.text.length}</h1> 
     </div> 
    ); 
    } 
}; 

ReactDOM.render(<Box text = "I find this frustrating"/>,document.getElementById("content")) 
+0

Это было очень полезно! Спасибо, что щедро. – WriterState

+0

Функция стрелки, похоже, не решила проблему. Однако я нашел другое решение, предоставленное кем-то, и это решение должно было использовать this.handleChange = this.handlChange.bind (this) в функции конструктора. Мне потребовалось некоторое время, чтобы понять, что делает метод привязки, но теперь кажется ясным ... atm haha – WriterState

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

  • Нет связанных вопросов^_^