Skip to content

Instantly share code, notes, and snippets.

@drcmda
Created March 24, 2017 12:27
Show Gist options
  • Save drcmda/4d30f9a979988412eb124d96450eed68 to your computer and use it in GitHub Desktop.
Save drcmda/4d30f9a979988412eb124d96450eed68 to your computer and use it in GitHub Desktop.
vue connect
import cloneDeep from 'lodash/cloneDeep';
import Session from 'awv3/session';
// Create & export session
export const session = window.session = new Session({ material: 'multi' });
// Export store
export const store = session.store;
// Mixin factory. Maps Redux props to Vue components
export const connect = (selector, props) => {
let state = undefined;
return {
data: () => ({ state: { } }),
created() {
state = selector(store.getState(), this);
this.state = Object.keys(state).reduce((prev, key, index) =>
({ ...prev, [key]: cloneDeep(state[key]) }), {})
this.unsubscribe = store.subscribe(() => {
let next = selector(store.getState(), this);
Object.keys(state).forEach(key => {
if (state[key] !== next[key]) {
this.$set(`state.${key}`, cloneDeep(next[key]));
}
});
state = next;
});
},
beforeDestroy() {
this.unsubscribe();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment