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 组件的示例
