The For Objects
Often when building UI, you need to deal with lists, arrays and tables. For example:
- creating an array of TextLabels for a player list
- generating a settings page from pairs of keys and values in a configuration
- filling a grid with inventory slots and items
Most of these use cases involve processing one table into another:
- converting an array of player names into an array of TextLabels
- converting a table of settings into a table of UI controls
- converting an array of inventory items into an array of slot UIs
So, to assist with these use cases, Fusion has a few state objects which are
specially designed for working with arrays and tables. These are known as the
For
objects.
The Problem¶
To start, let's try making a player list using the basic state objects from before. Let's define a changeable list of player names and some basic UI:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
Now, let's make a Computed
which generates that list of text labels for us:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
This is alright, but there are a few problems:
- Firstly, there's a fair amount of boilerplate - in order to generate the list
of text labels, you have to create a
Computed
, initialise a new table, write a for-loop to populate the table, then return it.- Boilerplate is generally annoying, and especially so for a task as common as dealing with lists and tables. It's less clear to read and more tedious to write.
- Secondly, whenever
playerNames
is changed, you reconstruct the entire list, destroying all of your instances and any data associated with them. This is both inefficient and also causes issues with data loss.- Ideally, you should only modify the text labels for players that have joined or left, leaving the rest of the text labels alone.
To address this shortcoming, the For
objects provide a cleaner way to do the
same thing, except with less boilerplate and leaving unchanged values alone:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Over the next few pages, we'll take a look at three state objects:
ForValues
, which lets you process just the values in a table.ForKeys
, which lets you process just the keys in a table.ForPairs
, which lets you do both at the same time.