Home
Button Mobile Webdesign em Foco
Newsletter Webdesign em Foco
Support Webdesign em Foco
Contribuition Webdesign em Foco
Doe para a Webdesign em Foco
Suporte da Webdesign em Foco
Fechar

Busca sem refresh com REACT JS, PHP e MYSQL

15/05/2018

Na vídeo-aula de hoje vamos trabalhar com busca sem refresh no REACT, utilizando PHP e MYSQL.

Estrutura de Diretórios

Para a nossa aplicação teremos a seguinte estrutura de diretórios:

diretorios-busca-sem-refresh-react

Criando os componentes

Nossa aplicação terá os seguintes componentes:

App

import React from 'react';
import SearchBar from './SearchBar';
import Table from './Table';
import {debounce} from 'throttle-debounce';

const Root="http://"+document.location.hostname+"/app/";

export default class App extends React.Component{

    constructor(){
        super();
        this.state=({
            db: []
        });
        this.searchDB();
    }

    searchDB(Valor){
        fetch(Root+"src/api/index.php", {
            method: 'POST',
            body: JSON.stringify({
                Busca: Valor
            })
        })
            .then((response)=>response.json())
            .then((responseJson)=>
            {
                this.setState({
                    db: responseJson
                });
                console.log(responseJson);
            });
    }

   render(){
        return(
            <div>
                <SearchBar funcao={debounce(3000,this.searchDB.bind(this))} estado={this.state.db} />
                <Table arrayCarros={this.state.db} />
            </div>
        );
    }
}

SearchBar

import React from 'react';

export default class SearchBar extends React.Component{

    handleChange(e){
        e.preventDefault();
        const Valor=e.target.value;
        this.props.funcao(Valor);
    }

    render(){
        return(
          <div className="SearchBar">
              <form name="FormBusca" id="FormBusca" method="post">
                  <input onChange={this.handleChange.bind(this)} type="text" name="Busca" id="Busca" placeholder="Busque o que precisa" />
              </form>
          </div>
        );
    }
}

Table

import React from 'react';

export default class Table extends React.Component{
    render(){
        return(
            <div className="Table">
                <table>
                    <thead>
                    <tr>
                        <td>ID</td>
                        <td>MARCA</td>
                        <td>MODELO</td>
                        <td>ANO</td>
                    </tr>
                    </thead>

                    <tbody>
                    {
                    this.props.arrayCarros.map(
                    row=>
                    <tr key={row.Id}>
                        <td>{row.Id}</td>
                        <td>{row.Marca}</td>
                        <td>{row.Modelo}</td>
                        <td>{row.Ano}</td>
                    </tr>
                    )
                    }
                    </tbody>

                </table>
            </div>
        );
    }
}

Estilizando os componentes

*{margin:0; box-sizing: border-box;}

.SearchBar{float:left; width: 100%; padding: 20px 10%; background: #999; font-size: 18px;}
    .SearchBar input[type='text']{float:left; width: 50%; margin: 0 25%; font-size: 17px;}

.Table{float:left; width: 80%; margin: 30px 10%; text-align: center;}
    .Table table{width: 100%; border:none;}
    .Table table thead tr{background: #333; color:#fff; font-weight: bold;}
    .Table table tbody tr:nth-child(2n){background: #ccc;}

Criando o banco de dados

Criaremos nosso banco de dados MYSQL da seguinte forma:

CREATE TABLE 'carros' (
  'Id' int(11) NOT NULL,
  'Marca' varchar(30) NOT NULL,
  'Modelo' varchar(30) NOT NULL,
  'Ano' varchar(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
ALTER TABLE 'carros' ADD PRIMARY KEY ('Id');
ALTER TABLE 'carros' MODIFY 'Id' int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;

INSERT INTO 'carros' ('Id', 'Marca', 'Modelo', 'Ano') VALUES
(1, 'Fiat', 'Uno', '2002'),
(2, 'Chevrolet', 'Camaro', '2016'),
(3, 'Ford', 'Fiesta', '2014'),
(4, 'Ford', 'Ka', '2001'),
(5, 'Chevrolet', 'Monza', '2001');

Criando nossa API de busca no banco de dados

Para nossa API teremos três arquivos: index.php que instanciará a classe de busca e receberá o campo digitado pelo usuário no PHP, ClassConexao.php que fará a conexão com o banco de dados e ClassCarros.php que realizará a busca no banco.

index.php

include("./ClassCarros.php");

$Busca=json_decode(file_get_contents("php://input"),true);
if($Busca == null){
    $BuscaFinal=null;
}else{
    foreach($Busca as $Busca2){
        $BuscaFinal=$Busca2;
    }
}
$Carros=new ClassCarros();
$Carros->searchCar($BuscaFinal);

ClassConexao.php

abstract class ClassConexao{

    protected function conectaDB()
    {
        try{
            $Con=new PDO("mysql:host=localhost;dbname=react","root","");
            return $Con;
        }catch(PDOException $Erro){
            return $Erro->getMessage();
        }
    }
}

ClassCarros.php

include ("./ClassConexao.php");

class ClassCarros extends ClassConexao{

    public function searchCar($Par=null){

        if($Par == null){
            $BFetch=$this->conectaDB()->prepare("select * from carros");
        }else{
            $ParLike='%'.$Par.'%';
            $BFetch=$this->conectaDB()->prepare("select * from carros where Marca like :marca or Modelo like :modelo");
            $BFetch->bindParam(":marca",$ParLike,PDO::PARAM_STR);
            $BFetch->bindParam(":modelo",$ParLike,PDO::PARAM_STR);
        }
        $BFetch->execute();

        $I=0;
        $J=[];

        while($Fetch=$BFetch->fetch(PDO::FETCH_ASSOC)){
            $J[$I]=[
                "Id"=>$Fetch['Id'],
                "Marca"=>$Fetch['Marca'],
                "Modelo"=>$Fetch['Modelo'],
                "Ano"=>$Fetch['Ano']
            ];

            $I++;
        }

        header("Access-Control-Allow-Origin: *");
        header("Content-type: application/json");
        echo json_encode($J);
    }
}

Realizando o debounce no REACT JS

Por fim, para evitar requisições em massa no nosso servidor utilizaremos o recurso debounce para dar um delay na chamada do nosso evento.

Primeiramente precisamos importar o pacote throttle-debounce no nosso terminal.

npm install throttle-debounce --save

Posteriormente aplicamos isso na propriedade funcao do nosso elemento searchBar:

<SearchBar funcao={debounce(3000,this.searchDB.bind(this))} />

Até a próxima :)

Receba as aulas da Webdesign em Foco em Seu Email
Suporte Webdesign em Foco

Posts Relacionados

Integrando REACT JS, PHP e MYSQL
Na aula de hoje vamos aprender a integrar o REACT JS com o PHP e com o banco de dados MYSQL. Utilizaremos a classe PDO para a integração.
Saiba mais!
Select Dinâmico com REACT JS, PHP e MYSQL
Nessa vídeo-aula vamos fazer um select dinâmico com REACT JS, PHP e MySql buscando os dados de marca e modelo do nosso veículo diretamente do banco de dados.
Saiba mais!
React JS
Nessa seção aprenderemos sobre essa importante biblioteca Javascript desenvolvida pelo Facebook para facilitar a construção backend dos nossos websites.
Saiba mais!