Em um componente React para um <select>
menu, preciso definir o selected
atributo na opção que reflete o estado do aplicativo.
Em render()
, o optionState
é passado do proprietário do estado para o componente SortMenu. Os valores da opção são transmitidos a partir props
do JSON.
render: function() {
var options = [],
optionState = this.props.optionState;
this.props.options.forEach(function(option) {
var selected = (optionState === option.value) ? ' selected' : '';
options.push(
<option value={option.value}{selected}>{option.label}</option>
);
});
// pass {options} to the select menu jsx
No entanto, isso dispara um erro de sintaxe na compilação JSX.
Fazer isso se livra do erro de sintaxe, mas obviamente não resolve o problema:
var selected = (optionState === option.value) ? 'selected' : 'false';
<option value={option.value} selected={selected}>{option.label}</option>
Eu também tentei isso:
var selected = (optionState === option.value) ? true : false;
<option value={option.value} {selected ? 'selected' : ''}>{option.label}</option>
Existe uma maneira recomendada de resolver isso?
javascript
reactjs
cantera
fonte
fonte
Respostas:
O React compreende automaticamente os booleanos para esse fim, para que você possa simplesmente escrever (nota: não recomendado)
e produzirá 'selecionado' adequadamente.
No entanto, o React torna isso ainda mais fácil para você. Em vez de definir
selected
cada opção, você pode (e deve) simplesmente escrevervalue={optionsState}
na própria tag select :Para mais informações, consulte o documento React select tag .
fonte
onChange={this.handleSelect}
e definir o valor do estado do seu componente, por exemplo: 'handleSelect: function () {this.setState ({value: event.target.value});} `Isso renderia novamente o componente selecionado com novos item selecionado. Espero que isso ajude você.value
suporte em um<select>
pode ser uma matriz, se você tivermultiselect
ativado.defaultValue
para inicializarVocê pode fazer o que o React avisa quando tenta definir a propriedade "selecionada" do
<option>
:Então, você pode usar
options.value
nodefaultValue
seufonte
Aqui está uma solução completa que incorpora a melhor resposta e os comentários abaixo (o que pode ajudar alguém que está lutando para juntar tudo):
ATUALIZAÇÃO PARA ES6 (2019) - usando funções de seta e destruição de objeto
no componente principal:
componente incluído (que agora é um funcional sem estado):
RESPOSTA ANTERIOR (usando ligação):
no componente principal:
componente incluído (que agora é um funcional sem estado):
o componente principal mantém o valor selecionado para a fruta (no estado), o componente incluído exibe o elemento de seleção e as atualizações são passadas de volta ao componente principal para atualizar seu estado (que volta ao componente incluído para alterar o valor selecionado).
Observe o uso de um nome prop que permite declarar um único método handleChange para outros campos no mesmo formulário, independentemente do tipo.
fonte
this.handleChange.bind(this);
deve serthis.handleChange = this.handleChange.bind(this)
;Aqui está o exemplo mais recente de como fazê-lo. Dos documentos de reação , além da sintaxe do método "fat-arrow" de ligação automática.
fonte
Basta adicionar como primeira opção a sua tag de seleção:
Isso se tornará padrão e, quando você selecionar uma opção válida, será definida em seu estado
fonte
fonte
Ocorreu um problema com as
<select>
tags que não foram atualizadas corretamente<option>
quando o estado muda. Meu problema parecia ser que, se você renderizar duas vezes em rápida sucessão, na primeira vez sem pré-selecionado,<option>
mas na segunda vez com um, a<select>
tag não será atualizada na segunda renderização, mas permanecerá no padrão primeiro.Eu encontrei uma solução para isso usando refs . Você precisa obter uma referência ao seu
<select>
nó de tag (que pode estar aninhado em algum componente) e, em seguida, atualizar manualmente avalue
propriedade nele, nocomponentDidUpdate
gancho.fonte
Postando uma resposta semelhante para MULTISELECT / optgroups:
fonte
Eu tenho uma solução simples é seguir o HTML básico.
.text-hide
é uma classe de bootstrap, se você não estiver usando o bootstrap, aqui está:fonte
Eu resolvi um problema semelhante ao definir defaultProps:
<select value="this.props.propName" ...
Portanto, agora evito erros na compilação se meu suporte não existir até a montagem.
fonte
value
suporte a um campo de formulário sem umonChange
manipulador. Isso renderizará um campo somente leitura. Se o campo deve ser mutável, usedefaultValue
. Caso contrário, definaonChange
oureadOnly
.