mobx - singularis labСсылки • • mobx: управление состоянием без...

48
MobX Шаповалов В.

Upload: others

Post on 26-Jul-2020

25 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

MobX

Шаповалов В.

Page 2: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

MobX

Simple, scalable state management

2

Page 3: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

Давайте разберёмся

3

Page 4: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

React

• State

• Props

4

Page 5: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

TODO list

App

TodoList

AddTodo

TodoItem

TodoItem

TodoItem

5

Page 6: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

State management?

• View

• URL

• Local storage

• Cookies

• …

6

Page 7: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

Состояние – это дерево

7

Page 8: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

Состояние – это живое дерево

8

Page 9: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

Как отслеживать изменения состояния?

9

Page 10: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

Ручная подписка на изменения

1. Используем текущее состояние

2. Подписываемся на изменения

3. Реагируем на изменения

10

Page 11: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

Ручная подписка на изменения

render(state);

state.on(‘change’, () => {

render(state);

});

11

Page 12: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

Проблемы ручной подписки

• Переподписка: отслеживание изменения всего дерева избыточно.

• Недоподписка: отслеживание отдельных полей в конце концов ведёт к неконсистентности.

12

Page 13: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

MobX

автоматическая _

MobX – автомагическая подписка

13

Page 14: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

Философия MobX

Anything that can be derived from the application state, should be derived. Automatically.

14

Page 15: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

Основные понятия

• Observable

• Computed

• Actions

• Reactions

15

Page 16: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

@observable

class Person {

...

@observable firstName = ‘Ivan’;

@observable lastName = ‘Ivanov’;

@observable nickName;

...

}

16

Page 17: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

@computed

class Person {

...

@computed get fullName() {

return this.firstName + ‘ ’ + this.lastName;

}

...

}

17

Page 18: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

@computed

Computed зависит от исходных данных и возвращает производные данные

18

Page 19: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

@action

class Person {

...

@action setNickName(nickName) {

this.nickName = nickName;

}

...

}

19

Page 20: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

Reactions

• Не возвращают результат

• Дают побочный эффект

20

Page 21: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

Reactions

Реакции срабатывают при каждом изменении исходных данных, от которых они зависят

21

Page 22: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

autorun

22

autorun(() => {

console.log(person.nickName || person.fullName);

});

Page 23: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

autorun

23

autorun(() => {

console.log(person.nickName || person.fullName);

});

Page 24: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

autorun

24

autorun(() => {

console.log(person.nickName || person.fullName);

});

Page 25: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

@computed

class Person {

...

@computed get fullName() {

return this.firstName + ‘ ’ + this.lastName;

}

...

}

25

Page 26: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

Наблюдаемые поля

> person.nickName

> person.fullName

> person.firstName

> person.lastName

26

Page 27: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

Дерево зависимостей

27

firstName

lastName

nickName

fullName

autorun

Page 28: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

Уведомление об изменении данных

28

person.setNickName(‘Aloha’);

Page 29: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

@action

class Person {

...

@action setNickName(nickName) {

this.nickName = nickName;

}

...

}

29

Page 30: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

autorun

30

autorun(() => {

console.log(person.nickName || person.fullName);

});

Page 31: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

autorun

31

autorun(() => {

console.log(person.nickName || person.fullName);

});

Page 32: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

Наблюдаемые поля

> person.nickName

Ненаблюдаемые поля

> person.fullName

> person.firstName

> person.lastName

32

Page 33: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

Дерево зависимостей

33

firstName

lastName

nickName

fullName

autorun

Page 34: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

autorun

Autorun при каждом выполнении заново собирает список зависимостей

34

Page 35: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

@observer

35

@observer

class ProfileView extends React.Component {

render() {

const person = { this.props };

if(person.nickName) {

return <div>{person.nickName}</div>;

}

return <div>{person.fullName}</div>;

}

}

Page 36: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

@observer

36

@observer

class SomeComponent extends React.Component {

render() {

if(!this.props.isEnabled) {

return null;

}

... много кода ...

}

}

Page 37: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

Динамическая подписка позволяет кардинально минимизировать количество перерисовок React-компонента

37

Page 38: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

Если React экономит нам операции с DOM, то MobX экономит нам операции с виртуальным DOM.

38

Page 39: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

Кэширование @computed

• Оно есть

• Кэширование происходит, пока есть хотя бы один подписчик

• Если подписчиков нет, кэш выкидывается, а @computedработает как обычный геттер

39

Page 40: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

MobX vs Redux

40

Page 41: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

Redux

• ООП -> функциональное программирование

• Модели -> immutable-структуры

• Методы -> экшены + редьюсеры

• Связи -> нормализация + селекторы

41

Page 42: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

MobX

• Минимум boilerplate

• Автоматическая подписка в рантайме

• Производительность из коробки

42

Page 43: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

Что ещё?

• DevTools

• mobx-utils

• mobx-state-tree

43

Page 44: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

Бонус

• React Context Api

44

Page 45: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

React Context API

• Обновлён в React 16.3

• Теперь открыт для использования (официально)

45

Page 46: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

React Context API

• React.createContext

• Provider

• Consumer

46

Page 47: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

React Context API

• Назначение – избавление от «props hell»

• Следует использовать, когда приложение ещё слишком мало, а прокидывать props уже надоело.

47

Page 48: MobX - Singularis LabСсылки •  • MobX: управление состоянием без боли  • Redux

Ссылки

• https://mobx.js.org/

• MobX: управление состоянием без боли https://www.youtube.com/watch?v=yU_hJ2trMg4

• Redux против React Context API https://habr.com/ru/post/419449/

• Редакс в реальной жизни https://iamakulov.com/talks/redux-in-real-life/

48