Array indexing
Toubat opened this issue · 3 comments
It seems like array assignment by index is not supported currently. For example, if I have a store
export const store = syncedStore({
todos: [] as Todo[],
myText: {} as { text?: any },
arr: [],
fragment: "xml"
});
Then I type:
store.arr.push(1);
store.arr[0] = 1;
It gives me an error says array assignment is not supported. Is there any other way I can do to accomplish equivalent operation?
Change your array of numbers to an array of objects with one single attribute. Then modify that attribute.
export const store = syncedStore({
todos: [] as Todo[],
myText: {} as { text?: any },
arr: [] as { value: number }[],
fragment: "xml"
});
store.arr.push({value:1});
store.arr[0].value = 42;
Hi @Toubat,
The reason this is not supported, is that "assigning elements in an array" is most of the time not multi-user proof.
Assume we have an array ["green", "red", "blue"]
;
Let's say Alice and Bob both change array[1]
at the same time, while being "offline":
- Alice does
array[1] = "purple"
- Bob does
array[1] = "orange"
When these changes sync, would you expect ["green", "purple", "blue"]
, ["green", "orange", "blue"]
or ["green", "purple", "orange", "blue"]
?
When dealing with lists / arrays, I think often you'd want the latter ["green", "purple", "orange", "blue"]
. An assignment doesn't seem "idiomatic" for this, as it's better represented by a delete and insert operation.
I think adding support for assignment in arrays will lead to a lot of confusion in multi-user scenarios, I think it's cleaner to recommend users to use alternative operations (inserting and removing elements separately)
That's really helpful! Thank you for the detailed explanation!