Comments (6)
Hi @smashercosmo, glad you enjoying it! :)
This is certainly an interesting scenario!
Though I guess you are trying to insert the same data on the some paths in the tree? We could make an exception for that. If you try to put the same object into the same path we just ignore it, cause it is already there. But if the path has changed, we yell at you :) You think that would work?
from overmind.
I think it would work) But, honestly, may be it's not worth spending time on that. It's been already a month since I last encountered this issue) Maybe it's not even hot-reload related. Next time I encounter it, I'll try to make a minimal reproducible example. Up until then, we can close the issue I think)
from overmind.
I'm also loving this library!!
I'm having a similar problem (and the same error) and it's not hot-reload's fault in my case. I don't really understand what proxy-state-tree does but here's my situation:
I have an array of states:
recordedState: [
{ activeTab: 0, cursorPosition: { column: 2, lineNumber: 1 } },
{ activeTab: 0, cursorPosition: { column: 1, lineNumber: 2 } },
{ activeTab: 0, cursorPosition: { column: 1, lineNumber: 3 } },
{activeTab: 0, cursorPosition: { column: 1, lineNumber: 4 } }
],
My main state has an activeTab
and a cursorPosition
on it as well, and I want to set my state to each of these recorded states. Setting activeTab works just fine (probably because it's just a simple number?), but when I try to update state.cursorPosition
:
state.cursorPosition = recordedState[0].cursorPosition
it gives me an error because it (naturally) finds that same cursorPosition in recordedState.0.cursorPosition
.
I'm guessing the goal is to avoid needless copying of objects, but in this case I explicitly want a copy.
My workaround was to create a new cursorPosition with the appropriate values at the point where I want to set my current state. Not a huge inconvenience.
Or am I just missing something super obvious?
from overmind.
@smashercosmo Cool, let me know if it pops up again :)
@futurepaul Hi there!
Yeah, every object in the state tree has a "proxy address". Basically the path to where it lives in the tree. When you try to put these objects on other paths proxy-state-tree
yells at you because it can only have one proxy for any path.
Overmind encourages reference by key, https://www.overmindjs.org/guides/beginner/02_definingstate?view=react&typescript=true#defining-state-references. Though in this scenario I see that it is not a s straight forward as the cursorPosition
is not really some entity to reference. In this case you really just have to be more specific as you said:
state.cursorPosition = {
column: recordedState[0].cursorPosition.column,
lineNumber: recordedState[0].cursorPosition.lineNumber
}
or just spread it:
state.cursorPosition = {
... recordedState[0].cursorPosition
}
Or you could do it by reference:
{
cursorPositionIndex: 0,
recordedState: [
{ activeTab: 0, cursorPosition: { column: 2, lineNumber: 1 } },
{ activeTab: 0, cursorPosition: { column: 1, lineNumber: 2 } },
{ activeTab: 0, cursorPosition: { column: 1, lineNumber: 3 } },
{activeTab: 0, cursorPosition: { column: 1, lineNumber: 4 } }
],
get cursorPosition() {
return this.recordedState[this.cursorPositionIndex].cursorPosition
}
}
It is a limitation in our approach really. We have talked about allowing multiple addresses on the proxies, but it has a bit of consequences. Doing things by reference works really nicely and it avoids unwanted mutations. You always know that a change you make at a specific "address" in the tree only occurs at that address.
from overmind.
Thanks for this explainer! I like the "by reference" version, seems like that's doing the least work.
from overmind.
Cool! :) Yeah, that is the most common and the one I would recommend. It is more verbose, but it is a lot easier to debug as there is only one version of any object in the tree :)
from overmind.
Related Issues (20)
- Is there any way to change states outside component? HOT 10
- [BUG] State mutation error HOT 3
- Svelte + Overmind : Function called outside component initialization
- [BUG] Statemachine errors on send(), possible documentation issue HOT 2
- Devtools: add the option to fail silently if port wasn't found HOT 2
- [BUG] Vue State Hooks loses reactivity once using in nested components. HOT 4
- [BUG] States changes are not reflecting in the UI but dev tool shows the value changed HOT 1
- [BUG] Typo in "ensureMutationTrackingIsEnabled" function HOT 3
- Error: While trying to resolve module `phoenix` HOT 1
- [BUG] TypeError with webpack 5 HOT 1
- [BUG] proxy-state-tree - You are mutating the path HOT 1
- Does the graphql package work with any subscriptions on a graphql server or is it specific to the phoenix framework?
- [BUG] svelte reactivity broken on subsequent state changes cross-components HOT 4
- [Question] Is the project dead? Is so, what are options to migrate to? HOT 5
- [BUG] Incompatible with React 18 with Strict Mode HOT 13
- Page doesn't re-render after navigation in Next 13 HOT 12
- [BUG] `overmind-react` - multiple overmind named instances HOT 1
- [BUG] Overmind JS Not working in Next JS 13 HOT 1
- [BUG] Usage of 'useSyncExternalStore' causes errors with react below version 18 HOT 3
- [BUG] Can't mock overmind for jest snapshots HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from overmind.