Motion 与 Radix 集成
Radix是最流行的 React 组件库之一,只需几个步骤即可使用 Motion for React 进行动画制作。
在本指南中,我们将学习如何使用 motion
组件组件与 Radix 原始组件一起使用,以及退出和布局动画的特定设置。
设置 motion
组件
大多数 Radix 组件渲染并控制它们自己的 DOM 元素。但它们也提供了以下asChild
属性属性,当设置为 true
时,将使组件使用提供的第一个子元素作为其 DOM 节点。
通过传递一个 motion
组件作为这个子元素,我们现在可以像平常一样使用它的所有动画属性
<Toast.Root asChild> <motion.div initial={{ opacity: 0 }} animate={{ opacity: 1 }} layout
退出动画
许多 Radix 组件,例如Toast或Tooltip,非常适合退出动画,但没有 Motion 的 AnimatePresence
就无法执行它们。
AnimatePresence
通过挂载和卸载其子元素来工作。 这就是它跟踪哪些组件正在退出的方式
<AnimatePresence> {isOpen && <motion.div exit={{ opacity: 0 }} />} </AnimatePresence>
默认情况下,Radix 倾向于在内部控制像 isOpen
这样的状态。 但是,它提供了一些辅助属性,供我们外部跟踪或控制此状态。
例如,Tooltip 组件提供了 open
和 onOpenChange
属性,这使得跟踪 tooltip 状态变得容易
const [isOpen, setOpen] = useState(false) return ( <Tooltip.Provider> <Tooltip.Root open={isOpen} onOpenChange={setOpen}>
现在我们可以使用这个状态来有条件地渲染 tooltip 内容。
<AnimatePresence> {isOpen && ( <Tooltip.Portal forceMount> <Tooltip.Content asChild> <motion.div exit={{ opacity: 0 }}
您可以在上面的示例中看到,我们在 Tooltip.Portal
组件上使用了 forceMount
属性。 因为 Radix 期望始终渲染其所有子元素,所以当我们像这样有条件地渲染子元素时,将 forceMount
设置为 true
可以使我们的进入/退出动画正常工作。
布局动画
布局动画也需要这种相同的从组件中提升状态的模式。
const [tab, setTab] = useState("account") return ( <Tabs.Root value={tab} onValueChange={setTab} asChild> <motion.div layout>
这是为了确保 motion
组件知道在状态更改时执行布局动画。 您甚至可以将此状态传递给 layoutDependency
以获得更好的性能。
<motion.div layout layoutDependency={tab}>
Motion+ 示例
Motion+是一次性付款、终身会员资格,让您可以访问不断增长的库的源代码高级示例,以及高级组件,如 Cursor
和 AnimateNumber
。
Motion+ 包含大多数 Radix 组件的示例
Radix是最流行的 React 组件库之一,只需几个步骤即可使用 Motion for React 进行动画制作。
在本指南中,我们将学习如何使用 motion
组件组件与 Radix 原始组件一起使用,以及退出和布局动画的特定设置。
设置 motion
组件
大多数 Radix 组件渲染并控制它们自己的 DOM 元素。但它们也提供了以下asChild
属性属性,当设置为 true
时,将使组件使用提供的第一个子元素作为其 DOM 节点。
通过传递一个 motion
组件作为这个子元素,我们现在可以像平常一样使用它的所有动画属性
<Toast.Root asChild> <motion.div initial={{ opacity: 0 }} animate={{ opacity: 1 }} layout
退出动画
许多 Radix 组件,例如Toast或Tooltip,非常适合退出动画,但没有 Motion 的 AnimatePresence
就无法执行它们。
AnimatePresence
通过挂载和卸载其子元素来工作。 这就是它跟踪哪些组件正在退出的方式
<AnimatePresence> {isOpen && <motion.div exit={{ opacity: 0 }} />} </AnimatePresence>
默认情况下,Radix 倾向于在内部控制像 isOpen
这样的状态。 但是,它提供了一些辅助属性,供我们外部跟踪或控制此状态。
例如,Tooltip 组件提供了 open
和 onOpenChange
属性,这使得跟踪 tooltip 状态变得容易
const [isOpen, setOpen] = useState(false) return ( <Tooltip.Provider> <Tooltip.Root open={isOpen} onOpenChange={setOpen}>
现在我们可以使用这个状态来有条件地渲染 tooltip 内容。
<AnimatePresence> {isOpen && ( <Tooltip.Portal forceMount> <Tooltip.Content asChild> <motion.div exit={{ opacity: 0 }}
您可以在上面的示例中看到,我们在 Tooltip.Portal
组件上使用了 forceMount
属性。 因为 Radix 期望始终渲染其所有子元素,所以当我们像这样有条件地渲染子元素时,将 forceMount
设置为 true
可以使我们的进入/退出动画正常工作。
布局动画
布局动画也需要这种相同的从组件中提升状态的模式。
const [tab, setTab] = useState("account") return ( <Tabs.Root value={tab} onValueChange={setTab} asChild> <motion.div layout>
这是为了确保 motion
组件知道在状态更改时执行布局动画。 您甚至可以将此状态传递给 layoutDependency
以获得更好的性能。
<motion.div layout layoutDependency={tab}>
Motion+ 示例
Motion+是一次性付款、终身会员资格,让您可以访问不断增长的库的源代码高级示例,以及高级组件,如 Cursor
和 AnimateNumber
。
Motion+ 包含大多数 Radix 组件的示例
Radix是最流行的 React 组件库之一,只需几个步骤即可使用 Motion for React 进行动画制作。
在本指南中,我们将学习如何使用 motion
组件组件与 Radix 原始组件一起使用,以及退出和布局动画的特定设置。
设置 motion
组件
大多数 Radix 组件渲染并控制它们自己的 DOM 元素。但它们也提供了以下asChild
属性属性,当设置为 true
时,将使组件使用提供的第一个子元素作为其 DOM 节点。
通过传递一个 motion
组件作为这个子元素,我们现在可以像平常一样使用它的所有动画属性
<Toast.Root asChild> <motion.div initial={{ opacity: 0 }} animate={{ opacity: 1 }} layout
退出动画
许多 Radix 组件,例如Toast或Tooltip,非常适合退出动画,但没有 Motion 的 AnimatePresence
就无法执行它们。
AnimatePresence
通过挂载和卸载其子元素来工作。 这就是它跟踪哪些组件正在退出的方式
<AnimatePresence> {isOpen && <motion.div exit={{ opacity: 0 }} />} </AnimatePresence>
默认情况下,Radix 倾向于在内部控制像 isOpen
这样的状态。 但是,它提供了一些辅助属性,供我们外部跟踪或控制此状态。
例如,Tooltip 组件提供了 open
和 onOpenChange
属性,这使得跟踪 tooltip 状态变得容易
const [isOpen, setOpen] = useState(false) return ( <Tooltip.Provider> <Tooltip.Root open={isOpen} onOpenChange={setOpen}>
现在我们可以使用这个状态来有条件地渲染 tooltip 内容。
<AnimatePresence> {isOpen && ( <Tooltip.Portal forceMount> <Tooltip.Content asChild> <motion.div exit={{ opacity: 0 }}
您可以在上面的示例中看到,我们在 Tooltip.Portal
组件上使用了 forceMount
属性。 因为 Radix 期望始终渲染其所有子元素,所以当我们像这样有条件地渲染子元素时,将 forceMount
设置为 true
可以使我们的进入/退出动画正常工作。
布局动画
布局动画也需要这种相同的从组件中提升状态的模式。
const [tab, setTab] = useState("account") return ( <Tabs.Root value={tab} onValueChange={setTab} asChild> <motion.div layout>
这是为了确保 motion
组件知道在状态更改时执行布局动画。 您甚至可以将此状态传递给 layoutDependency
以获得更好的性能。
<motion.div layout layoutDependency={tab}>
Motion+ 示例
Motion+是一次性付款、终身会员资格,让您可以访问不断增长的库的源代码高级示例,以及高级组件,如 Cursor
和 AnimateNumber
。
Motion+ 包含大多数 Radix 组件的示例