Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² React

ΠžΠ±Π·ΠΎΡ€ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… возмоТностСй React

πŸš€ Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² React

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ React

Π Π΅Π°ΠΊΡ‚ β€” это дСкларативная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для синхронизации DOM с вашими Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°

ЭкосистСма Π²ΠΎ Π³Π»Π°Π²Π΅ всСго

ΠŸΠΎΡ‡Π΅ΠΌΡƒ ЀСйсбук создал Π Π΅Π°ΠΊΡ‚

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ

Show me the code

Hello

      
        import React from "react";
        import ReactDOM from "react-dom";

        class HelloMessage extends React.Component {
          render() {
            return <div>Hello {this.props.message}</div>;
          }
        }

        ReactDOM.render(
          <HelloMessage name="John Connor" />,
            document.getElementById("app")
        );
      
    

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Π»Π°Π΄Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ качСствами:

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Π»Π°Π΄Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ качСствами:

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π½ΠΎΠ³ΠΎ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½ΠΎΠ³ΠΎ стиля:

JSX

JSX (Java Script ΠΈ XML)

JSX β€” это прСпроцСссор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ добавляСт синтаксис XML ΠΊ JavaScript. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ React Π±Π΅Π· JSX, Π½ΠΎ JSX Π΄Π΅Π»Π°Π΅Ρ‚ React Π±ΠΎΠ»Π΅Π΅ элСгантным.

        
          React.createElement(
            type,
            [props],
            [...children]
          )
        
      

JSX vs. Vanilla

        
          <div className="message">
            Hello {this.props.message}
          </div>

          // compiles into
          React.createElement(
            "div",
            { className: "message" },
            `Hello ${this.props.message}`
          );
        
      

ВыраТСния Π² JSX

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ любоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ JavaScript Π² JSX, ΠΎΠ±Π΅Ρ€Π½ΡƒΠ² Π΅Π³ΠΎ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹ΠΌΠΈ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹ΠΌΠΈ скобками.

        
          const user = { firstName: "John", lastName: "Connor" };
          const formatName = ({firstName, lastName}) =>
            `${firstName} ${lastName}`;

          const message = (
            <div className="message">
              Hello, {formatName(user)}!
            </div>
          );
        
      

JSX β€” это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

ПослС компиляции выраТСния JSX становятся ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ JavaScript.

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ JSX Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² if ΠΈΠ»ΠΈ for, Π½Π°Π·Π½Π°Ρ‡Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π² JSX

        
          const image = <img src={user.avatarUrl} />
        
      

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ JSX Π±Π»ΠΈΠΆΠ΅ ΠΊ JavaScript, Ρ‡Π΅ΠΌ HTML, React DOM ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ соглашСниС ΠΎΠ± ΠΈΠΌΠ΅Π½Π°Ρ… β€” camelCase вмСсто ΠΈΠΌΠ΅Π½ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² HTML.

НапримСр, class становится className Π² JSX, Π° tabindex становится tabIndex

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² JSX

        
          const message = (
            <div>
              <h1>Hello!</h1>
              <h2>Good to see you here.</h2>
            </div>
          );
        
      

JSX ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π°Ρ‚Π°ΠΊΠΈ ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠ΅ΠΉ

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ React DOM ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π»ΡŽΠ±Ρ‹Π΅ значСния, написанныС Π² JSX, ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΡ… Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ΠΎΠΌ. ΠŸΠ΅Ρ€Π΅Π΄ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ΠΎΠΌ всС прСобразуСтся Π² строку. Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ XSS (Cross-site scripting) Π°Ρ‚Π°ΠΊΠΈ.

Virtual Dom

Virtual Dom

Virtual Dom

        
          <ul class="list">
            <li>item 1</li>
            <li>item 2</li>
          </ul>
        
      
      
        {
          type: "ul", props: { "class": "list" },
          children: [
            { type: "li", props: {}, children: ["item 1"] },
            { type: "li", props: {}, children: ["item 2"] }
          ]
        }
      
    

Virtual Dom

ReactElement - это Π»Π΅Π³ΠΊΠΎΠ΅, Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π΅ состояния, нСизмСняСмоС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ прСдставлСниС элСмСнта DOM. Π­Ρ‚ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π΄ΠΎΠΌ

Virtual Dom

Virtual Dom: Lets you write HTML as a function of state
Virtual Dom vs DOM

State (БостояниС)

State (БостояниС)

НС ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠΉΡ‚Π΅ состояниС Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ

      
        // Wrong
        this.state.comment = 'Hello';

        // Correct
        this.setState({comment: 'Hello'});
      
    

ОбновлСниС состояния ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ асинхронным

      
        // Wrong
        this.setState({
          counter: this.state.counter + this.props.increment,
        });

        // Correct
        this.setState((prevState, props) => ({
          counter: prevState.counter + props.increment
        }));
      
    

ОбновлСниС состояния мСрдТится автоматичСски

      
        state = { posts: [], comments: [] };

        this.setState({ posts: ["Post 1"] });
        this.setState({ comments: ["Comment 1"] });

        state = {
          posts: ["Post 1"],
          comments: ["Comment 1"]
        }
      
    

Props (ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹)

Props (ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹)

Props доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния

НСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ класс, ΠΎΠ½ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ свои собствСнныС props

ВсС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ React Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ чистыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ своих props.

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹

Β«Π“Π»ΡƒΠΏΡ‹Π΅Β» ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹

Β«Π£ΠΌΠ½Ρ‹Π΅Β» ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹

CоглашСнию по имСнованию

ВсСгда Π½Π°Ρ‡ΠΈΠ½Π°ΠΉΡ‚Π΅ ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² с большой Π±ΡƒΠΊΠ²Ρ‹.
НапримСр:

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ Класс ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹

        
          import React from "react";

          class HelloMessage extends React.Component {
            constructor()
            render() {
              return <div>Hello {this.props.message}</div>;
            }
          }

          function HelloMessage(props) {
            return <div>Hello {props.message}</div>;
          }
        
      

ΠšΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²

        
          function Welcome(props) {
            return <h1>Hello, {props.name}</h1>;
          }

          function App() {
            return (
              <div>
                <Welcome name="Sara" />
                <Welcome name="Cahal" />
                <Welcome name="Edite" />
              </div>
            );
          }
        
      

Π–ΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°

Mounting

Updating

Unmounting

Π–ΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°

React lifecycle methods diagram
React lifecycle methods diagram

Бсылки

git.io/iReact