@@ -9,12 +9,65 @@ sent!":
9
9
10
10
.. image :: _static/direct-state-change.png
11
11
12
- IDOM works a bit differently though. Previously, you'll have seen how, in order to
13
- change the view you need to :ref: `"set state" <Introduction to use_state >`. Doing so
14
- then triggers a re-render of the view .
12
+ IDOM works a bit differently though - user interactions cause event handlers to
13
+ :ref: `"set state" <Introduction to use_state >` triggering IDOM to re-render a new
14
+ version of the view rather then mutating the existing one .
15
15
16
16
.. image :: _static/idom-state-change.png
17
17
18
- ...
18
+ Given this, when IDOM "renders" something, it's as if IDOM has taken a snapshot of the
19
+ UI where all the event handlers, local variables and the view itself were calculated
20
+ using what state was present at the time of that render. Then, when user iteractions
21
+ trigger state setters, IDOM is made away of the newly set state and schedules a
22
+ re-render. When this subsequent renders occurs it performs all the same calculations as
23
+ before, but with this new state.
19
24
20
- .. idom :: _examples/send_message
25
+ As we've :ref: `already seen <When Variables Aren't Enough >`, state variables are not
26
+ like normal variables. Instead, they live outside your components and are managed by
27
+ IDOM. When a component is rendered, IDOM provides the component a snapshot of the state
28
+ in that exact moment. As a result, the view returned by that component is itself a
29
+ snapshot of the UI at that time.
30
+
31
+
32
+ Investigating State Snapshots
33
+ -----------------------------
34
+
35
+ Let's experiment with some potentially less intuitive behaviors of state to see why we
36
+ should think about it with respect to these "snapshots" in time. Take a look at the
37
+ example below and try to guess how it will behave. **What will the count be after you
38
+ click the "Increment" button? **
39
+
40
+ .. idom :: _examples/set_counter_3_times
41
+
42
+ Despite the fact that we called ``set_count(count + 1) `` three times, the count only
43
+ increments by ``1 ``! This is perhaps a surprising result, but let's break what's
44
+ happening inside the event handler to see why this is happening:
45
+
46
+ .. code-block ::
47
+
48
+ set_count(count + 1)
49
+ set_count(count + 1)
50
+ set_count(count + 1)
51
+
52
+ On the initial render of your ``Counter `` the ``number `` variable is ``0 ``. So we ought
53
+ to be able to substitute ``number `` with ``0 `` everywhere it's referenced within the
54
+ component. Since that includes the event handler too we should be able to rewrite the
55
+ three lines above as:
56
+
57
+ .. code-block ::
58
+
59
+ set_count(0 + 1)
60
+ set_count(0 + 1)
61
+ set_count(0 + 1)
62
+
63
+ Even though, we called ``set_count `` three times, every time we were actually just
64
+ doing ``set_count(1) `` three times. Only after the event handler returns will IDOM
65
+ actually perform the next render where count is ``1 ``. When it does, ``number `` will be
66
+ ``1 `` and we'll be able to perform the same subtitution as before to see what the next
67
+ number will be after we click "Increment":
68
+
69
+ .. code-block ::
70
+
71
+ set_count(1 + 1)
72
+ set_count(1 + 1)
73
+ set_count(1 + 1)
0 commit comments