Show HN: Own MobX in 65 lines of code
github.com
github.com
I realised that I just want to have many views connected to one dataset, and I want to re-render all connected views when dataset was changed. This is a simple pub-sub pattern which everyone can implement himself. So, I implemented it myself in just 65 lines of code. I use this solution in production for 6 months and don't see any drawbacks.
What are the advantages of Redux or MobX over this solution?
What are the advantages of this solution over features already in React (no need of Redux) such as context and the reduce hook?
At the end of the day, you can write whatever you want from scratch, but it becomes a cost/benefit analysis.
I like this repo for getting into the guts of how popular tech works: https://github.com/danistefanovic/build-your-own-x
Functional UI is still need some sort of imperative shell [1] to manage state. You can use OOP and Remold just for "reactive" behaviour, and implement all state transitions inside object in a functional way. For example:
// Pure function
const addProduct = (order, product) => ({
total: order.total + product.price,
});
// Imperative state
class Order extends Remold {
state = {
total: 0
};
@act setState(newState) { this.state = newState; }
addProduct(p) { this.setState(addProduct(this.state, p)); }
}
> What are the advantages of this solution over features already in React (no need of Redux) such as context and the reduce hook?From the React Documentation about Context feature [2]:
> Apply it sparingly because it makes component reuse more difficult.
With Remold you don't have any problems with component's reusability. You just attach pure component to an object and "connect" object's state into component's props:
// Pure component
const OrderWidget = ({ total }) => <div class="widget">{total}</div>;
// Pure function
const addProduct = (order, product) => ({
total: order.total + product.price,
});
// Imperative state
class Order extends Remold {
state = {
total: 0
};
@act setState(newState) { this.state = newState; }
addProduct(p) { this.setState(addProduct(this.state, p)); }
@mold(OrderWidget) asWidget() { return { total: this.state.total }; }
}
[1] https://www.destroyallsoftware.com/talks/boundaries[2] https://reactjs.org/docs/context.html?no-cache=1#before-you-...