Skip to content

Instantly share code, notes, and snippets.

View mweststrate's full-sized avatar
💭
I may be slow to respond.

Michel Weststrate mweststrate

💭
I may be slow to respond.
View GitHub Profile
@mweststrate
mweststrate / observe.js
Last active July 16, 2016 14:49
Object.observe is dead. Long live Mobservable.observe
// JSBin: http://jsbin.com/kekoli/edit?js,console
import {observable, observe} from "mobx";
const person = observable({
firstName: "Maarten",
lastName: "Luther"
});
const disposer = observe(person, (change) => {
console.log(`${change.type} '${change.name}' from '${change.oldValue}' to '${change.object[change.name]}'`);
@mweststrate
mweststrate / profile.jsx
Last active September 13, 2020 08:08
mobx-example
class Person {
@observable firstName = "Michel";
@observable lastName = "Weststrate";
@observable nickName;
@computed get fullName() {
return this.firstName + " " + this.lastName;
}
}
@mweststrate
mweststrate / transaction.jsx
Created December 21, 2015 18:53
transaction example
transaction(() => {
michel.firstName = "Mich";
michel.lastName = "W.";
});
@mweststrate
mweststrate / typeswitcher.ts
Created April 14, 2016 14:01
(TypeScript) typeswitcher, like switch, but with constructor based cases and expressions with inferred types
/**
* Usage:
typeSwitch(someInstance, defaultvalue)
.when(MyClass, i => result)
.when(OtherClass, i => otherResult)
.get()
In the expressions, the type of the 'i' param should be inferred correctly, see the attribute default value checks
*/
export function typeSwitch<T, R>(instance: T, defaultValue?: R): TypeSwitcher<T, R> {
@mweststrate
mweststrate / action.js
Last active May 24, 2016 20:28
MobX store with actions
export class ContactStore {
@observable contacts = [];
@observable pendingRequestCount = 0;
@computed get isLoading() {
return this.pendingRequestCount > 0;
}
@action createRandomContact() {
this.pendingRequestCount++;
@mweststrate
mweststrate / intercept.js
Last active May 25, 2016 19:36
Intercept example
const theme = observable({
backgroundColor: "#ffffff"
})
intercept(theme, "backgroundColor", change => {
if (!change.newValue) {
// ignore attempts to unset the background color
return null;
}
if (change.newValue.length === 6) {
@mweststrate
mweststrate / setstate.js
Last active June 15, 2016 19:20
Example where React.setState causes issues
class Select extends React.Component {
constructor(props, context) {
super(props, context)
this.state = {
selection: props.values[0]
};
}
render() {
return (
@mweststrate
mweststrate / mobx.js
Created June 15, 2016 19:20
Local component state with MobX
import {observable} from "mobx"
import {observer} from "mobx-react"
@observer class Select extends React.Component {
@observable selection = null; /* MobX managed instance state */
constructor(props, context) {
super(props, context)
this.selection = props.values[0]
}
@mweststrate
mweststrate / document-shim.js
Created July 4, 2016 19:36 — forked from developit/document-shim.js
Minimal stand-in for a full DOM. Mocks out basic DOM 1 node and attribute manipulation.
var document = global.document = createDocument();
export default document;
function createDocument() {
const NODE_TYPES = {
ELEMENT_NODE: 1,
ATTRIBUTE_NODE: 2,
TEXT_NODE: 3,
CDATA_SECTION_NODE: 4,
ENTITY_REFERENCE_NODE: 5,
@action performLogin(username, password, callback) {
this.fetch(`/json/${username}-${password}.json`)
.then(user => {
this.currentUser = user
callback(true)
})
.catch(err => {
callback(false)
})
}