useData is state a piece of the scene owns, read as lives.value; useWatch runs when it changes. Press Space to take a hit and R to reset. The setter takes three forms, all here: the value itself, a function that returns the next one, and a function that changes it in place. The watch runs once on the first frame too, so the screen starts right without being written twice. Change it with lives.value = 0 instead and the watch will not hear about it: the same rule React has.
When not to reach for it. For a value only this component uses, a plain let in the body is enough: the body runs once, but everything written inside it sees the same variable afterwards. What useData adds are two things a local variable cannot do: it is written into the scene document, so a saved game gives the value back; and it has an identity, so it can be handed to another part of the scene, which is the next example.