Mudanças entre as edições de "React.js: Estados e Eventos"

De Aulas
 
(Uma revisão intermediária pelo mesmo usuário não está sendo mostrada)
Linha 1: Linha 1:
 +
  
 
Afluentes: [[Desenvolvimento Front-end II]], [[Usabilidade, desenvolvimento web, mobile e jogos]]
 
Afluentes: [[Desenvolvimento Front-end II]], [[Usabilidade, desenvolvimento web, mobile e jogos]]
Linha 137: Linha 138:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Veja que quando passamos parâmetros usamos <code>() =></code> antes da função. Isso porque se fizermos colocarmos apenas <code>onClick={this.shot("Goal")}</code>, o Reactjs vai executar a função para colocar o resultado ali. Ao colocarmos <code>onClick{() => this.shot("Goal")}</code>, estamos avisando o React que estamos passando uma função anônima como parâmetro, garantindo que o React só executará quando o evento for acionado.
+
'''IMPORTANTE:''' Veja que quando passamos parâmetros usamos <code>() =></code> antes da função. Isso porque se colocarmos apenas  
  
=== Eventos de Objetos React ===
+
<code>onClick={this.shot("Goal")}</code>,
 +
 
 +
o Reactjs vai executar a função imediatamente para colocar o resultado ali e pode entrar em ''looping'', travando a aplicação. Ao colocarmos
 +
 
 +
<code>onClick{() => this.shot("Goal")}</code>,
 +
 
 +
estamos avisando o React que estamos passando uma função anônima como parâmetro, garantindo que o React só executará quando o evento for acionado.
 +
 
 +
===Eventos de Objetos React===
  
 
Podemos pegar os eventos no React. No exemplo a seguir, estamos pegando o evento "click" do mouse. Veja que estamos usando a sintaxe de ''arrow function''.
 
Podemos pegar os eventos no React. No exemplo a seguir, estamos pegando o evento "click" do mouse. Veja que estamos usando a sintaxe de ''arrow function''.
  
<syntaxhighlight lang=javascript>
+
<syntaxhighlight lang="javascript">
 
class Football extends React.Component {
 
class Football extends React.Component {
 
   shoot = (a, b) => {
 
   shoot = (a, b) => {
Linha 164: Linha 173:
 
Sem o uso de ''arrow function'', o objeto event do React é enviado automaticamente como um último parâmetro ao usar o método <code>bind()</code>.
 
Sem o uso de ''arrow function'', o objeto event do React é enviado automaticamente como um último parâmetro ao usar o método <code>bind()</code>.
  
<syntaxhighlight lang=javascript>
+
<syntaxhighlight lang="javascript">
 
class Football extends React.Component {
 
class Football extends React.Component {
 
   shoot = (a, b) => {
 
   shoot = (a, b) => {
Linha 183: Linha 192:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
= Juntando tudo =
+
 
 +
=Juntando tudo=
  
 
Agora vamos trabalhar com estados e eventos para mostrar ou esconder um elemento (no caso texto) quando clicamos em um botão.
 
Agora vamos trabalhar com estados e eventos para mostrar ou esconder um elemento (no caso texto) quando clicamos em um botão.
  
<syntaxhighlight lang=javascript>
+
<syntaxhighlight lang="javascript">
 
class App extends React.Component {
 
class App extends React.Component {
 
     constructor(props) {
 
     constructor(props) {

Edição atual tal como às 15h39min de 10 de junho de 2024


Afluentes: Desenvolvimento Front-end II, Usabilidade, desenvolvimento web, mobile e jogos

State React

O objeto state é onde são armazenados valores de propriedades pertencentes ao componente. Quando modificado, há uma nova renderização do componente. Ele é inicializado no construtor.

class Car extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      brand: "Ford",
      model: "Mustang",
      color: "red",
      year: 1964
    };
  }
  render() {
    return (
      <div>
        <h1>My Car</h1>
      </div>
    );
  }
}

Podemos referenciar o objet state de qualquer lugar do componente usando this.state.nome_da_propriedade.

class Car extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      brand: "Ford",
      model: "Mustang",
      color: "red",
      year: 1964
    };
  }
  render() {
    return (
      <div>
        <h1>My {this.state.brand}</h1>
        <p>
          It is a {this.state.color}
          {this.state.model}
          from {this.state.year}.
        </p>
      </div>
    );
  }
}

Para modificar o objeto state, usamos o método this.setState().

No exemplo a seguir, um botão usa o evento onClick que modifica a propriedade da cor.

class Car extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      brand: "Ford",
      model: "Mustang",
      color: "red",
      year: 1964
    };
  }
  changeColor = () => {
    this.setState({color: "blue"});
  }
  render() {
    return (
      <div>
        <h1>My {this.state.brand}</h1>
        <p>
          It is a {this.state.color}
          {this.state.model}
          from {this.state.year}.
        </p>
        <button
          type="button"
          onClick={this.changeColor}
        >Change color</button>
      </div>
    );
  }
}

Eventos

Assim como no HTML, o React pode efetuar ações baseadas nos eventos dos usuários, tais como click, change, mouseover, etc..

No React, para adicionar um evento, colocamos o nome da função que queremos chamar entre chaves (onClick={shoot}) ao invés de chamada de função (onClick="shoot()").

Como boa prática de programação no React, é interessante colocar o tratamento do evento como um método em uma classe componente.

class Football extends React.Component {
  shoot = () => {
    alert(this);
    /*
    The 'this' keyword refers to the component object
    */
  }
  render() {
    return (
      <button onClick={this.shoot}>Take the shot!</button>
    );
  }
}

ReactDOM.render(<Football />, document.getElementById('root'));

Observe no exemplo acima que também podemos usar o this para pegar uma função do objeto ou atibuto.

Podemos também passar parâmetros.

class Football extends React.Component {
  shoot = (a) => {
    alert(a);
  }
  render() {
    return (
      <button onClick={() => this.shoot("Goal")}>Take the shot!</button>
    );
  }
}

ReactDOM.render(<Football />, document.getElementById('root'));

IMPORTANTE: Veja que quando passamos parâmetros usamos () => antes da função. Isso porque se colocarmos apenas

onClick={this.shot("Goal")},

o Reactjs vai executar a função imediatamente para colocar o resultado ali e pode entrar em looping, travando a aplicação. Ao colocarmos

onClick{() => this.shot("Goal")},

estamos avisando o React que estamos passando uma função anônima como parâmetro, garantindo que o React só executará quando o evento for acionado.

Eventos de Objetos React

Podemos pegar os eventos no React. No exemplo a seguir, estamos pegando o evento "click" do mouse. Veja que estamos usando a sintaxe de arrow function.

class Football extends React.Component {
  shoot = (a, b) => {
    alert(b.type);
    /*
    'b' representa o evento React que chamou a função,
    nesse caso foi o evento 'click'.
    */
  }
  render() {
    return (
      <button onClick={(ev) => this.shoot("Goal", ev)}>Take the shot!</button>
    );
  }
}

ReactDOM.render(<Football />, document.getElementById('root'));

Sem o uso de arrow function, o objeto event do React é enviado automaticamente como um último parâmetro ao usar o método bind().

class Football extends React.Component {
  shoot = (a, b) => {
    alert(b.type);
    /*
    'b' represents the React event that triggered the function,
    in this case the 'click' event
    */
  }
  render() {
    return (
      <button onClick={this.shoot.bind(this, "Goal")}>Take the shot!</button>
    );
  }
}

ReactDOM.render(<Football />, document.getElementById('root'));


Juntando tudo

Agora vamos trabalhar com estados e eventos para mostrar ou esconder um elemento (no caso texto) quando clicamos em um botão.

class App extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            hidden: false,
        };
    }

    changeHidden = () => {
        let hid = !this.state.hidden;
        this.setState({ hidden: hid });
    }

    render() {
        return (
            <div>
                <h1>Esconde Texto</h1>
                <button type='button' onClick={this.changeHidden}>
                    {(this.state.hidden ? "mostrar" : "esconder")}
                </button>
                <p hidden={(this.state.hidden ? "hidden" : "")}>
                    Este é o meu texto.
                </p>
            </div>
        );
    }
}

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