[REF] store: make getters functions instead of properties

This commit is contained in:
Géry Debongnie
2019-05-10 11:50:04 +02:00
parent 147f6fced7
commit f52a15d7f6
2 changed files with 20 additions and 29 deletions
+4 -7
View File
@@ -47,7 +47,7 @@ export class Store extends EventBus {
env: any; env: any;
observer: Observer; observer: Observer;
set: any; set: any;
getters: { [name: string]: Getter }; getters: { [name: string]: (payload?) => any };
constructor(config: StoreConfig, options: StoreOption = {}) { constructor(config: StoreConfig, options: StoreOption = {}) {
super(); super();
@@ -70,12 +70,9 @@ export class Store extends EventBus {
for (let entry of Object.entries(config.getters || {})) { for (let entry of Object.entries(config.getters || {})) {
const name: string = entry[0]; const name: string = entry[0];
const func: (...any) => any = entry[1]; const func: (...any) => any = entry[1];
Object.defineProperty(this.getters, name, { this.getters[name] = payload => {
get: func.bind(this, { return func({ state: this.state, getters: this.getters }, payload);
state: this.state, }
getters: this.getters
})
});
} }
} }
+16 -22
View File
@@ -187,10 +187,8 @@ describe("basic use", () => {
}, },
}; };
const getters = { const getters = {
beerTasterName({ state }) { beerTasterName({ state }, beerID) {
return beerID => { return state.tasters[state.beers[beerID].tasterID].name;
return state.tasters[state.beers[beerID].tasterID].name;
}
}, },
bestBeerName({ state }) { bestBeerName({ state }) {
return state.beers[1].name; return state.beers[1].name;
@@ -198,7 +196,7 @@ describe("basic use", () => {
}; };
const store = new Store({ state, mutations: {}, actions: {}, getters }); const store = new Store({ state, mutations: {}, actions: {}, getters });
expect(store.getters).toBeDefined(); expect(store.getters).toBeDefined();
expect((<any>store.getters).bestBeerName).toBe("bertinchamps"); expect((<any>store.getters).bestBeerName()).toBe("bertinchamps");
expect((<any>store.getters).beerTasterName(1)).toBe("aaron"); expect((<any>store.getters).beerTasterName(1)).toBe("aaron");
}); });
@@ -220,10 +218,8 @@ describe("basic use", () => {
}, },
}; };
const getters = { const getters = {
beerTasterName({ state }) { beerTasterName({ state }, beerID) {
return beerID => { return state.tasters[state.beers[beerID].tasterID].name;
return state.tasters[state.beers[beerID].tasterID].name;
}
}, },
bestBeerName({ state }) { bestBeerName({ state }) {
return state.beers[1].name; return state.beers[1].name;
@@ -232,7 +228,7 @@ describe("basic use", () => {
const actions = { const actions = {
action({ getters }) { action({ getters }) {
expect(getters).toBeDefined(); expect(getters).toBeDefined();
expect(getters.bestBeerName).toBe("bertinchamps"); expect(getters.bestBeerName()).toBe("bertinchamps");
expect(getters.beerTasterName(1)).toBe("aaron"); expect(getters.beerTasterName(1)).toBe("aaron");
} }
}; };
@@ -258,10 +254,8 @@ describe("basic use", () => {
}, },
}; };
const getters = { const getters = {
beerTasterName({ state }) { beerTasterName({ state }, beerID) {
return beerID => { return state.tasters[state.beers[beerID].tasterID].name;
return state.tasters[state.beers[beerID].tasterID].name;
}
}, },
bestBeerName({ state }) { bestBeerName({ state }) {
return state.beers[1].name; return state.beers[1].name;
@@ -270,7 +264,7 @@ describe("basic use", () => {
const mutations = { const mutations = {
mutation({ getters }) { mutation({ getters }) {
expect(getters).toBeDefined(); expect(getters).toBeDefined();
expect(getters.bestBeerName).toBe("bertinchamps"); expect(getters.bestBeerName()).toBe("bertinchamps");
expect(getters.beerTasterName(1)).toBe("aaron"); expect(getters.beerTasterName(1)).toBe("aaron");
} }
}; };
@@ -281,18 +275,18 @@ describe("basic use", () => {
test("can use getters inside a getter", () => { test("can use getters inside a getter", () => {
const getters = { const getters = {
a({ getters }) { a({ getters }) {
return `${getters.b}${getters.c(1)}`; return `${getters.b()}${getters.c(1)}`;
}, },
b() { b() {
return 'b'; return 'b';
}, },
c() { c({}, i) {
return i => `c${i}`; return `c${i}`;
}, },
}; };
const store = new Store({ getters }); const store = new Store({ getters });
expect(store.getters.a).toBe('bc1'); expect(store.getters.a()).toBe('bc1');
}); });
}); });
@@ -593,8 +587,8 @@ describe("connecting a component to store", () => {
importantTodoText({ state }) { importantTodoText({ state }) {
return state.todos.find(todo => todo.id === state.importantID).text; return state.todos.find(todo => todo.id === state.importantID).text;
}, },
text({ state }) { text({ state }, id) {
return id => state.todos.find(todo => todo.id === id).text; return state.todos.find(todo => todo.id === id).text;
}, },
}; };
const store = new Store({ state, getters }); const store = new Store({ state, getters });
@@ -609,7 +603,7 @@ describe("connecting a component to store", () => {
const todo = state.todos.find(t => t.id === props.id); const todo = state.todos.find(t => t.id === props.id);
return { return {
activeTodoText: getters.text(todo.id), activeTodoText: getters.text(todo.id),
importantTodoText: getters.importantTodoText, importantTodoText: getters.importantTodoText(),
}; };
})(TodoItem); })(TodoItem);