Open
Description
A lot of the motivation behind this new proposal is making the Class API feel and work as much as natural classes as possible.
New Class Declaration API - (No Decorators)
import { initializeStore } from "vuex-class-component";
class Person extends initializeStore({ namespaced: true }) {
// state
firstname = "John";
lastname = "Doe";
age = 20;
// mutation
setBio = function( this :Person, bio :Bio ) {
this.firstname = bio.firstname;
this.lastname = bio.lastname;
this.age = bio.age
}
// action
async doAsyncStuff() {
...
}
// getters
get fullname() {
return this.firstname + " " + this.lastname;
}
// getter mutation (only allowed for getters)
set fullname( fullname :string ) {
const names = fullname.split( " " );
this.firstname = names[ 0 ];
this.lastname = names[ 1 ];
}
}
interface Bio {
firstname :string;
lastname :string;
age :number;
}
Cleaner Extraction of Vuex Modules and Proxies
import { extractVuexModule, createVuexProxy } from "vuex-class-component";
import { Person } from "./vuex/person.vuex"
export const store = new Vuex.Store({
modules: {
...extractVuexModule( Person ),
},
});
export const vxm = {
person: createVuexProxy( Person, store ),
}
Automatic Getters an Mutations for your States = 10x More Powerful Proxies.
class StateStore extends initializeStore({ namespaced: true }) {
one = "One";
two = {
deepTwo: "deep two",
deepThree: {
deeperThree: "deeper three"
anotherDeeperThree: {
ok: "Ok",
cool: "Cool"
}
}
}
}
const stateStore = createVuexProxy( StateStore, store );
stateStore.one // "One"
stateStore.one = "Changed One";
stateStore.one // Changed One
stateStore.two.deepTwo // "deep two";
stateStore.two.deepTwo = "Changed deep two";
stateStore.two.deepTwo // Changed deep two.
stateStore.two.deepThree.anotherDeeperThree.cool // "Cool";
stateStore.two.deepThree.anotherDeeperThree.cool = "Changed Cool"; // This will only mutate the cool property not the entire object.
stateStore.two.deepThree.anotherDeeperThree.cool // "Changed Cool"
What do you think?