Eu quero ler as propriedades do valor do evento onClick. Mas quando clico nele, vejo algo assim no console:
SyntheticMouseEvent {dispatchConfig: Object, dispatchMarker: ".1.1.0.2.0.0:1", nativeEvent: MouseEvent, type: "click", target
Meu código está funcionando corretamente. Quando corro, posso ver, {column}
mas não consigo, no evento onClick.
Meu código:
var HeaderRows = React.createClass({
handleSort: function(value) {
console.log(value);
},
render: function () {
var that = this;
return(
<tr>
{this.props.defaultColumns.map(function (column) {
return (
<th value={column} onClick={that.handleSort} >{column}</th>
);
})}
{this.props.externalColumns.map(function (column) {
// Multi dimension array - 0 is column name
var externalColumnName = column[0];
return ( <th>{externalColumnName}</th>);
})}
</tr>
);
}
});
Como posso passar um valor para o onClick
evento no React js?
javascript
reactjs
user1924375
fonte
fonte
Respostas:
Jeito fácil
Use uma função de seta:
Isso criará uma nova função que chama
handleSort
com os parâmetros corretos.Melhor maneira
Extraia-o em um subcomponente. O problema com o uso de uma função de seta na chamada de renderização é que ela criará uma nova função a cada vez, o que acaba causando renderizações desnecessárias.
Se você criar um subcomponente, poderá passar o manipulador e usar props como argumentos, que serão renderizados novamente somente quando os props mudarem (porque a referência do manipulador agora nunca muda):
Subcomponente
Componente principal
Maneira fácil antiga (ES5)
Use
.bind
para passar o parâmetro que você deseja:fonte
<a>
tag na qual precisa passar no evento, a fim de usar #preventDefault()
bind
.Há respostas legais aqui, e eu concordo com o Austin Greco (a segunda opção com componentes separados).
Há outra maneira que eu gosto, currying .
O que você pode fazer é criar uma função que aceite um parâmetro (seu parâmetro) e retornar outra função que aceite outro parâmetro (o evento click neste caso). então você é livre para fazer o que quiser.
ES5:
ES6:
E você o usará desta maneira:
Aqui está um exemplo completo desse uso:
Mostrar snippet de código
Observe que essa abordagem não resolve a criação de uma nova instância em cada renderização.
Eu gosto dessa abordagem em relação aos outros manipuladores embutidos, pois essa é mais concisa e legível na minha opinião.
Editar:
Conforme sugerido nos comentários abaixo, você pode armazenar em cache / memorizar o resultado da função.
Aqui está uma implementação ingênua:
Mostrar snippet de código
fonte
handleChange = param => cache[param] || (e => { // the function body })
Atualmente, com o ES6, acho que poderíamos usar uma resposta atualizada.
Basicamente, (para quem não sabe), pois
onClick
espera uma função passada para ela,bind
funciona porque cria uma cópia de uma função. Em vez disso, podemos passar uma expressão de função de seta que simplesmente chama a função que queremos e preservathis
. Você nunca precisará vincular orender
método no React, mas se por algum motivo estiver perdendothis
em um dos métodos do componente:fonte
render()
porque é chamado pelo React. Se houver alguma coisa, você precisarábind
dos manipuladores de eventos e somente quando não estiver usando setas.props
parasuper()
outhis.props
será indefinido durante o construtor, o que pode ficar confuso.foo = () => {...}
e, em seguida, referenciar em renderizar<button onClick={this.foo}...
o único motivo para incluir uma função de seta se você usar babel dessa maneira, IMO, é se você deseja capturar alguma variável que só existe no escopo do método render () (os eventos podem ser passados adiante e não se aplicam).[[h / t para @ E. Sundin por vincular isso em um comentário]
A resposta principal (funções anônimas ou ligação) funcionará, mas não é a que apresenta melhor desempenho, pois cria uma cópia do manipulador de eventos para todas as instâncias geradas pela
map()
função.Esta é uma explicação da maneira ideal de fazê-lo a partir do ESLint-plugin-react :
fonte
this.state
, você poderá trocá-lo com segurança por um SFC.Esta é a minha abordagem, não tenho certeza do quão ruim é, por favor, comente
No elemento clicável
e depois
fonte
encodeURIComponent(JSON.stringify(myObj))
e depois analisá-loJSON.parse(decodeURIComponent(myObj))
,. Para funções, tenho certeza de que isso não funcionará sem eval ou nova Function (), as quais devem ser evitadas. Por esses motivos, não uso atributos de dados para transmitir dados no React / JS.este exemplo pode ser um pouco diferente do seu. mas posso garantir que esta é a melhor solução que você pode ter para esse problema. Pesquisei por dias uma solução que não apresentava problemas de desempenho. e finalmente veio com este.
ATUALIZAR
caso você queira lidar com objetos que deveriam ser os parâmetros. você pode usar
JSON.stringify(object)
para converter em string e adicionar ao conjunto de dados.fonte
fonte
Mais uma opção que não envolve
.bind
ou o ES6 é usar um componente filho com um manipulador para chamar o manipulador pai com os acessórios necessários. Aqui está um exemplo (e um link para o exemplo de trabalho está abaixo):A idéia básica é que o componente pai passe a
onClick
função para um componente filho. O componente filho chama aonClick
função e pode acessar qualquer um que sejaprops
passado para ela (e oevent
), permitindo que você use qualquerevent
valor ou outros acessórios naonClick
função do pai .Aqui está uma demonstração do CodePen mostrando esse método em ação.
fonte
Fazendo uma tentativa alternativa de responder à pergunta do OP, incluindo chamadas e.preventDefault ():
Link renderizado ( ES6 )
Função Componente
fonte
Sei que é muito tarde para a festa, mas acho que uma solução muito mais simples pode satisfazer muitos casos de uso:
Presumo que você também possa usar um
data-
atributo.Simples, semântico.
fonte
Basta criar uma função como esta
e chame no lugar que você precisa
<Icon onClick = {() => {methodName (theParamsYouwantToPass); }} />
fonte
Você pode simplesmente fazer isso se estiver usando
ES6
.fonte
A implementação mostra a contagem total de um objeto passando a contagem como um parâmetro dos principais para os subcomponentes, conforme descrito abaixo.
Aqui está MainComponent.js
E aqui está
SubComp.js
Tente implementar acima e você obterá o cenário exato de como os parâmetros de passagem funcionam no reactjs em qualquer método DOM.
fonte
Escrevi um componente de invólucro que pode ser reutilizado para esse fim com base nas respostas aceitas aqui. Se tudo o que você precisa fazer é passar uma string, adicione um atributo de dados e leia-o em e.target.dataset (como alguns outros sugeriram). Por padrão, meu wrapper se liga a qualquer prop que é uma função e começa com 'on' e passa automaticamente a prop de dados de volta para o chamador, após todos os outros argumentos de evento. Embora eu não o tenha testado quanto ao desempenho, ele lhe dará a oportunidade de evitar a criação da classe e pode ser usado assim:
ou para componentes e funções
ou se você preferir
declarar que Fora do contêiner (próximo às importações)
Aqui está o uso em um contêiner:
Aqui está o código do wrapper 'withData.js:
fonte
Tenho abaixo 3 sugestões para isso em JSX onClick Events -
Na verdade, não precisamos usar a função .bind () ou Arrow em nosso código. Você pode usar de maneira simples no seu código.
Você também pode mover o evento onClick de th (ou ul) para tr (ou li) para melhorar o desempenho. Basicamente, você terá n número de "Ouvintes de Eventos" para o seu elemento n li.
// E você pode acessar
item.id
noonItemClick
método como mostrado abaixo:Concordo com a abordagem mencionada acima para criar o React Component separado para ListItem e List. Esse código fica bom, no entanto, se você tiver 1000 li, serão criados 1000 ouvintes de eventos. Certifique-se de que você não deve ter muitos ouvintes de eventos.
fonte
Adicionei código para o valor do evento onclick passar para o método de duas maneiras. 1 usando o método de ligação 2. usando o método de seta (=>). veja os métodos HandleSort1 e HandleSort
fonte
Abaixo está o exemplo que passa valor no evento onClick.
Eu usei a sintaxe es6. Lembre-se de que a função de seta do componente de classe não se liga automaticamente, portanto se liga explicitamente ao construtor.
fonte
Eu acho que você precisará vincular o método à instância da classe React. É mais seguro usar um construtor para vincular todos os métodos no React. No seu caso, quando você passa o parâmetro para o método, o primeiro parâmetro é usado para vincular o contexto 'this' do método, portanto, você não pode acessar o valor dentro do método.
fonte
fonte
Há uma maneira muito fácil.
fonte
fonte
Saindo do nada para esta pergunta, mas acho que
.bind
vai fazer o truque. Encontre o código de exemplo abaixo.fonte
Usando a função de seta:
Você deve instalar o estágio 2:
npm install babel-preset-stage-2:
fonte
Existem três maneiras de lidar com isso: -
Vincule o método no construtor como: -
Use a função de seta enquanto a cria como: -
A terceira maneira é esta: -
fonte
Você pode usar seu código assim:
Aqui está e para o objeto de evento, se você deseja usar métodos de evento como
preventDefault()
na função de manipulação ou deseja obter o valor de destino ou nome comoe.target.name
.fonte
Eu achei a solução de passar param como um atributo de tag bastante razoável.
No entanto, possui limitações:
Por isso, criei esta biblioteca: react-event-param
Isto:
Exemplo de uso:
fonte
Havia muitas considerações de desempenho, todas no vácuo.
O problema com esses manipuladores é que você precisa curry-los para incorporar o argumento que você não pode nomear nos adereços.
Isso significa que o componente precisa de um manipulador para cada elemento clicável. Vamos concordar que, para alguns botões, isso não é um problema, certo?
O problema surge quando você está manipulando dados tabulares com dezenas de colunas e milhares de linhas. Lá você percebe o impacto da criação de muitos manipuladores.
O fato é que eu só preciso de um.
Defino o manipulador no nível da tabela (ou UL ou OL ...) e, quando o clique ocorre, posso dizer qual foi a célula clicada usando os dados disponíveis desde o momento no objeto de evento:
Uso os campos tagname para verificar se o clique ocorreu em um elemento válido, por exemplo, ignore cliques em THs ou rodapés.
O rowIndex e cellIndex fornecem o local exato da célula clicada.
Textcontent é o texto da célula clicada.
Dessa forma, não preciso passar os dados da célula para o manipulador, ele pode fazer o autoatendimento.
Se eu precisar de mais dados, dados que não devem ser exibidos, posso usar o atributo do conjunto de dados ou elementos ocultos.
Com alguma navegação DOM simples, está tudo à mão.
Isso tem sido usado em HTML desde sempre, já que os PCs eram muito mais fáceis de entender.
fonte
Existem algumas maneiras de passar parâmetros nos manipuladores de eventos, alguns estão seguindo.
Você pode usar uma função de seta para contornar um manipulador de eventos e passar parâmetros:
O exemplo acima é equivalente a chamar
.bind
ou você pode chamar explicitamente o bind.Além dessas duas abordagens, você também pode passar argumentos para uma função definida como uma função curry.
fonte
Use um fechamento , resultando em uma solução limpa:
<th onClick={this.handleSort(column)} >{column}</th>
A função handleSort retornará uma função que já tenha a coluna de valor definida.
A função anônima será chamada com o valor correto quando o usuário clicar no th.
Exemplo: https://stackblitz.com/edit/react-pass-parameters-example
fonte
Simples alteração é necessária:
Usar
<th value={column} onClick={that.handleSort} >{column}</th>
ao invés de
<th value={column} onClick={that.handleSort} >{column}</th>
fonte