Tengo el siguiente componente ( 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>
)
}
};
Antes de usar ECMAScript6 todo estaba bien, ahora recibo 1 error, 1 advertencia y tengo una pregunta de seguimiento:
Error: no detectado TypeError: no se puede leer la propiedad 'otherChecked' de null
Advertencia: getInitialState se definió en RadioOther, una clase de JavaScript simple. Esto solo es compatible con las clases creadas con React.createClass. ¿Quería definir una propiedad estatal en su lugar?
¿Alguien puede ver dónde se encuentra el error, sé que se debe a la declaración condicional en el DOM, pero aparentemente no estoy declarando su valor inicial correctamente?
¿Debo hacer getInitialState estático?
¿Dónde está el lugar apropiado para declarar mis proptypes si getInitialState no es correcto?
ACTUALIZAR:
RadioOther.propTypes = {
name: React.PropTypes.string,
other: React.PropTypes.bool,
options: React.PropTypes.array }
module.exports = RadioOther;
@ssorallen, este código:
constructor(props) {
this.state = {
otherChecked: false,
};
}
produce "Uncaught ReferenceError: this is not defined"
, y mientras que a continuación corrige que
constructor(props) {
super(props);
this.state = {
otherChecked: false,
};
}
pero ahora, hacer clic en el otro botón ahora produce un error:
Uncaught TypeError: Cannot read property 'props' of undefined
fuente
onChange={this.onRadChange}
,this
no se refiere a la instancia cuandoonRadChange
se llama. Es necesario que las devoluciones de llamada se unen enrender
o hacerlo en el constructor:onChange={this.onRadChange.bind(this)}
.Respuestas:
getInitialState
no se utiliza en las clases de ES6. En su lugar, asignethis.state
en el constructor.propTypes
debe ser una variable de clase estática o asignada a la clase, no debe asignarse a instancias de componentes.Vea más en la documentación de React sobre las clases ES6: Convertir una función en una clase
fuente
Uncaught TypeError: Cannot read property 'bind' of undefined
error ¿Alguna idea?render
que podría hacer algo comoonClick={this.doFoo.bind(this)}
, pero no lo incluí intencionalmente en el código porque esa es la forma menos eficiente de vincular, ya querender
se puede llamar a menudo y crearía nuevas funciones en cada llamada. Eliminaré ese lenguaje de la respuesta.Añadiendo a la respuesta de Ross .
También puede usar la nueva función de flecha ES6 en la propiedad onChange
Es funcionalmente equivalente a definir
this.onRadChange = this.onRadChange.bind(this);
en el constructor, pero es más conciso en mi opinión.En su caso, el botón de opción se verá como el siguiente.
Actualizar
Este método "más conciso" es menos eficiente que las opciones mencionadas en la respuesta de @Ross Allen porque genera una nueva función cada vez
render()
que se llama al métodofuente
render
(que podría llamarse muchas veces). Al usar un inicializador de propiedad de clase o un enlace en el constructor, solo se crea una nueva función vinculada en la construcción del componente y no se crean nuevas funciones duranterender
.Si está utilizando babel-plugin-transform-class-properties o babel-preset-stage-2 (o stage-1, o stage-0), puede usar esta sintaxis:
fuente