I\'m trying to create a simple grid-based editor for a data structure and I\'m having a couple conceptual problems with React.js. Their documentation is not very helpful on this
I think this is the most underdocumented part of React right now. The suggested way to communicate between components is to simply set props when communicating from parent to child and to pass callbacks through props when communicating from child to parent.
When you feel that you want to share data between sibling components, it means that there should be a parent component managing the state and passing it to both components. Most of the time, your state should live near the top of your component hierarchy, and each piece of info should live in (at most) one component's state, not more.
For a bit more about this, see Pete Hunt's blog post, Thinking in React.
With this in mind, I've updated your fiddle.
I've changed Grid
so that it doesn't maintain its own state but instead always displays the data passed via its props, and calls onCellChange
from its props when it wants to request a change of the data from its parent. (The Grid
component will expect its parent to update the grid's data
prop with the modified data. If the parent refuses (perhaps because of failed data validation or similar), you end up with a read-only grid.)
You'll also notice that I created a new Editor
component to wrap the grid and its sibling button. The Editor
component now essentially manages the entire page. In a real app, it's likely that the contents of the grid would be needed elsewhere and so the state would be moved higher. I removed your Button
component because it wasn't doing much beyond the native tag; I left
Cell
but it too could be removed -- Row
could easily use tags directly.
Hope this makes sense. Feel free to ask if anything's unclear. There are usually also people around in the #reactjs IRC room if you want to chat more about any of this.