<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Thaissa Carvalho dos Santos</title>
    <description>The latest articles on DEV Community by Thaissa Carvalho dos Santos (@thaissacarvalho).</description>
    <link>https://dev.to/thaissacarvalho</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F691926%2F3471dda8-2e6c-444b-8b6a-8e0529964a04.jpg</url>
      <title>DEV Community: Thaissa Carvalho dos Santos</title>
      <link>https://dev.to/thaissacarvalho</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thaissacarvalho"/>
    <language>en</language>
    <item>
      <title>React, Typescript, Props e Events Handlers</title>
      <dc:creator>Thaissa Carvalho dos Santos</dc:creator>
      <pubDate>Fri, 14 Mar 2025 19:33:53 +0000</pubDate>
      <link>https://dev.to/thaissacarvalho/react-typescript-props-e-events-handlers-10cm</link>
      <guid>https://dev.to/thaissacarvalho/react-typescript-props-e-events-handlers-10cm</guid>
      <description>&lt;p&gt;Durante meus estudos em React com TypeScript, me deparei com desafios ao trabalhar com &lt;strong&gt;props&lt;/strong&gt; de tipos variados, incluindo &lt;code&gt;number&lt;/code&gt;, &lt;code&gt;strings&lt;/code&gt; e até &lt;code&gt;events handlers&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Aqui vou compartilhar um pouco sobre como lidar com essas propriedades de maneira eficiente.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&amp;gt; Props são usadas para transferir dados entre componentes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&amp;gt; Events Handlers são funções que reagem a interações do usuário e podem ser assíncronas.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Quando criamos componentes, seja para reutilização ou não, é comum que precisemos chamar essas propriedades em arquivos principais. Isso permite que os dados sejam passados de forma eficiente, sem a necessidade de repetições no código.&lt;/p&gt;

&lt;p&gt;Aqui está um exemplo de como um componente pode ser chamado no componente pai:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;InputOption key={index} placeholder={`Opção ${index + 1}`} value={option.text || ''} onChange={(e) =&amp;gt; handleOptionChange(index, e.target.value)}/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima, várias propriedades são passadas para o componente InputOption, como &lt;code&gt;key&lt;/code&gt;, &lt;code&gt;placeholder&lt;/code&gt;, &lt;code&gt;value&lt;/code&gt; e &lt;code&gt;onChange&lt;/code&gt;. Isso reduz o uso de memória, já que as chamadas são feitas apenas onde necessário.&lt;/p&gt;

&lt;p&gt;O seu arquivo principal tem essa criação por trás.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface InputOptionsProps {
  key: number;
  placeholder: string;
  value: string;
  onChange: (event: React.ChangeEvent&amp;lt;HTMLInputElement&amp;gt;) =&amp;gt; void;
}

export default function InputOption({
  key,
  placeholder,
  value,
  onChange,
}: InputOptionsProps) {
  return (
    &amp;lt;input
      key={key}
      type="text"
      placeholder={placeholder}
      value={value}
      onChange={onChange}
      required
      className="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400"
    /&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perceba que há a criação de props com diferentes tipos de dados como: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Number&lt;/strong&gt; para o &lt;code&gt;KEY&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;String&lt;/strong&gt; para os campos &lt;code&gt;PLACEHOLDER&lt;/code&gt; e &lt;code&gt;VALUE&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event Object&lt;/strong&gt; para o campo &lt;code&gt;ON CHANGE&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&amp;gt; Event Object é um objeto que armazena informações sobre eventos ocorridos no navegador. No caso do onChange, ele é disparado sempre que o valor de um campo interativo, como um input, é alterado.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Além do &lt;code&gt;onChange&lt;/code&gt;, temos outros manipuladores de eventos bastante utilizados, como &lt;code&gt;onSubmit&lt;/code&gt; e &lt;code&gt;onClick&lt;/code&gt;. O &lt;code&gt;onSubmit&lt;/code&gt; é usado para enviar dados após o preenchimento de um formulário, enquanto o &lt;code&gt;onClick&lt;/code&gt; captura interações do usuário com links, botões, entre outros.&lt;/p&gt;

&lt;p&gt;As suas chamadas em uma propriedade pelo React ocorre de forma diferente, enquanto o onChange chama o "React.ChangeEvent", o onClick não chama nenhum event, ele apenas retorna algo vazio "() =&amp;gt; void" para chamadas simples ou "React.MouseEvent" o onSubmit chama o "React.FormEvent" para a propriedade e assim funcionar no elemento pai.&lt;/p&gt;

&lt;p&gt;Perceba que, o &lt;code&gt;onChange&lt;/code&gt; chama &lt;strong&gt;&lt;/strong&gt;, esse evento de mudança é destinado apenas ao elemento input, mas é possivel utiliza-lo em textarea e select, assim tambem ocorre no &lt;code&gt;onClick&lt;/code&gt; com seus varios tipos de chamar um HTML Element podendo ser Archor, Div etc.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&amp;gt; A lógica do HTML Element com o onSubmit não funciona para vários casos.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplo de Event Handlers com suas props:
&lt;/h4&gt;

&lt;p&gt;⋗ &lt;strong&gt;Event onClick&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface onClickProps {
  onClick: () =&amp;gt; void;
  onClick: (event: React.MouseEvent&amp;lt;HTMLButtonElement&amp;gt;) =&amp;gt; void;  // Para um botão
  onClick: (event: React.MouseEvent&amp;lt;HTMLDivElement&amp;gt;) =&amp;gt; void;
  ...etc  
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⋗ &lt;strong&gt;Event onSubmit&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface onSubmitProps {
  onSubmit: (event: React.FormEvent&amp;lt;HTMLFormElement&amp;gt;) =&amp;gt; void;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⋗ &lt;strong&gt;Event onChange&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface OnChangeProps {
  onChange: (event: React.ChangeEvent&amp;lt;HTMLInputElement&amp;gt;) =&amp;gt; void;
  onChange: (event: React.ChangeEvent&amp;lt;HTMLSelectElement&amp;gt;) =&amp;gt; void;
  onChange: (event: React.ChangeEvent&amp;lt;HTMLTextAreaElement&amp;gt;) =&amp;gt; void;
  ...etc
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada prop criada permite que o React execute ações específicas após interações do usuário no navegador, com diferentes tipos de eventos.&lt;/p&gt;

&lt;p&gt;Em resumo, as props são responsáveis por transferir dados entre componentes, enquanto os event handlers manipulam as interações do usuário. O event object contém informações sobre os eventos e é tipado de acordo com o tipo de evento, como onSubmit, onChange e onClick.&lt;/p&gt;

</description>
      <category>react</category>
      <category>handlers</category>
      <category>typescript</category>
      <category>programming</category>
    </item>
    <item>
      <title>Tutorial de Instalação: Express com MongoDB e Mongoose</title>
      <dc:creator>Thaissa Carvalho dos Santos</dc:creator>
      <pubDate>Fri, 27 Dec 2024 13:01:08 +0000</pubDate>
      <link>https://dev.to/thaissacarvalho/tutorial-de-instalacao-express-com-mongodb-e-mongoose-7f3</link>
      <guid>https://dev.to/thaissacarvalho/tutorial-de-instalacao-express-com-mongodb-e-mongoose-7f3</guid>
      <description>&lt;p&gt;Antes de ensina-lo, esse é o meu post de número 1 na Dev.to, aqui eu estarei ensinando a como instalar, configurar e utilizar o Express, MongoDB e Mongoose em dezembro de 2024, lembrando que pode vir a ter modificações significativas, então, sempre confira a versão que está sendo utilizada e faça a documentação a sua aliada.&lt;/p&gt;




&lt;p&gt;A aplicação seguirá alguns pontos como:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;O que é Express, MongoDB e Mongoose;&lt;/li&gt;
&lt;li&gt;Instalação das tecnologias;&lt;/li&gt;
&lt;li&gt;Configurando o arquivo index;&lt;/li&gt;
&lt;li&gt;Editando o package.json;&lt;/li&gt;
&lt;li&gt;Criando o Model/Schema;&lt;/li&gt;
&lt;li&gt;Startando um projeto&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Antes de mais nada, você saberia me dizer o que é o Express, MongoDB ou Mongoose? Então, siga os point é a sua definição básica e memoravel.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Express: É um framework para Node.js que oferece recursos para criação de servidores web. Ou seja, ele lida com requisições e respostas de forma rápida, organizada e eficiente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;MongoDB: É um banco de dados não relacional (NoSQL) que utiliza documentos BSON (semelhantes a JSON) para armazenar informações de forma rápida e flexível. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mongoose: É um ODM (Object Data Modeling) e um dos assistentes mais famosos do MongoDB. Ele auxilia o banco de dados NoSQL a organizar informações, criando modelos para estruturar os dados que serão guardados.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;Instalação&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Comece abrindo o seu terminal e indo até a pasta de sua preferencia, no meu caso, eu vou na pasta "Documents".&lt;/p&gt;

&lt;p&gt;Comando: &lt;code&gt;cd nome-da-pasta&lt;/code&gt;&lt;br&gt;
Comando MacOS: &lt;code&gt;cd Documents&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Após entrar na pasta 'Documents', cabe você criar e entrar na pasta desejada para começarmos a instalação.&lt;/p&gt;

&lt;p&gt;Comando: &lt;code&gt;mkdir nome-da-pasta &amp;amp;&amp;amp; cd nome-da-pasta&lt;/code&gt;&lt;br&gt;
Comando MacOS: &lt;code&gt;mkdir tutorial-exmb &amp;amp;&amp;amp; cd tutorial-exmb&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;P.s.: &lt;em&gt;O operador "&amp;amp;&amp;amp;" serve para dizer que você QUER criar a pasta E entrar na pasta criada logo em seguida. Esse operador casa em diferentes ocasiões.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A partir daqui, vai de sua escolha se usará Javascript ou Typescript, mas fique tranquilo, eu disponibilizarei as duas formas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Javascript:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm init -y

npm install express mongodb mongoose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Typescript&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm init -y

# Instalar dependências principais
npm install express mongodb mongoose

# Instalar dependências de desenvolvimento para TypeScript e tipos
npm install -D typescript @types/node @types/express ts-node

# Criar o arquivo de configuração do TypeScript
npx tsc --init

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;P.s.: &lt;em&gt;Não é obrigatório ter o MongoDB instalado localmente para utilizá-lo em projetos.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Configurando o arquivo index.js/.ts&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Criando a pasta src e entrando na pasta
mkdir src &amp;amp;&amp;amp; cd src

# Criando o arquivo index.js/.ts
touch index.js/.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;P.s.: &lt;em&gt;Troque o index.js do package.json por index.ts, caso esteja utiliza o Typescript.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Arquivo index.js/.ts&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/* 
* Caso esteja utilizando Typescript
import express from 'express';
import mongoose from 'mongoose';
*/
const express = require('express');
const mongoose = require('mongoose');

// Configuração do app
const app = express();
const PORT = 3000;

// Middleware para interpretar JSON
app.use(express.json());

// Conexão com o MongoDB usando Mongoose
const mongoURI = 'mongodb://localhost:27017/seu_banco_de_dados'; // Altere para seu URI do MongoDB
mongoose
  .connect(mongoURI, { useNewUrlParser: true, useUnifiedTopology: true })
  .then(() =&amp;gt; {
    console.log('Conectado ao MongoDB com sucesso!');
  })
  .catch((err) =&amp;gt; {
    console.error('Erro ao conectar ao MongoDB:', err.message);
  });

// Rotas básicas
app.get('/', (req, res) =&amp;gt; {
  res.send('Bem-vindo ao servidor Express com MongoDB!');
});

// Porta onde o servidor será executado
app.listen(PORT, () =&amp;gt; {
  console.log(`Servidor rodando em http://localhost:${PORT}`);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Editando o package.json com Javascript&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Se quiser utilizar o nodemon, instale com npm install nodemon

"scripts": {
  "start": "node index.js",          // Inicia a aplicação
  "dev": "nodemon index.js",         // Executa o app com nodemon (reinício automático)
  "lint": "eslint . --fix",          // Lint e correção automática do código
  "test": "jest"                     // Roda os testes usando Jest
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Editando o package.json com Typescript&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"scripts": {
  "start": "node dist/index.js",         // Executa o código já compilado
  "build": "tsc",                        // Compila o TypeScript para JavaScript
  "dev": "ts-node src/index.ts",         // Executa o TypeScript diretamente com ts-node
  "lint": "eslint . --ext .ts --fix",    // Lint do código TypeScript
  "test": "jest",                        // Testes com Jest
  "watch": "tsc --watch",                // Compila automaticamente ao salvar
  "clean": "rm -rf dist"                 // Limpa a pasta de build
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Criando o Model/Schema&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Começamos com a criação da pasta e arquivo seguindo o exemplo abaixo. Atente-se a extensão.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir models &amp;amp;&amp;amp; cd/models &amp;amp;&amp;amp; touch user.model.js/.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após a criação, utilizemos dessa forma. &lt;/p&gt;

&lt;p&gt;Versão Javascript: Utilizando const/require com module.exports.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// user.model.js

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
  },
  username: {
    type: String,
    required: true,
    unique: true
  },
  email: {
    type: String,
    required: true,
    unique: true
  },
  password: {
    type: String,
    required: true,
  },
}, { timestamps: true });

module.exports = mongoose.model('User', userSchema);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Versão Typescript: Utilizando a versão mais atual de import/export.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// user.model.ts

import { model, Schema } from "mongoose";

const userSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
  },
  username: {
    type: String,
    required: true,
    unique: true
  },
  email: {
    type: String,
    required: true,
    unique: true
  },
  password: {
    type: String,
    required: true,
  },
}, { timestamps: true });

export const UserModel = mongoose.model('User', userSchema);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Dando start no projeto&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para testar agora o seu projeto e subir a aplicação para o navegador, vá no terminal e rode o comando: &lt;code&gt;npm run start&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;P.S.: Você pode utilizar o Bruno, Insomnia, Postman ou via CURL para receber a mensagem 'Bem-vindo ao servidor Express com MongoDB!' e começar a criar os métodos HTTP para o model User.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;CHEGAMOS AO FINAL DO TUTORIAL :D&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Parabéns! 🎉 Você agora configurou com sucesso um servidor básico usando Express, conectou-se a um banco de dados MongoDB com Mongoose, criou o primeiro Model e entendeu os fundamentos de como essas tecnologias trabalham juntas.&lt;/p&gt;

</description>
      <category>node</category>
      <category>mongodb</category>
      <category>express</category>
      <category>mongoose</category>
    </item>
  </channel>
</rss>
