Eu sou novo no ReactJS, desculpe se isso soa errado. Eu tenho um componente que cria várias linhas da tabela de acordo com os dados recebidos.
Cada célula da coluna possui uma caixa de seleção de rádio. Portanto, o usuário pode selecionar um site_name
e um address
das linhas existentes. A seleção deve ser mostrada no rodapé. E é aí que eu estou preso.
var SearchResult = React.createClass({
render: function(){
var resultRows = this.props.data.map(function(result){
return (
<tbody>
<tr>
<td><input type="radio" name="site_name" value={result.SITE_NAME}>{result.SITE_NAME}</input></td>
<td><input type="radio" name="address" value={result.ADDRESS}>{result.ADDRESS}</input></td>
</tr>
</tbody>
);
});
return (
<table className="table">
<thead>
<tr>
<th>Name</th>
<th>Address</th>
</tr>
</thead>
{resultRows}
<tfoot>
<tr>
<td>chosen site name ???? </td>
<td>chosen address ????? </td>
</tr>
</tfoot>
</table>
);
}
});
No jQuery, eu poderia fazer algo como $("input[name=site_name]:checked").val()
obter a seleção de um tipo de caixa de seleção de rádio e inseri-lo na primeira célula do rodapé.
Mas certamente deve haver uma maneira Reactjs, da qual estou sentindo falta totalmente? Muito Obrigado
input
elementos não têm conteúdo. Portanto,<input>content</input>
não faz sentido e é inválido. Você pode querer<label><input />content</label>
.Respostas:
Quaisquer alterações na renderização devem ser alteradas por meio de
state
ouprops
( reagir doc ).Então, aqui, registro o evento da entrada e altero o
state
, que acionará a renderização para mostrar no rodapé.jsbin
fonte
}, this);
logo abaixo do</tbody>
. O que é isso e o que isso faz? Percebi sem que o código falha.this
é o contexto passado para amap
função . Foi a edição de @FakeRainBrigand, boa captura! Sem ele o seuthis
na função mapa irá se referir aowindow
, que não tem idéia do que ostate
é sobrethis
truque é desnecessário se você usar uma seta ES6 em vez de uma função regular. Por exemplo:var resultRows = this.props.data.map((result) => { ... });
eu apenas mencionei isso porque os Reacters geralmente já estão usando alguma forma de transpilação (para JSX); portanto, o ES6 geralmente é de fácil alcance.onInputChange (e) {this.setState({ [e.target.name]: e.target.value }); }
Aqui está uma maneira mais simples de implementar botões de opção em react js.
Editado
Você pode usar a função de seta em vez de encadernação. Substitua o código acima como
<div onChange={event => this.setGender(event)}>
Para um valor padrão
defaultChecked
, use como estefonte
.bind(this)
que criará uma nova função sempre. Isso significa que, ao reagir, verifica se alguma coisa mudou no DOM virtual, esse componente sempre será diferente e sempre precisará ser renderizado novamente.name
suporte. Ambos estão envolvidos em uma div que possui oonChange
manipulador conforme descrito nesta resposta. Eu clico no primeiro rádio, um evento é disparado. Eu clico no segundo rádio, um evento é disparado. Na terceira vez em diante, no entanto, nenhum evento é disparado. Por quê?Com base no que o React Docs diz :
Por exemplo:
Link para o exemplo: https://codesandbox.io/s/6l6v9p0qkr
Inicialmente, nenhum dos botões de opção é selecionado, assim
this.state
como um objeto vazio, mas sempre que o botão de opção é selecionadothis.state
obtém uma nova propriedade com o nome da entrada e seu valor. É fácil verificar se o usuário selecionou algum botão de opção como:EDITAR:
Com a versão 16.7-alpha do React, existe uma proposta para algo chamado
hooks
que permitirá que você faça esse tipo de coisa mais fácil:No exemplo abaixo, existem dois grupos de botões de opção em um componente funcional. Ainda assim, eles têm entradas controladas:
Exemplo de trabalho: https://codesandbox.io/s/6l6v9p0qkr
fonte
Faça o componente de rádio como componente burro e passe adereços para os pais.
fonte
Apenas uma idéia aqui: quando se trata de entradas de rádio no React, eu costumo renderizá-las de uma maneira diferente que foi mencionada nas respostas anteriores.
Se isso puder ajudar qualquer pessoa que precise renderizar muitos botões de opção:
fonte
checked={ this.state.gender === value }
. Componentes funcionais não têmthis
.fonte
Clicar em um botão de opção deve acionar um evento que:
self.props.selectionChanged(...)
No primeiro caso, a mudança de estado acionará uma nova renderização e você poderá fazer
<td>chosen site name {this.state.chosenSiteName} </td>
no segundo caso, a origem do retorno de chamada atualizará as coisas para garantir que, posteriormente, sua instância SearchResult tenha escolhidoSiteName e o endereçoAddress definido em seus props.
fonte
Para aproveitar a resposta de ChinKang, disse que tenho uma abordagem mais seca e, em es6, para os interessados:
exceto que este teria um valor verificado padrão.
fonte
Também fiquei confuso no rádio, na implementação da caixa de seleção. O que precisamos é ouvir o evento de alteração do rádio e depois definir o estado. Fiz um pequeno exemplo de seleção de gênero.
fonte
Pessoal de bootstrap, fazemos assim:
fonte