Tenho o seguinte 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, tudo estava bem, agora estou recebendo 1 erro, 1 aviso e tenho uma pergunta de acompanhamento:
Erro: TypeError não capturado: não é possível ler a propriedade 'otherChecked' de nulo
Aviso: getInitialState foi definido em RadioOther, uma classe JavaScript simples. Isso só é compatível com classes criadas usando React.createClass. Você quis dizer definir uma propriedade de estado em vez disso?
Alguém pode ver onde está o erro, eu sei que é devido à instrução condicional no DOM, mas aparentemente não estou declarando seu valor inicial corretamente?
Devo tornar getInitialState estático
Onde é o local apropriado para declarar meus proptypes se getInitialState não estiver correto?
ATUALIZAR:
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,
};
}
produz "Uncaught ReferenceError: this is not defined"
, e enquanto abaixo corrige isso
constructor(props) {
super(props);
this.state = {
otherChecked: false,
};
}
mas agora, clicar no outro botão agora produz o erro:
Uncaught TypeError: Cannot read property 'props' of undefined
fonte
onChange={this.onRadChange}
,this
não se refere à instância quandoonRadChange
é chamada. Você precisa retornos de chamada de bind emrender
ou fazê-lo no construtor:onChange={this.onRadChange.bind(this)}
.Respostas:
getInitialState
não é usado nas classes ES6. Em vez disso, atribuathis.state
no construtor.propTypes
deve ser uma variável de classe estática ou atribuída à classe, não deve ser atribuída a instâncias de componentes.Veja mais na documentação do React sobre classes ES6: convertendo uma função em uma classe
fonte
Uncaught TypeError: Cannot read property 'bind' of undefined
erro Alguma ideia?render
você poderia fazer algo assimonClick={this.doFoo.bind(this)}
, mas intencionalmente não incluí no código porque essa é a maneira menos eficiente de vincular, já querender
pode ser chamado com frequência e criar novas funções em cada chamada. Vou remover esse idioma da resposta.Somando-se à resposta de Ross .
Você também pode usar a nova função de seta ES6 na propriedade onChange
É funcionalmente equivalente a definir
this.onRadChange = this.onRadChange.bind(this);
no construtor, mas é mais conciso na minha opinião.No seu caso, o botão de opção será semelhante ao mostrado abaixo.
Atualizar
Este método "mais conciso" é menos eficiente que as opções mencionadas na resposta de @Ross Allen porque gera uma nova função cada vez que o
render()
método é chamadofonte
render
(que pode ser chamada várias vezes). Usando um inicializador de propriedade de classe ou vinculação no construtor, apenas uma nova função associada é criada na construção do componente e nenhuma nova função é criada duranterender
.Se estiver usando babel-plugin-transform-class-properties ou babel-preset-stage-2 (ou stage-1 ou stage-0), você pode usar esta sintaxe:
fonte