Skip to content

Instantly share code, notes, and snippets.

@spurton
Created November 15, 2018 00:44
Show Gist options
  • Save spurton/e608fbcedbc97cd06dc7c91f5da6afcb to your computer and use it in GitHub Desktop.
Save spurton/e608fbcedbc97cd06dc7c91f5da6afcb to your computer and use it in GitHub Desktop.
Well rounded Proxy observer
const renderManObserver = function renderManObserver(value) {
console.log('Re-rendering...', `<blink>${value}</blink>`)
}
let state = {
name: '',
thisOtherThing: {
name: '',
deeper: {
name: '',
weMustGoDeeper: {
name: ''
}
}
},
ary: []
}
const reactiveHandler = {
get(obj, key) {
const prop = obj[key];
if (typeof prop === 'object') {
return new Proxy(prop, reactiveHandler)
}
return Reflect.get(...arguments)
},
set(obj, key, value) {
if (Array.isArray(obj) && key === "length") {
return true;
}
renderManObserver(value)
return Reflect.set(...arguments)
}
}
const proxyState = new Proxy(state, reactiveHandler)
proxyState.name = "Dude"
setTimeout(() => {
proxyState.color = "red" // New property
proxyState.thisOtherThing.name = "Friend" // Nested assignment
proxyState.ary.push("Doh") // Array functions
proxyState.thisOtherThing.deeper.name = "Deeeeeep" // Double nestationings
proxyState.thisOtherThing.deeper.weMustGoDeeper.name = "Waaaay deeep" // I don't even...
}, 1000)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment