I have built my first React application with stateful stores the "normal" way, and now I am looking into using an immutable global state like used in the Este starterkit.
- The state of all stores is kept together in a single immutable data structure
- Components have no state but access data in their render() based on a store getter function
- Stores are also stateless but mutate the global application state for their domain using a cursor.
- The top level app component listens for state changes, and re-renders the whole component tree.
- Components are implemented as "pure" meaning they use shouldComponentUpdate to efficiently figure out of they can be skipped in the re-rendering.
It simplifies the application structure in a few ways:
- Components don't listen to stores and also don't copy store data to their local state. They simply grab their store state on each render.
- The global state is always a snapshot of the whole application, making it easier to debug and adding features like undo trivial.
- The global state seems to simplify isomorphic rendering.
I only read positive things about using immutable data with React, and it is recommended to avoid state in components, so I wonder if there are any disadvantages. I figured there must be because otherwise I don't see why it isn't recommended as the way to structure React apps.
Immutability is new to me, so are there any caveats I should be aware of if I start using this approach in a complex real world app?
The only minor thing I can think of is the use of forceUpdate() as Este is using it, as I've read that it is a synchronous function. Morearty for example seems to defer the updates to the next animation frame in order to batch them, but I consider this an implementation detail / optimization and not some inherit downside of the immutable single state approach.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…