рдкреНрд░рдпреЛрдЧ: OOP рджреБрдирд┐рдпрд╛ рд╕реЗ Redux

рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░, рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдФрд░ 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");
        //  1
        this.setAmount(data);
        //  2
        this.amount = data;
        //  3
        this.mutate({amount: data}); // ,     .
        //  3      ,     .
    }
}

, , () 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).   !


// src/store/index.js
import User from "./User"
export const user = new User()
  . . .

// src/store/User.js
export default class User extends Store {
  // ...
}

// src/App.js
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" // Primary key

    @state items = {}
    @state indices = [] // itemIds

    // -         .       .
    @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
  • , ,

рдкреБрдирд╢реНрдЪ: рдореИрдВ рдПрдХ рд╕рдлрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реЛрдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛, рдореИрдВрдиреЗ рдХреЛрдб рд╕реЗ рд╣реА рд╢реБрд░реБрдЖрдд рдХреА, рдЬреЛ рдореБрдЭреЗ рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ рдореЗрд░рд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рдпреЛрдЧ рд╣реИ рдФрд░ рдЬрд┐рди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдореИрдВ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдХрд┐рд╕реА рднреА рдЖрд▓реЛрдЪрдирд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд╕ рд╕рдВрдкрд░реНрдХ рдмрдирд╛рдП рд░рдЦреЗрдВред



All Articles