рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░, рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдФрд░ OOP, Redux рдФрд░ MobX, React рдФрд░ Angular рдХреЗ рдЕрдиреБрдпрд╛рдпрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдкрд╡рд┐рддреНрд░ рдпреБрджреНрдз рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЬрд╛рд░реА рд╣реИред рдХрдИ рд╕рд╛рд▓реЛрдВ рддрдХ рдореИрдВрдиреЗ рдЙрд╕рд╕реЗ рдкрд░рд╣реЗрдЬ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЕрдм рдЗрд╕ рд╡рд┐рд╖рдп рдиреЗ рдореБрдЭреЗ рдЫреВ рд▓рд┐рдпрд╛ рд╣реИред

рдЕрдм Redux рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реИрдХрдбрд╝реЛрдВ рд╣рдЬрд╛рд░реЛрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рдореБрджрд╛рдп рдзреАрд░реЗ-рдзреАрд░реЗ рдХрдо рд▓рдЪреАрд▓рд╛ рд╣реЛрддрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рдХрдВрдкрдиреА рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рд┐рдПрдХреНрдЯ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, Redux рдЖрдорддреМрд░ рдкрд░ рдХрд┐рдЯ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдирдлрд░рдд рдЬрдорд╛ рд╣реЛ рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдФрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИред рдХреНрдпреЛрдВ Redux рдЗрддрдирд╛ рдмреБрд░рд╛ рд╣реИ рдФрд░ рдХреНрдпреЛрдВ рдпрд╣ рдФрд░ рднреА рдмрджрддрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрдИ рд▓реЗрдЦреЛрдВ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд▓реЗрдЦрдХреЛрдВ рдХреЛ рднрд╛рд╡рдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╡реЗ рдЦреБрдж рдХреЛ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрджреНрджреЗрд╢реНрдпрдкреВрд░реНрдг рд▓рд┐рдЦрд┐рдд рдЕрдиреБрд╡рд╛рдж " рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ Redux " рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рдЙрджреНрдзрд░рдг рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:
Redux, , . , Redux, , , ┬л , jQuery┬╗.
, .
: .
React , , . , , , MobX, , ...
тАж ?
, ( Redux) тАФ . , Redux.
, Vuex, , , . vuex @, , , . , . тАФ , , , .
Store
, , , :
import {Store, state, Mutation, Action} from "@disorrder/storm";
export default class Account extends Store {
@state amount = 0
@Mutation setAmount(val = 0) {
return {amount: val};
}
@Action async updateAmount() {
let {data} = await api.get("/user/account");
this.setAmount(data);
this.amount = data;
this.mutate({amount: data});
}
}
, , () Redux. vuex , .
Store
state, . mutate(), state, .
@state
( ) state.
Mutation
тАФ , reducer Redux, state. , "" . Redux, - action , . Redux , action.type . Mutation .
Action
тАФ . API, , action. , , , , .
vuex action action, . , , . , .
, React Vue. connect ( Redux). !
import User from "./User"
export const user = new User()
. . .
export default class User extends Store {
}
import user from "./store";
class App extends Component {
componentDidMount() {
user.subscribe((mutation, oldState) => {
this.setState({});
});
}
}
. subscribe
user, mutation
, .
Collection pattern
, , . , . , . , , CRUD. . (, , )
export default class Collection extends Store {
url = "/"
pk = "id"
@state items = {}
@state indices = []
@Mutation __add(item) {
const id = item[this.pk];
this.items = {...this.items, [id]: item};
this.indices = [...this.indices, id];
}
@Mutation add(item) {
const id = item[this.pk];
const items = {...this.items, [id]: item};
let mutation = {items};
const rewrite = id in this.items;
if (!rewrite) {
mutation.indices = [...this.indices, id];
}
return mutation;
}
@Action async create(data) {
let item = await api.post(this.url, data);
this.add(item);
}
@Action async getById(id) {
let item = await api.get(`${this.url}/${id}`);
this.add(item);
}
@Action async getList(id, params) {
let items = await api.get(this.url, {params});
items.forEach(this.add.bind(this));
}
}
, :
export default class Users extends Collection {
url = "/users"
}
. . : , SOLID, DRY, KISS тАФ , .
- 150 . , , . , "Redux , ". !
- . Redux reducers actions .
- switch-case
- , . Babel. createStore, .
- subscribe, watcher
, ,
рдкреБрдирд╢реНрдЪ: рдореИрдВ рдПрдХ рд╕рдлрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реЛрдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛, рдореИрдВрдиреЗ рдХреЛрдб рд╕реЗ рд╣реА рд╢реБрд░реБрдЖрдд рдХреА, рдЬреЛ рдореБрдЭреЗ рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ рдореЗрд░рд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рдпреЛрдЧ рд╣реИ рдФрд░ рдЬрд┐рди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдореИрдВ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдХрд┐рд╕реА рднреА рдЖрд▓реЛрдЪрдирд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд╕ рд╕рдВрдкрд░реНрдХ рдмрдирд╛рдП рд░рдЦреЗрдВред
