<?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>Forem: Lucas Lafèré</title>
    <description>The latest articles on Forem by Lucas Lafèré (@lucaslafere).</description>
    <link>https://forem.com/lucaslafere</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%2F972535%2Fdca75ae0-96ef-4f42-a92f-7d27712e44a9.jpeg</url>
      <title>Forem: Lucas Lafèré</title>
      <link>https://forem.com/lucaslafere</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/lucaslafere"/>
    <language>en</language>
    <item>
      <title>Utilizando o Storybook para componentes</title>
      <dc:creator>Lucas Lafèré</dc:creator>
      <pubDate>Thu, 16 Feb 2023 15:45:16 +0000</pubDate>
      <link>https://forem.com/lucaslafere/utilizando-o-storybook-para-componentes-2a4</link>
      <guid>https://forem.com/lucaslafere/utilizando-o-storybook-para-componentes-2a4</guid>
      <description>&lt;h2&gt;
  
  
  Para que serve o Storybook?
&lt;/h2&gt;

&lt;p&gt;O Storybook é uma ferramenta bastante útil para desenvolvedores de aplicações web baseadas em componentes. Ele permite a criação de componentes de forma isolada, tornando mais fácil testar diferentes estados, cores e propriedades.&lt;/p&gt;

&lt;p&gt;Sabe aquele botãozinho que ao clicar, deve ter seu texto mudado, e de acordo com isso, também deve mudar sua cor? Com o Storybook, a tarefa de testar essa funcionalidade se torna muito mais fácil.&lt;/p&gt;

&lt;p&gt;Além disso, o Storybook ajuda a criar uma documentação para os componentes, o que facilita o trabalho em equipe.&lt;/p&gt;

&lt;p&gt;O Storybook é amplamente utilizado para desenvolvimentos baseados em Component Driven UI. Neste tipo de abordagem, os componentes são criados primeiro e depois as páginas são construídas a partir deles, seguindo uma estratégia "from the bottom-up".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aqui vai um exemplo do Storybook em funcionamento:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxf1kp15ye4r1yiufp19k.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxf1kp15ye4r1yiufp19k.gif" alt=" " width="362" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalando o Storybook
&lt;/h3&gt;

&lt;p&gt;Para instalar o Storybook na sua aplicação React, seja com CRA (Create React App) ou Vite, basta executar o seguinte comando no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx sb init

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

&lt;/div&gt;



&lt;p&gt;Com isso, serão instalados alguns arquivos e pastas novas em seu projeto. A pasta &lt;code&gt;.storybook&lt;/code&gt; contém as configurações padrão do Storybook, enquanto a pasta &lt;code&gt;stories&lt;/code&gt; é destinada a armazenar os seus stories.&lt;/p&gt;

&lt;p&gt;Para inicializar o Storybook após a instalação, execute o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run storybook

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

&lt;/div&gt;



&lt;p&gt;Nota: É recomendável que você exclua todos os arquivos na pasta &lt;code&gt;/stories/&lt;/code&gt;, pois eles não serão utilizados e podem causar confusão para alguém novo no Storybook.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Criando um Story&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Para adicionar um story para um componente em React, crie um arquivo com o nome &lt;code&gt;[nome_do_componente].stories.jsx&lt;/code&gt;, por exemplo, &lt;code&gt;Button.stories.jsx&lt;/code&gt; para um componente chamado &lt;code&gt;Button&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Exemplo de um componente &lt;code&gt;Button&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import PropTypes from 'prop-types';

function Button({ label, backgroundColor = 'red', size = 'md', handleClick }) {
  let scale = 1;
  if (size === 'sm') scale = 0.75;
  if (size === 'lg') scale = 1.5;

  const style = {
    backgroundColor,
    padding: `${scale * 0.5}rem ${scale * 1}rem`,
    border: 'none',
  };

  return (
    &amp;lt;button onClick={handleClick} style={style}&amp;gt;
      {label}
    &amp;lt;/button&amp;gt;
  );
}

Button.propTypes = {
  label: PropTypes.string,
  backgroundColor: PropTypes.string,
  size: PropTypes.oneOf(['sm', 'md', 'lg']),
  handleClick: PropTypes.func,
};

export default Button;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seguida, você deve criar um objeto em &lt;code&gt;Button.stories.jsx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Em Button.stories.jsx:

import Button from '../components/Button';

export default {
  title: 'My New Button',
// O componente que você deseja renderizar, testar e adicionar um story sobre:
  component: Button, 
};

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

&lt;/div&gt;



&lt;p&gt;Agora, você pode criar uma função que retorne o seu componente e dar o nome "Red" ao seu story:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Em Button.stories.jsx:

import Button from '../components/Button';

export default {
  title: 'My New Button',
  component: Button, 
};

export const Red = () =&amp;gt; &amp;lt;Button label="Press Me" backgroundColor="red" /&amp;gt;;

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

&lt;/div&gt;



&lt;p&gt;Se você estiver usando TypeScript ou o recurso "propTypes" para tipar as suas props, o StoryBook será capaz de ler, inferir e documentar essa tipagem, sabendo, por exemplo, que &lt;code&gt;label: string&lt;/code&gt; e &lt;code&gt;backgroundColor: string&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo80t1n0d430t038z8js5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo80t1n0d430t038z8js5.png" alt="Primeiro componente storybook, um quadrado vermelho com o texto " width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com isso, você já tem o seu primeiro story. Ele ainda não é interativo, mas já existe com documentação e já mostra como seria renderizado em uma página. Agora você pode torná-lo interativo para alternar as props, receber ações e assim por diante.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tornando nosso Story interativo
&lt;/h3&gt;

&lt;p&gt;Primeiro, precisamos voltar ao nosso arquivo &lt;code&gt;Button.stories.jsx&lt;/code&gt; e adicionar a seguinte linha:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//Em Button.stories.jsx:

import Button from '../components/Button';

export default {
  title: 'My new Button',
  component: Button 
}

// nova função aqui:

const Template = args =&amp;gt; &amp;lt;Button {...args} /&amp;gt;export const Red = () =&amp;gt; &amp;lt;Button label="Press me" backgroundColor="red" /&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;Com isso, estamos criando na variável &lt;code&gt;Template&lt;/code&gt; uma função que recebe alguns argumentos &lt;code&gt;(args)&lt;/code&gt; - como as &lt;code&gt;props&lt;/code&gt; do Componente - e retorna o &lt;code&gt;Button&lt;/code&gt;, passando todos os &lt;code&gt;args&lt;/code&gt; (props) para o &lt;code&gt;Button&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Agora, para cada novo “estilo” que desejamos testar do nosso componente &lt;code&gt;Button&lt;/code&gt;, basta utilizarmos o &lt;code&gt;Template&lt;/code&gt; que criamos.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//Em Button.stories.jsx:

import Button from '../components/Button';

export default {
  title: 'My new Button',
  component: Button 
}
// mudando o Red para utilizar a Template:

const Template = args =&amp;gt; &amp;lt;Button {...args} /&amp;gt;
export const Red = Template.bind({}) 
Red.args = { 
  backgroundColor = "red",
  label: "Press me",
  size: "md",
}

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

&lt;/div&gt;



&lt;p&gt;Voltando para o Storybook, conseguimos manipular esse Story:&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzufyqhk1r5bvl2fpier0.png" alt="Quadrado verde" width="733" height="924"&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mantendo track de “Actions” dos componentes
&lt;/h3&gt;

&lt;p&gt;Quando criamos uma função chamada &lt;code&gt;onClick&lt;/code&gt; como uma prop do nosso componente, o Storybook é capaz de reconhecer, por assinatura, que há algum tipo de evento acontecendo ali, e isso é mostrado na seção Actions da biblioteca.&lt;/p&gt;

&lt;p&gt;Mas e quando temos uma função diferente, como &lt;code&gt;handleClick&lt;/code&gt;, que utilizamos acima? Para tornar essa função uma Action dentro do Storybook, precisamos usar &lt;code&gt;argTypes&lt;/code&gt; dentro do arquivo &lt;code&gt;Button.stories.jsx:&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import Button from '../components/Button';

export default {
  title: "'My new Button',"
  component: Button,
  argTypes: {
    handleClick: {
      action: "handleClick"
    }
  }
}

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

&lt;/div&gt;



&lt;p&gt;Estamos dizendo para o Storybook que essa prop &lt;code&gt;handleClick&lt;/code&gt; é uma Action, chamada handleClick. Essa string pode ser o que você quiser, é o nome utilizado dentro do Storybook para essa action.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const Template = args =&amp;gt; &amp;lt;Button {...args} /&amp;gt;export const Red = Template.bind({})
Red.args = {
  backgroundColor: "red",
  label: "Press me",
  size: "md",
}

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

&lt;/div&gt;



&lt;p&gt;Agora no Storybook → Actions, podemos encontrar a função que foi utilizada, com todas as informações de evento dela, como quando utilizamos &lt;code&gt;console.log&lt;/code&gt; em um evento:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu075cgkk28leoa2opqyt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu075cgkk28leoa2opqyt.png" alt="Log de eventos do handleClick" width="450" height="269"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando múltiplos Stories para um mesmo componente
&lt;/h3&gt;

&lt;p&gt;E agora, para finalizar (o básico) da magia do &lt;strong&gt;Storybook&lt;/strong&gt;, podemos criar múltiplos stories para um mesmo componente, utilizando o mesmo &lt;code&gt;Template&lt;/code&gt; de antes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//Em Button.stories.jsx:

import Button from '../components/Button';

export default {
title: "'My new Button',"
component: Button
argTypes: { handleClick: { action: "handleClick"} }
}

const Template = args =&amp;gt; &amp;lt;Button {...args} /&amp;gt;

export const Red = Template.bind({})
Red.args = {
backgroundColor = "red",
label: "Press me",
size: "md",
}
// criando um botão verde:
export const Green = Template.bind({})
Green.args = {
backgroundColor = "green",
label: "Press me",
size: "md",
}
// criando um botão pequeno:
export const Small = Template.bind({})
Small.args = {
backgroundColor = "red",
label: "Press me",
size: "sm",
}
// criando um botão grande:
export const Large = Template.bind({})
Large.args = {
backgroundColor = "red",
label: "Press me",
size: "lg",
}
// criando um botão com muito texto:
export const LongLabel = Template.bind({})
LongLabel.args = {
backgroundColor = "red",
label: "Press me hptrhpokophpoj gkpdofk pogdfpo kpgodfk pgdkpfo",
size: "md",
}

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

&lt;/div&gt;



&lt;p&gt;Ou seja, basta utilizarmos a mesma &lt;code&gt;Template&lt;/code&gt;, mudando os argumentos conforme necessidade, baseado no que desejamos testar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export const NomeDoStory = Template.bind({})
NomeDoStory.args = {
backgroundColor = "red",
label: "Press me",
size: "md",
}

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

&lt;/div&gt;



&lt;p&gt;No &lt;strong&gt;Storybook:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcoz7y5ewkm76bkdp9h9j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcoz7y5ewkm76bkdp9h9j.png" alt="Imagem com diferentes componentes para testar, criados em nosso código, como mostrado acima" width="800" height="606"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Com isso, você agora já é capaz de criar novos componentes de maneira prática, utilizando os Templates, e testar os diferentes estados que aquele componente precisa ter.&lt;/p&gt;

</description>
      <category>gratitude</category>
    </item>
  </channel>
</rss>
