Link Search Menu Expand Document

Свойства и состояния компонентов

Свойства

Свойства в компонент передаются при помощи объекта props:

import React from 'react';
import ReactDOM from 'react-dom';
function WhoAmI(props) {
    return (
        <>
            <h1>My name is {props.name}, surname {props.surname}</h1>
            <a href={props.link}>My profile</a>
        </>
    )
}
ReactDOM.render(<WhoAmI name="John" surname="Smith" link="http://facebook.com" />, document.getElementById('root'));

Можно воспользоваться деструктуризацией:

import React from 'react';
import ReactDOM from 'react-dom';
function WhoAmI({name, surname, link}) {
    return (
        <>
            <h1>My name is {name}, surname {surname}</h1>
            <a href={link}>My profile</a>
        </>
    )
}
ReactDOM.render(<WhoAmI name="John" surname="Smith" link="http://facebook.com" />, document.getElementById('root'));

Также можно переписать компонент используя классы:

class WhoAmI extends Component {
    constructor(props) {
        super(props);
    }
    render() {
        const { name, surname, link } = this.props;
        return (
            <>
                <h1>My name is {name}, surname {surname}</h1>
                <a href={link}>My profile</a>
            </>
        )
    }
}

Значения установленных атрибутов более устанавливать нельзя.

Состояния

Состояния записываются в параметре state. Для изменения состояния необходимо использовать функцию как обработчик события.

Пишем функцию и ‘биндим’ её

import React, { Component } from 'react';
import ReactDOM from 'react-dom';

class WhoAmI extends Component {
    constructor(props) {
        super(props);
        this.state = {
            years: 26,
        };
        this.nextYear = this.nextYear.bind(this);
    }
    nextYear() {
        this.setState(state => ({
            years: ++state.years
        }));
    }
    render() {
        const { name, surname, link } = this.props;
        const { years } = this.state;
        return (
            <>
                <button onClick={this.nextYear}>+++</button>
                <h1>My name is {name}, surname {surname}, years = {years}</h1>
                <a href={link}>My profile</a>
            </>
        )
    }
}
const All = () => {
    return (
        <>
            <WhoAmI name="John" surname="Smith" link="http://facebook.com" />
            <WhoAmI name="Ivan" surname="Smith" link="http://vk.com" />
            <WhoAmI name="Alex" surname="Smith" link="http://facebook.com" />
        </>
    )
}
ReactDOM.render(<All />, document.getElementById('root'));

Описываем функцию в конструкторе

Необходимо описывать функцию в стрелочном виде для сохранения контекста

class WhoAmI extends Component {
    constructor(props) {
        super(props);
        this.state = {
            years: 26,
        };
        this.nextYear = () => {
            this.setState(state => ({
                years: state.years + 2
            }));
        };
    }
    render() {
        const { name, surname, link } = this.props;
        const { years } = this.state;
        return (
            <>
                <button onClick={this.nextYear}>+++</button>
                <h1>My name is {name}, surname {surname}, years = {years}</h1>
                <a href={link}>My profile</a>
            </>
        )
    }
}

Используем ClassFields (эксперриментальный способ)

В этом случае обработчик события записываем вне конструктора. Также вне конструктора записываем параметр state.

class WhoAmI extends Component {

    state = {
            years: 26,
        };
    
    nextYear = () => {
        this.setState(state => ({
            years: state.years + 3
        }));
    };
    render() {
        const { name, surname, link } = this.props;
        const { years } = this.state;
        return (
            <>
                <button onClick={this.nextYear}>+++</button>
                <h1>My name is {name}, surname {surname}, years = {years}</h1>
                <a href={link}>My profile</a>
            </>
        )
    }
}

Изменение State

State напряму изменять нельзя. Если state это массив, то нельязя просто удалить или добавить какой-то элемент, если state объект, то нельзя вырезать кусок свойства или добавить еще свойства. Для всего этого необходимо использовать промежуточные переменные. Например можно создать новый массив без каких-то элементов, либо же с новыми элементами итолько потом отправлять его в state.

Метод setState всегда после своего выполнения вызывает функцию render.