forked from Mirrors/bubbletea
42 lines
1.3 KiB
Markdown
42 lines
1.3 KiB
Markdown
# Common Patterns in Bubble Tea
|
|
|
|
So you've started building your app, but now you're not sure if you're doing
|
|
things the "right way".
|
|
|
|
Well thankfully, we have some common patterns that we see when building Bubble
|
|
Tea applications that should help to simplify your decision-making.
|
|
|
|
## I only want the model that triggered the message to update
|
|
|
|
To figure out whether a component should process the message or not, simply
|
|
include an ID in the message. The ID will match the ID field of your child
|
|
model and can be handled in that child model's `Update`.
|
|
|
|
We use this pattern in our [spinner example](https://github.com/charmbracelet/bubbles/blob/master/spinner/spinner.go)
|
|
|
|
These spots in particular:
|
|
https://github.com/charmbracelet/bubbles/blob/master/spinner/spinner.go#L145-L149
|
|
|
|
```go
|
|
// If an ID is set, and the ID doesn't belong to this spinner, reject
|
|
// the message.
|
|
if msg.ID > 0 && msg.ID != m.id {
|
|
return m, nil
|
|
}
|
|
```
|
|
|
|
https://github.com/charmbracelet/bubbles/blob/master/spinner/spinner.go#L164
|
|
https://github.com/charmbracelet/bubbles/blob/master/spinner/spinner.go#L195-L203l
|
|
|
|
```go
|
|
func (m Model) tick(id, tag int) tea.Cmd {
|
|
return tea.Tick(m.Spinner.FPS, func(t time.Time) tea.Msg {
|
|
return TickMsg{
|
|
Time: t,
|
|
ID: id,
|
|
tag: tag,
|
|
}
|
|
})
|
|
}
|
|
```
|