Eu tenho um problema, que não tenho idéias, como resolver. No meu componente de reação, exibo uma longa lista de dados e alguns links na parte inferior. Depois de clicar em qualquer um desses links, preencheu a lista com uma nova coleção de links e preciso rolar para o topo.
O problema é - como rolar para o topo após a renderização da nova coleção?
'use strict';
// url of this component is #/:checklistId/:sectionId
var React = require('react'),
Router = require('react-router'),
sectionStore = require('./../stores/checklist-section-store');
function updateStateFromProps() {
var self = this;
sectionStore.getChecklistSectionContent({
checklistId: this.getParams().checklistId,
sectionId: this.getParams().sectionId
}).then(function (section) {
self.setState({
section,
componentReady: true
});
});
this.setState({componentReady: false});
}
var Checklist = React.createClass({
mixins: [Router.State],
componentWillMount: function () {
updateStateFromProps.call(this);
},
componentWillReceiveProps(){
updateStateFromProps.call(this);
},
render: function () {
if (this.state.componentReady) {
return(
<section className='checklist-section'>
<header className='section-header'>{ this.state.section.name } </header>
<Steps steps={ this.state.section.steps }/>
<a href=`#/${this.getParams().checklistId}/${this.state.section.nextSection.Id}`>
Next Section
</a>
</section>
);
} else {...}
}
});
module.exports = Checklist;
React.useEffect(() => { window.scrollTo(0, 0); }, []);
Observe que você também pode importar o useEffect diretamente:import { useEffect } from 'react'
Como a solução original foi fornecida para a versão muito inicial do react , aqui está uma atualização:
fonte
ReactDOM.findDOMNode(this).scrollTop = 0
this is undefined in arrow functions
está incorreto. A esta palavra-chave é ligada ao mesmo contexto que a função vedante developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...Você poderia usar algo assim. ReactDom é para react.14. Apenas reaja de outra maneira.
Atualização 11/11/2019 para React 16+
fonte
componentDidMount
é outra alternativa.Em React Routing, há o problema de que, se redirecionarmos para a nova rota, ela não o levará automaticamente ao topo da página.
Até eu tive o mesmo problema.
Acabei de adicionar uma única linha ao meu componente e funcionou como manteiga.
Consulte: reagir treinamento
fonte
Isso poderia e provavelmente deveria ser tratado usando refs :
Código de exemplo:
fonte
<div ref={(ref) => this._div = ref} />
primeiro na<div>
minha declaração de renderização. O restante da minha renderização permanece exatamente o mesmo.<div ref="main">
e depoisthis.refs.main.scrollTop=0
Você pode fazer isso no roteador assim:
O
onUpdate={() => window.scrollTo(0, 0)}
colocar o topo da rolagem. Para mais informações, consulte: link codepenfonte
/somePage/:imgId
, ela rolará para cima :(. Qualquer forma de "controlar" se deve ou não ser acionada o evento onUpdate em rotas / parâmetros específicos?onUpdate
não existe nos objetos do HashRouter ... Se alguém encontrar o mesmo problema: acabei usando a solução ScrollToTop descrita mais abaixo (e nos documentos do roteador de reação) que funcionou perfeitamente para mim.Para aqueles que usam ganchos, o código a seguir funcionará.
Observe que você também pode importar o useEffect diretamente:
import { useEffect } from 'react'
fonte
[]
segundo parâmetro significa que isso só acontecerá na primeira renderização, você já tentou sem?Aqui está outra abordagem que permite escolher em quais componentes montados você deseja redefinir a posição de rolagem da janela sem duplicar em massa o ComponentDidUpdate / ComponentDidMount.
O exemplo abaixo está agrupando o componente Blog com ScrollIntoView (), para que, se a rota for alterada quando o componente Blog estiver montado, o ComponentDidUpdate do HOC atualizará a posição de rolagem da janela.
Você pode facilmente envolvê-lo em todo o aplicativo, para que, em qualquer mudança de rota, ele acione uma redefinição da janela.
ScrollIntoView.js
Routes.js
O exemplo acima funciona muito bem, mas se você migrou para
react-router-dom
, poderá simplificar o acima, criando umHOC
que envolva o componente.Mais uma vez, você também pode facilmente envolvê-lo em suas rotas (basta alterar o
componentDidMount
método para ocomponentDidUpdate
código de exemplo do método escrito acima, bem como empacotarScrollIntoView
comwithRouter
).containers / ScrollIntoView.js
components / Home.js
fonte
Esta é a única coisa que funcionou para mim (com um componente de classe ES6):
fonte
Estou usando o componente ScrollToTop do react-router, código descrito nos documentos do react-router
https://reacttraining.com/react-router/web/guides/scroll-restoration/scroll-to-top
Estou mudando o código em um único arquivo de rotas e depois disso não há necessidade de alterar o código em todos os componentes.
Código de exemplo -
Etapa 1 - crie o componente ScrollToTop.js
Etapa 2 - No arquivo App.js, adicione o Componente ScrollToTop após
<Router
fonte
Solução de gancho :
fonte
Usando ganchos em componentes funcionais, assumindo que o componente seja atualizado quando houver uma atualização nos acessórios de resultado
fonte
use
Todas as opções acima não funcionaram para mim - não sei por que, mas:
funcionou, em que HEADER é o ID do meu elemento de cabeçalho
fonte
Se tudo o que queremos é algo simples, aqui está uma solução que funcionará para todos
adicione esta mini função
chame a função da seguinte forma no rodapé da página
se você quiser adicionar estilos legais, aqui está o css
fonte
Estou usando o React Hooks e queria algo reutilizável, mas também algo que eu pudesse chamar a qualquer momento (e não apenas após a renderização).
Então, para usar o gancho, você pode:
fonte
Se você estiver fazendo isso para celular , pelo menos com o chrome, verá uma barra branca na parte inferior.
Isso acontece quando a barra de URL desaparece. Solução:
Documentos do desenvolvedor do Google
fonte
Nenhuma das respostas acima está funcionando para mim. Acontece que
.scrollTo
não é tão amplamente compatível quanto.scrollIntoView
.Em nosso App.js,
componentWillMount()
adicionamosEsta é a única solução que está funcionando universalmente para nós. root é o ID do nosso aplicativo. O comportamento "suave" não funciona em todos os navegadores / dispositivos. O tempo limite do 777 é um pouco conservador, mas carregamos muitos dados em todas as páginas; portanto, ao testar isso era necessário. Um 237 mais curto pode funcionar para a maioria dos aplicativos.
fonte
Eu me deparei com esse problema criando um site com o Gatsby, cujo Link é construído sobre o Reach Router. Parece estranho que seja uma modificação que precisa ser feita, e não o comportamento padrão.
Enfim, tentei muitas das soluções acima e a única que realmente funcionou para mim foi:
Coloquei isso em um useEffect, mas você poderia colocá-lo com a mesma facilidade em componentDidMount ou acioná-lo da maneira que desejasse.
Não sei por que o window.scrollTo (0, 0) não funcionaria para mim (e para outros).
fonte
Todas as soluções falam sobre adicionar o pergaminho
componentDidMount
oucomponentDidUpdate
com o DOM.Eu fiz tudo isso e não funcionou.
Então, descobri alguma outra maneira que funciona muito bem para mim.
Eu também encontrei sobre alguns ScrollRestoration , mas agora sou preguiçoso. E por enquanto vamos mantê-lo da maneira "DidUpdate".
Espero que ajude!
esteja a salvo
fonte
Este código causará um comportamento suave no pergaminho :
Você pode passar outros parâmetros dentro da scrollIntoView (). A sintaxe a seguir pode ser usada:
alignToTop Opcional É um valor booleano:
scrollIntoViewOptions Opcional É um objeto com as seguintes propriedades:
Mais detalhes podem ser encontrados aqui: MDN docs
fonte
Nenhuma das respostas acima está funcionando para mim. Acontece que
.scrollTo
não é tão amplamente compatível quanto.scrollIntoView
.Em nosso App.js,
componentWillMount()
adicionamosEsta é a única solução que está funcionando universalmente para nós.
root
é o ID do nosso aplicativo. O comportamento "suave" não funciona em todos os navegadores / dispositivos. O tempo limite do 777 é um pouco conservador, mas carregamos muitos dados em todas as páginas; portanto, ao testar isso era necessário. Um 237 mais curto pode funcionar para a maioria dos aplicativos.fonte
Se eu assumir que você está processando um capítulo, digamos, um livro por página, tudo o que você precisa fazer é adicionar isso ao seu código. Isso funcionou para mim como mágica.
Com isso, você não precisa criar uma referência no componente que está sendo renderizado.
fonte
Isto é o que eu fiz:
fonte
Você pode usar, isso funciona para mim.
fonte
Algo assim funcionou para mim em um componente:
Então, em qualquer função que esteja lidando com atualizações:
fonte
Nada funcionou para mim, mas:
fonte