У меня есть следующий компонент ( radioOther.jsx
):
'use strict';
//module.exports = <-- omitted in update
class RadioOther extends React.Component {
// omitted in update
// getInitialState() {
// propTypes: {
// name: React.PropTypes.string.isRequired
// }
// return {
// otherChecked: false
// }
// }
componentDidUpdate(prevProps, prevState) {
var otherRadBtn = this.refs.otherRadBtn.getDOMNode();
if (prevState.otherChecked !== otherRadBtn.checked) {
console.log('Other radio btn clicked.')
this.setState({
otherChecked: otherRadBtn.checked,
});
}
}
onRadChange(e) {
var input = e.target;
this.setState({
otherChecked: input.checked
});
}
render() {
return (
<div>
<p className="form-group radio">
<label>
<input type="radio"
ref="otherRadBtn"
onChange={this.onRadChange}
name={this.props.name}
value="other"/>
Other
</label>
{this.state.otherChecked ?
(<label className="form-inline">
Please Specify:
<input
placeholder="Please Specify"
type="text"
name="referrer_other"
/>
</label>)
:
('')
}
</p>
</div>
)
}
};
До использования ECMAScript6 все было хорошо, теперь я получаю 1 ошибку, 1 предупреждение, и у меня есть следующий вопрос:
Ошибка: Uncaught TypeError: невозможно прочитать свойство otherChecked с нулевым значением
Предупреждение: getInitialState был определен в RadioOther, простом классе JavaScript. Это поддерживается только для классов, созданных с помощью React.createClass. Вы хотели вместо этого определить государственную собственность?
Может ли кто-нибудь увидеть, в чем заключается ошибка, я знаю, что это связано с условным выражением в DOM, но, по-видимому, я неправильно объявляю его начальное значение?
Должен ли я сделать getInitialState статическим
Где подходящее место для объявления моих проптипов, если getInitialState неверен?
ОБНОВИТЬ:
RadioOther.propTypes = {
name: React.PropTypes.string,
other: React.PropTypes.bool,
options: React.PropTypes.array }
module.exports = RadioOther;
@ssorallen, этот код:
constructor(props) {
this.state = {
otherChecked: false,
};
}
производит "Uncaught ReferenceError: this is not defined"
, а ниже исправляет это
constructor(props) {
super(props);
this.state = {
otherChecked: false,
};
}
но теперь нажатие другой кнопки вызывает ошибку:
Uncaught TypeError: Cannot read property 'props' of undefined
источник
onChange={this.onRadChange}
,this
она не обращается к экземпляру приonRadChange
вызове. Вы должны связать обратные вызовы вrender
или сделать это в конструкторе:onChange={this.onRadChange.bind(this)}
.Ответы:
getInitialState
не используется в классах ES6. Вместо этого назначьтеthis.state
в конструкторе.propTypes
должна быть статической переменной класса или назначаться классу, она не должна назначаться экземплярам компонентов.См. Дополнительную информацию в документации React о классах ES6: преобразование функции в класс
источник
Uncaught TypeError: Cannot read property 'bind' of undefined
error Любые идеи?render
вы можете сделать что-то подобноеonClick={this.doFoo.bind(this)}
, но я намеренно не включил это в код, потому что это наименее эффективный способ привязки, поскольку онrender
может вызываться часто и создавать новые функции при каждом вызове. Я уберу этот язык из ответа.Добавление к ответу Росс .
Вы также можете использовать новую стрелочную функцию ES6 в свойстве onChange
Функционально это эквивалентно определению
this.onRadChange = this.onRadChange.bind(this);
в конструкторе, но, на мой взгляд, более лаконично.В вашем случае переключатель будет выглядеть так, как показано ниже.
Обновить
Этот «более краткий» метод менее эффективен, чем параметры, упомянутые в ответе @Ross Allen, потому что он генерирует новую функцию при каждом
render()
вызове метода.источник
render
(которая может вызываться много раз). Используя инициализатор свойства класса или привязку в конструкторе, при построении компонента создается только одна новая привязанная функция, и во время нее новые функции не создаютсяrender
.Если вы используете babel-plugin-transform-class-properties или babel-preset-stage-2 (или stage-1, или stage-0), вы можете использовать этот синтаксис:
источник