Blog / Javascript

Injeção de Dependência em ReactJS

TTulio Faria 05 de jun. de 2017 3 min de leitura
Injeção de Dependência em ReactJS

Como estávamos comentando anteriormente sobre injeção de dependência, achei relevante mostrar como podemos fazer Injeção de Dependência em ReactJS.

Para ilustrar, temos o exemplo abaixo, que quando carregamos o componente, utilizamos o axios para fazer uma requisição http e pegar o IP da origem e seta no estado atual do componente mostrando o IP na tela.

import React, { Component } from 'react'
import axios from 'axios'

class App extends Component {
  constructor(props) {
    super(props)
    this.state = {
      ip: ' '
    }
  }
  componentDiMount() {
    const url = 'https://httpbin.org/ip'
    axios.get(url).then((res) => {
      this.setState({
        ip: res.data.origin
      })
    })
  }
  render() {
    return <div>Your IP adress is: {this.state.ip}</div>
  }
}

O problema aqui é que se fossemos testar esse app, teríamos que contornar o axios de alguma forma,pois estamos importando ele direto. Assim, o componente está muito dependente do axios. Se quisermos rodar o componente ou testar com o Indesign, por exemplo, não vai ser possível.

O que podemos fazer?

Uma coisa que às vezes esquecemos com o ReactJS: ele tem um ponto de montagem. Temos um index.js que faz a montagem inicial.

import React from 'react'
import reactDOM from 'react-dom'
import App from './App'

ReactDOM.render(
    <App />
    document.getElementById('root')
)

Perceba que temos o App e ele faz a montagem em si do html.

Com isso, podemos simplesmente passar a dependência do código anterior para o nosso index.js, já que podemos colocá-las em lugares onde não vamos testar códigos.

Então, ao invés de importarmos o axios no nosso app.js, por exemplo, vamos colocar no ponto de montagem

app.js:

import React, { Component } from 'react'


index.js:


import React from 'react'
import reactDOM from 'react-dom'
import App from './App'
//dependencias
import axios from 'axios'

Como o index monta a aplicação React no HTML, vou trazer o axios. Podemos fazer uma lista de dependências para injetar no componente.

Qual a diferença?

Ao invés de utilizar o axios direto, vou passar essa dependência via props:

ReactDOM.render(
    <App  axios={axios}/>
    document.getElementById('root')
)

O App vai ter acesso a propriedade axios, que é o que eu importei.

Podemos, então, ir no componente em si e fazer o seguinte:

componentDiMount(){
    const url = 'https://httpbin.org/ip'
    this.props.axios.get(url)
    .then((res)=>{
        this.setState({
            ip: res.data.origin
        })
    })
}

E fazemos a requisição normal. Se quiser fazer um teste unitário desse componente, posso fazer tranquilamente porque, quando for renderizar este componente para testar, eu crio um mock ou um axios fake e vejo se esse componente chama o axios falso, da mesma forma que fizemos anteriormente.

O mais importante aqui é lembrarmos que o props é uma forma que temos de injetar dependência, por isso que muitas vezes construímos aplicação com o estado todo da aplicação em um app e passamos as funções para os próximos componentes, assim ele pode ser executado em qualquer ambiente.

Em toda a arquitetura, seja ela em React, em Node, etc, vai ter um lugar com uma cola (ou um ponto de montagem) e eu acredito que estes pontos são interessantes para analisar como potenciais locais de adicionar dependências.

Confira o vídeo-tutorial:

Curta o DevPleno no Facebook, inscreva-se no canal e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!

T
Escrito por
Tulio Faria

Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.

Javascript
Compartilhar X LinkedIn
Continue lendo

Insights relacionados