Estou brincando com o React.js pela primeira vez e não consigo encontrar uma maneira de mostrar ou ocultar algo em uma página via evento click. Como não estou carregando nenhuma outra biblioteca para a página, estou procurando uma maneira nativa usando a biblioteca React. É isso que eu tenho até agora. Gostaria de mostrar a div de resultados quando o evento click for acionado.
var Search= React.createClass({
handleClick: function (event) {
console.log(this.prop);
},
render: function () {
return (
<div className="date-range">
<input type="submit" value="Search" onClick={this.handleClick} />
</div>
);
}
});
var Results = React.createClass({
render: function () {
return (
<div id="results" className="search-results">
Some Results
</div>
);
}
});
React.renderComponent(<Search /> , document.body);
javascript
reactjs
user1725382
fonte
fonte
Respostas:
Reagir por volta de 2020
No
onClick
retorno de chamada, chame a função setter do gancho de estado para atualizar o estado e renderizar novamente:JSFiddle
Reagir por volta de 2014
A chave é atualizar o estado do componente no manipulador de cliques usando
setState
. Quando as alterações de estado são aplicadas, orender
método é chamado novamente com o novo estado:JSFiddle
fonte
fonte
Aqui está uma sintaxe alternativa para o operador ternário:
é equivalente a:
Magra porque
Também sintaxe alternativa com
display: 'none';
No entanto, se você usar demais
display: 'none'
, isso leva à poluição do DOM e, finalmente, diminui a velocidade do seu aplicativo.fonte
Aqui está a minha abordagem.
No código acima, para conseguir isso, estou usando um código como:
Isso renderizará
SomeElement
apenas seopened
for verdadeiro. Funciona devido à maneira como o JavaScript resolve as condições lógicas:Razões para usar essa abordagem em vez de CSS 'display: none';
<TabView>
) forem alterados - mesmo que você veja apenas uma guia, todas as 5 guias serão renderizadas novamentedisplay: invisible ? 'block' : 'none'
que pode quebrar o layoutsomeBoolean && <SomeNode />
é muito simples de entender e raciocinar, especialmente se sua lógica relacionada à exibição de algo ou não se torna complexafonte
this.setState({isOpened: !isOpened});
. Não dependa do próprio estado, quando você modifica o estado. Aqui está um bom exemplo: reactjs.org/docs/... Assim deve ser:this.setState( s => ({isOpened: !s.isOpened}) )
. Observe a função de seta dentro de setState.com a versão mais recente react 0.11, você também pode retornar nulo para que nenhum conteúdo seja renderizado.
Renderizando para null
fonte
Eu criei um pequeno componente que lida com isso para você: react-toggle-display
Ele define o atributo de estilo como
display: none !important
baseado emhide
oushow
props.Exemplo de uso:
fonte
Já existem várias ótimas respostas, mas não acho que tenham sido explicadas muito bem e vários dos métodos fornecidos contêm algumas dicas que podem enganar as pessoas. Então, vou abordar as três principais maneiras (mais uma opção fora do tópico) para fazer isso e explicar os prós e os contras. Estou escrevendo principalmente porque a Opção 1 foi muito recomendada e há muitos problemas em potencial com essa opção, se não for usada corretamente.
Opção 1: renderização condicional no pai.
Não gosto desse método, a menos que você só renderize o componente uma vez e o deixe lá. O problema é que isso fará com que o reagir crie o componente do zero toda vez que você alternar a visibilidade. Aqui está o exemplo. LogoutButton ou LoginButton estão sendo renderizados condicionalmente no LoginControl pai. Se você executar isso, notará que o construtor está sendo chamado a cada clique do botão. https://codepen.io/Kelnor/pen/LzPdpN?editors=1111
Agora, o React é muito rápido na criação de componentes a partir do zero. No entanto, ele ainda precisa chamar seu código ao criá-lo. Portanto, se seu código de construtor, componentDidMount, render, etc for caro, diminuirá significativamente a exibição do componente. Isso também significa que você não pode usá-lo com componentes com estado em que deseja que o estado seja preservado quando oculto (e restaurado quando exibido.) A única vantagem é que o componente oculto não é criado, até que seja selecionado. Portanto, componentes ocultos não atrasarão o carregamento da sua página inicial. Também pode haver casos em que você QUER que um componente com estado seja redefinido quando alternado. Nesse caso, esta é sua melhor opção.
Opção 2: renderização condicional no filho
Isso cria os dois componentes uma vez. Em seguida, provoque um curto-circuito no restante do código de renderização se o componente estiver oculto. Você também pode causar um curto-circuito em outras lógicas em outros métodos usando o suporte visível. Observe o console.log na página codepen. https://codepen.io/Kelnor/pen/YrKaWZ?editors=0011
Agora, se a lógica de inicialização for rápida e os filhos estiverem sem estado, você não verá uma diferença no desempenho ou na funcionalidade. No entanto, por que fazer o React criar um novo componente a cada alternância? Se a inicialização for cara, a Opção 1 a executará toda vez que você alternar um componente que diminuirá a velocidade da página ao alternar. A opção 2 executará todas as entradas do componente no carregamento da primeira página. Abrandando a primeira carga. Deve notar novamente. Se você está apenas mostrando o componente uma vez com base em uma condição e não o está alternando, ou deseja que seja redefinido quando alternado, a opção 1 é boa e provavelmente a melhor opção.
Se o carregamento lento da página for um problema, significa que você tem um código caro em um método de ciclo de vida e isso geralmente não é uma boa ideia. Você pode, e provavelmente deveria, resolver o carregamento lento da página movendo o código caro dos métodos do ciclo de vida. Mova-o para uma função assíncrona iniciada por ComponentDidMount e faça com que o retorno de chamada o coloque em uma variável de estado com setState (). Se a variável state for nula e o componente estiver visível, faça com que a função render retorne um espaço reservado. Caso contrário, renderize os dados. Dessa forma, a página será carregada rapidamente e preencherá as guias à medida que forem carregadas. Você também pode mover a lógica para o pai e enviar os resultados aos filhos como acessórios. Dessa forma, você pode priorizar quais guias serão carregadas primeiro. Ou armazene em cache os resultados e execute a lógica apenas na primeira vez que um componente é mostrado.
Opção 3: ocultação de classe
Ocultar classes é provavelmente o mais fácil de implementar. Como mencionado, você acabou de criar uma classe CSS com display: none e atribuir a classe com base em prop. A desvantagem é que todo o código de cada componente oculto é chamado e todos os componentes ocultos são anexados ao DOM. (A opção 1 não cria os componentes ocultos. A opção 2 provoca um curto-circuito no código desnecessário quando o componente está oculto e remove o componente do DOM completamente.) Parece que é mais rápido alternar a visibilidade de acordo com alguns testes feitos por comentaristas. outras respostas, mas não posso falar com isso.
Opção 4: Um componente, mas altere Adereços. Ou talvez nenhum componente e cache de HTML.
Este não funcionará para todos os aplicativos e está fora de tópico porque não se trata de ocultar componentes, mas pode ser uma solução melhor para alguns casos de uso do que ocultar. Digamos que você tenha abas. Pode ser possível escrever um React Component e apenas usar os acessórios para alterar o que é exibido na guia. Você também pode salvar o JSX nas variáveis de estado e usar um suporte para decidir qual JSX retornar na função de renderização. Se o JSX precisar ser gerado, faça-o, armazene-o em cache no pai e envie o correto como suporte. Ou gere no filho e armazene em cache no estado do filho e use adereços para selecionar o ativo.
fonte
Esta é uma boa maneira de fazer uso do DOM virtual :
Exemplo aqui
Usando ganchos React:
Exemplo aqui
fonte
this.setState()
deve depender do estado .Você define um valor booleano no estado (por exemplo, 'show)' e depois faz:
fonte
As práticas recomendadas estão abaixo de acordo com a documentação:
Renderize o elemento somente quando o estado for válido.
fonte
fonte
fonte
Começo com esta declaração da equipe React:
Você basicamente precisa mostrar o componente quando o botão é clicado, você pode fazê-lo de duas maneiras, usando o React puro ou o CSS, usando o React puro, você pode fazer algo como o código abaixo no seu caso, portanto, na primeira execução, resultados não está mostrando como
hideResults
estátrue
, mas clicando no botão, o estado mudará ehideResults
estáfalse
e o componente será renderizado novamente com as novas condições de valor, esse é um uso muito comum da alteração da exibição do componente no React ...Se você quiser estudar mais sobre renderização condicional no React, dê uma olhada aqui .
fonte
Exemplo simples de ocultar / mostrar com React Hooks: (srry about no fiddle)
fonte
Se você gostaria de ver como alternar a exibição de um componente, confira este violino.
http://jsfiddle.net/mnoster/kb3gN/16387/
fonte
Um método simples para mostrar / ocultar elementos no React usando Hooks
Agora, vamos adicionar alguma lógica ao nosso método de renderização:
E
Bom trabalho.
fonte
Em alguns casos, o componente de ordem superior pode ser útil:
Crie um componente de ordem superior:
Estenda seu próprio componente:
Então você pode usá-lo assim:
Isso reduz um pouco de clichê e impõe aderência às convenções de nomenclatura; no entanto, lembre-se de que o MyComp ainda será instanciado - a maneira de omitir foi mencionada anteriormente:
{ !hidden && <MyComp ... /> }
fonte
Use o módulo rc-if-else
fonte
Uma maneira poderia ser usar o React
ref
e manipular a classe CSS usando a API do navegador. Seu benefício é evitar a renderização novamente no React se o único objetivo é ocultar / mostrar algum elemento DOM com o clique de um botão.PS Corrija-me se estiver errado. :)
fonte
Se você usar o bootstrap 4, poderá ocultar o elemento dessa maneira
fonte
Isso também pode ser alcançado assim (maneira muito fácil)
fonte
este exemplo mostra como você pode alternar entre componentes usando uma alternância que alterna após cada 1 segundo
fonte
Use esta sintaxe enxuta e curta:
fonte
Aí vem a solução simples, eficaz e melhor com um Componente de reação sem classe para mostrar / ocultar os elementos. Uso de React-Hooks, disponível no projeto create-react-app mais recente que usa o React 16
Happy Coding :)
fonte
fonte
Você pode usar o arquivo css
e no arquivo css
fonte
fonte
fonte
fonte
const
vez devar
quando declarar constantes.