mirror of https://github.com/sveltejs/svelte
parent
1c58fa91cc
commit
ab4868050f
@ -0,0 +1,11 @@
|
||||
<script>
|
||||
let x = 0;
|
||||
|
||||
function f() {
|
||||
return x;
|
||||
}
|
||||
</script>
|
||||
|
||||
<p>x={x}</p>
|
||||
<p>f()={f()}</p>
|
||||
<button on:click={()=>{x+=1;}}>Increment</button>
|
||||
@ -0,0 +1,11 @@
|
||||
<script>
|
||||
let x = 0;
|
||||
|
||||
$: f = function f() {
|
||||
return x;
|
||||
}
|
||||
</script>
|
||||
|
||||
<p>x={x}</p>
|
||||
<p>f()={f()}</p>
|
||||
<button on:click={()=>{x+=1;}}>Increment</button>
|
||||
@ -0,0 +1,62 @@
|
||||
---
|
||||
title: Reactivity and Functions
|
||||
---
|
||||
|
||||
Svelte reactivity can be slightly unintuitive once you start declaring your own functions.
|
||||
|
||||
For example, you might have some code where a reactive variable is becoming a bit complex:
|
||||
|
||||
```js
|
||||
let x = 0;
|
||||
let k = 1;
|
||||
|
||||
$: y = (x*x+k) * (x*x+k) - k;
|
||||
```
|
||||
|
||||
And want to abstract perhaps it's natural to think of there as being a function `f(x)` with `k` as a global variable:
|
||||
|
||||
```js
|
||||
let x = 0;
|
||||
let k = 1;
|
||||
|
||||
function f(x) {
|
||||
let z = x*x + k;
|
||||
return z * z - k;
|
||||
}
|
||||
|
||||
$: y = f(x);
|
||||
```
|
||||
|
||||
In this code, `y` will update when `x` changes but not when `k` changes. This is because, from svelte's perspective:
|
||||
|
||||
* `y` is a function of `f` and `x`
|
||||
* `f` is not reactive
|
||||
* Therefore, `y` only recomputes when `x` changes
|
||||
|
||||
To get our intuitive expected behavior, we need to make `f` a reactive variable:
|
||||
|
||||
```js
|
||||
$: f = function (x) {
|
||||
let z = x*x + k;
|
||||
return z * z - k;
|
||||
}
|
||||
```
|
||||
|
||||
Now from svelte's perspective:
|
||||
* `y` is a function of `f` and `x`
|
||||
* `f` is a function of `k`
|
||||
* Therefore, `y` updates when `x` or `k` change.
|
||||
|
||||
To summarize:
|
||||
|
||||
```js
|
||||
let a = 0;
|
||||
|
||||
let f = () => a; // f will *not* reactively update
|
||||
$: b = f(); // b will *not* reactively update
|
||||
$: b = f(a); // b will reactively update (svelte thinks f hasn't changed, but a has)
|
||||
|
||||
$: g = () => a; // g will reactively update
|
||||
$: b = g(); // b will reactively update
|
||||
$: b = g(a); // b will reactively update
|
||||
```
|
||||
Loading…
Reference in new issue