文档

文档

React

Radix

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 组件,例如ToastTooltip,非常适合退出动画,但没有 Motion 的 AnimatePresence 就无法执行它们。

AnimatePresence 通过挂载和卸载其子元素来工作。 这就是它跟踪哪些组件正在退出的方式

<AnimatePresence>
  {isOpen && <motion.div exit={{ opacity: 0 }} />}
</AnimatePresence>

默认情况下,Radix 倾向于在内部控制像 isOpen 这样的状态。 但是,它提供了一些辅助属性,供我们外部跟踪或控制此状态。

例如,Tooltip 组件提供了 openonOpenChange 属性,这使得跟踪 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+是一次性付款、终身会员资格,让您可以访问不断增长的库的源代码高级示例,以及高级组件,如 CursorAnimateNumber

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 组件,例如ToastTooltip,非常适合退出动画,但没有 Motion 的 AnimatePresence 就无法执行它们。

AnimatePresence 通过挂载和卸载其子元素来工作。 这就是它跟踪哪些组件正在退出的方式

<AnimatePresence>
  {isOpen && <motion.div exit={{ opacity: 0 }} />}
</AnimatePresence>

默认情况下,Radix 倾向于在内部控制像 isOpen 这样的状态。 但是,它提供了一些辅助属性,供我们外部跟踪或控制此状态。

例如,Tooltip 组件提供了 openonOpenChange 属性,这使得跟踪 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+是一次性付款、终身会员资格,让您可以访问不断增长的库的源代码高级示例,以及高级组件,如 CursorAnimateNumber

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 组件,例如ToastTooltip,非常适合退出动画,但没有 Motion 的 AnimatePresence 就无法执行它们。

AnimatePresence 通过挂载和卸载其子元素来工作。 这就是它跟踪哪些组件正在退出的方式

<AnimatePresence>
  {isOpen && <motion.div exit={{ opacity: 0 }} />}
</AnimatePresence>

默认情况下,Radix 倾向于在内部控制像 isOpen 这样的状态。 但是,它提供了一些辅助属性,供我们外部跟踪或控制此状态。

例如,Tooltip 组件提供了 openonOpenChange 属性,这使得跟踪 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+是一次性付款、终身会员资格,让您可以访问不断增长的库的源代码高级示例,以及高级组件,如 CursorAnimateNumber

Motion+ 包含大多数 Radix 组件的示例

保持关注

订阅以获取最新消息和更新。

保持关注

订阅以获取最新消息和更新。