useMotiPressables()
import { useMotiPressables } from 'moti/interactions'
useMotiPressables lets you access the interaction state of multiple MotiPressable parents. This lets you combine multiple different interactions and build animation states with ease.
Usage
const ListItem = ({ id }) => {
const state = useMotiPressables((containers) => {
'worklet'
// access items by their unique IDs
const list = containers.list.value
const item = containers[`item-${id}`].value
let opacity = 1
if (list.hovered && !item.hovered) {
opacity = 0.5
}
return {
opacity,
}
}, [])
return <MotiView state={state} />
}
Walk Through
Imagine we have a list. The outer container component is a MotiPressable, and each item has a MotiPressable too.
<MotiPressable id="list">
{items.map(id =>
<MotiPressable id={`item-${id}`} key={id}>
<ListItem id={id} />
</MotiPressable>
)}
<MotiPressable>
Now, the ListItem component can call useMotiPressables instead of useMotiPressable.
Say we want to make all items fade away when you hover over the list, except for the actual item you're hovering.
import { useMotiPressables } from 'moti/interactions'
const ListItem = ({ id }) => {
const state = useMotiPressables((containers) => {
'worklet'
// access items by their unique IDs
const list = containers.list.value
const item = containers[`item-${id}`].value
let opacity = 1
if (list.hovered && !item.hovered) {
opacity = 0.5
}
return {
opacity,
}
}, [])
return <MotiView state={state} />
}
Performance
This hook runs on the native thread and triggers zero re-renders. Like all things moti, it has great performance out-of-the-box.
Similar to useMemo, you can also pass in a dependency array as the last argument to reduce updates:
const state = useMotiPressables(
(containers) => {
'worklet'
const list = containers.list.value
return {
opacity: list.pressed && !loading ? 0.5 : 1,
}
},
[loading] // pass an empty array if there are no dependencies
)
API
The following usages are valid:
useMotiPressables(factory, deps?)
Arguments
factoryis a worklet that returns a style object.- Its only argument is a
containersdictionary, whose keys are theidprops of the containers, and the values are the derived values of each interaction state.
- Its only argument is a
idis a unique string to identify the parentMotiPressablecomponent whose interaction state you're trying to access.depsis a dependency array, just likeuseMemo
Returns
A Moti state object, meant to be passed to any Moti component's state prop.