Fix link + docs (#2476)
* Fix a copy/paste fail Also, fix some incorrect tests. * Clarify how routes are diffed, improve key + route resolver docs - Add some missing links to route resolvers and single-child keyed fragments, clarify usage around them. - Drive-by: remove a redundant sentence that itself was missing a period. * Actually test for propagation and preventDefault Previously, the mocks were both junk and inaccurate. No wonder my tests were silently failing - they were wrong and not obviously wrong.
This commit is contained in:
parent
c3cca5f8e2
commit
4cbcaf2936
6 changed files with 288 additions and 108 deletions
23
docs/keys.md
23
docs/keys.md
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
- [What are keys](#what-are-keys)
|
||||
- [How to use](#how-to-use)
|
||||
- [Single-child keyed fragments](#single-child-keyed-fragments)
|
||||
- [Debugging key related issues](#debugging-key-related-issues)
|
||||
|
||||
---
|
||||
|
|
@ -75,7 +76,9 @@ function correctUserList(users) {
|
|||
}
|
||||
```
|
||||
|
||||
Also, you might want to reinitialize a component. You can use the common pattern of a single-child keyed fragment where you change the key to destroy and reinitialize the element.
|
||||
#### Single-child keyed fragments
|
||||
|
||||
Sometimes, you might want to reinitialize a component on command. You can use the common pattern of a single-child keyed fragment where you change the key to destroy and reinitialize the element.
|
||||
|
||||
```javascript
|
||||
function ResettableToggle() {
|
||||
|
|
@ -96,6 +99,20 @@ function ResettableToggle() {
|
|||
}
|
||||
```
|
||||
|
||||
You can also bind it to a known identity, for things like item views where you need to fetch a remote resource based on an ID. It's usually simpler than implementing all the logic to diff the ID and re-fetch a resource if it changes.
|
||||
|
||||
```javascript
|
||||
function Page() {
|
||||
return {
|
||||
view: function() {
|
||||
return m(Layout, [
|
||||
[m(ItemView, {key: m.route.param("id")})],
|
||||
])
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Debugging key related issues
|
||||
|
|
@ -120,7 +137,7 @@ users.map(function(u) {
|
|||
If you refactor the code and make a user component, the key must be moved out of the component and put on the component itself, since it is now the immediate child of the array.
|
||||
|
||||
```javascript
|
||||
// AVOID
|
||||
// AVOID - doesn't work
|
||||
var User = {
|
||||
view: function(vnode) {
|
||||
return m("div", { key: vnode.attrs.user.id }, [
|
||||
|
|
@ -137,7 +154,7 @@ users.map(function(u) {
|
|||
|
||||
#### Avoid wrapping keyed elements in arrays
|
||||
|
||||
Arrays are [vnodes](vnodes.md), and therefore keyable. You should not wrap arrays around keyed elements
|
||||
Arrays are [vnodes](vnodes.md), and therefore keyable. You should not wrap arrays around keyed elements outside [single-child keyed fragments](#single-child-keyed-fragments).
|
||||
|
||||
```javascript
|
||||
// AVOID
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue