Eu quero chamar um método exposto por um componente React da instância de um Elemento React.
Por exemplo, neste jsfiddle . Eu quero chamar o alertMessage
método da HelloElement
referência.
Existe uma maneira de fazer isso sem precisar escrever invólucros adicionais?
Editar (código copiado do JSFiddle)
<div id="container"></div>
<button onclick="onButtonClick()">Click me!</button>
var onButtonClick = function () {
//call alertMessage method from the reference of a React Element! Something like HelloElement.alertMessage()
console.log("clicked!");
}
var Hello = React.createClass({displayName: 'Hello',
alertMessage: function() {
alert(this.props.name);
},
render: function() {
return React.createElement("div", null, "Hello ", this.props.name);
}
});
var HelloElement = React.createElement(Hello, {name: "World"});
React.render(
HelloElement,
document.getElementById('container')
);
Respostas:
Existem duas maneiras de acessar uma função interna. Um nível de instância, como você deseja, outro nível estático.
Instância
Você precisa chamar a função no retorno de
React.render
. Ver abaixo.Estático
Dê uma olhada em ReactJS Statics . Observe, no entanto, que uma função estática não pode acessar dados no nível da instância, e
this
deveriaundefined
.Então faça
HelloRendered.alertMessage()
.fonte
ref
que é uma função chamada com a instância como um parâmetro. Isso também permite que você acesse objetos que não estão no nível superior, por exemplo, se você estiver renderizando,<MuiThemeProvider><Hello ref={setHelloRef} /></MuiThemeProvider>
obterá a referência correta passada para suasetHelloRef
função em vez de uma para elaMuiThemeProvider
.Você pode fazer como
Agora, de fora deste componente, você pode chamar assim abaixo
fonte
Eu fiz algo assim:
E então em outro lugar:
Não testei esse código exato, mas segue as linhas do que fiz em um projeto meu e funciona muito bem :). Claro que este é um exemplo ruim, você deve apenas usar adereços para isso, mas no meu caso o subcomponente fez uma chamada de API que eu queria manter dentro desse componente. Nesse caso, esta é uma boa solução.
fonte
this.cowCallbacks.say('moo')
this
para callback (que será uma instância do Cow) em vez decallbacks
.Com o
render
método potencialmente substituindo o valor retornado, a abordagem recomendada agora é anexar uma referência de retorno de chamada ao elemento raiz. Como isso:que podemos acessar usando window.helloComponent, e qualquer um de seus métodos pode ser acessado com window.helloComponent.METHOD.
Aqui está um exemplo completo:
fonte
ref={component => {this.setState({ helloComponent: component; })}}
Então, no manipulador de cliques ...this.state.helloComponent.alertMessage();
Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()?
e não liga o componente à janelaVocê pode chamar esse método da janela usando
window.alertMessage()
.fonte
Se você estiver no ES6, apenas use a palavra-chave "estática" em seu método do exemplo que seria o seguinte:
static alertMessage: function() { ...
},
Espero poder ajudar alguém aí :)
fonte
Você pode simplesmente adicionar um
onClick
manipulador ao div com a função (onClick
é a implementação do próprio React deonClick
) e pode acessar a propriedade entre{ }
chaves e sua mensagem de alerta aparecerá.No caso de você desejar definir métodos estáticos que podem ser chamados na classe do componente - você deve usar estática. Apesar:
"Os métodos definidos neste bloco são estáticos, o que significa que você pode executá-los antes que qualquer instância do componente seja criada, e os métodos não têm acesso aos adereços ou estado de seus componentes. Se você quiser verificar o valor dos adereços em um estático , faça o chamador passar os adereços como um argumento para o método estático. " ( fonte )
Alguns exemplos de código:
Espero que isso ajude um pouco, porque não sei se entendi sua pergunta corretamente, então me corrija se eu a interpretei errado :)
fonte
Parece que a estática está obsoleta e os outros métodos de expor algumas funções
render
parecem complicados. Enquanto isso, essa resposta do Stack Overflow sobre depuração do React , embora pareça hack-y, fez o trabalho para mim.fonte
método 1
using ChildRef
:Método 2:
using window register
fonte
Com
React hook - useRef
Boa sorte...
fonte
Eu uso este método auxiliar para renderizar componentes e retornar uma instância do componente. Os métodos podem ser chamados nessa instância.
fonte