Next.js 14 App Router引入 farmer-motion 初始化异常解决,顺带学点知识

本文主要是介绍Next.js 14 App Router引入 farmer-motion 初始化异常解决,顺带学点知识,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

farmer-motion 是一个非常好用的动画库,当然用来做组件切换和路由切换过渡更不在话下。

记录一下,Next.js 14 App Router 下引入初始化异常的解决姿势,顺带扯一下 next.js 的知识点;

问题

过渡组件代码

我们拿 farmer-motion 搞一个例子来做演示, 初始化从 X 轴方向右边偏移进来,渐隐渐现的方式。

// SlideLeftTransitionWrapper.tsx
import { motion } from "framer-motion";export default function Transition({children,
}: {children: React.ReactNode;
}) {return (<motion.divinitial={{ x: 50, opacity: 0 }}animate={{ x: 0, opacity: 1 }}transition={{ ease: "easeInOut", duration: 0.75 }}>{children}</motion.div>);
}

渲染异常演示

理解及解决

Next.js 路由模式模式简单介绍

next.js 提供了两种路由方式,这里大体点一下,具体可以看官网更加详细

  • Pages Router

    • 定义页面层级路由
    • 所有组件 React Client Component(客户端组件)
    • 只能使用 Next.js 提供的预设规则,例如:文件夹名字即为路径
  • App Router

    • 定义应用程式层级的路由
    • 所有组件预设为 React Server Component(服务层组件)
    • 可自定义路由规则,比如使用正则表达式去匹配特定路径

为什么会渲染异常?

首先 farmer-motion 这个 npm 库,翻源码便可以看到大量能力的实现是依赖浏览器客户端 API 特性;

https://github.com/framer/motion/blob/main/packages/framer-motion/src/dom-entry.ts

其次上面说到了 App Router 默认是服务层组件优先!点到这个就基本知道问题所在了。

在 App Router 中,NextJS 将会区分 Client Components和 Server Components, Server Components 是一种特殊的 React 组件,它不是在浏览器端运行,而是只能在服务器端运行。又因为它们没有状态,所以不能使用只存在于客户端的特性(也就是说 useStateuseEffect 那些都是用不了的,包括 window 对象这些),所以一般我们可以用于获取数据,或者对非客户端组件进行渲染。

你客户端的组件在 Server Components 里面去渲染,不做一点点处理,肯定执行异常!

一点点处理之前的预备知识

那就是 next.js 既然是支持 SSG,SSR 混合式开发的框架。肯定要考虑这类的场景。

他们官方提供了两个特殊的指令: use clientuse server,

这两个指令是什么用呢?
简单粗暴的理解就是告诉框架,我当前这个组件适用于什么场景下渲染;

比如用了 use client, 代表我该组件只在客户端渲染, 拿一个他们文档的例子来说,

比如我们要用到 react 的 useEffectuseStateonClick特性!!

'use client'import { useState } from 'react'export default function Counter() {const [count, setCount] = useState(0)return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>)
}

next.js 这两个指令相关介绍可以这两个文档

  • https://nextjs.org/docs/app/building-your-application/rendering/client-components
  • https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations

这两个指令虽然是 next.js 团队提出来并用在了框架里面,
但是很大概率会整到 React 19 里面去。
因为 React 官方文档提供了这两个 API 的说明,并标记为实验性特性!

  • https://react.dev/reference/react/use-client
  • https://react.dev/reference/react/use-server

修正执行

代码修正
"use client";
import { motion } from "framer-motion";export default function Transition({children,
}: {children: React.ReactNode;
}) {return (<motion.divinitial={{ x: 50, opacity: 0 }}animate={{ x: 0, opacity: 1 }}transition={{ ease: "easeInOut", duration: 0.75 }}>{children}</motion.div>);
}

还能再抽象一点,比如我们取个名字, MotionElement.tsx

"use client"import { motion } from "framer-motion";export const MotionDiv = motion.div;
export const MotionSpan = motion.span;
// ts 推断依旧是保留的
运行效果图

请添加图片描述

总结

最常见的的组件和路由过渡可以看这块(farmer-motion):

  • Farmer-motion: transition
  • Farmer-motion: component

写法上,跟styled-components 好像;

有不对之处请留言,会及时修正,谢谢阅读。

这篇关于Next.js 14 App Router引入 farmer-motion 初始化异常解决,顺带学点知识的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/915073

相关文章

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

Java 中的跨域问题解决方法

《Java中的跨域问题解决方法》跨域问题本质上是浏览器的一种安全机制,与Java本身无关,但Java后端开发者需要理解其来源以便正确解决,下面给大家介绍Java中的跨域问题解决方法,感兴趣的朋友一起... 目录1、Java 中跨域问题的来源1.1. 浏览器同源策略(Same-Origin Policy)1.

如何解决yum无法安装epel-release的问题

《如何解决yum无法安装epel-release的问题》:本文主要介绍如何解决yum无法安装epel-release的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录yum无法安装epel-release尝试了第一种方法第二种方法(我就是用这种方法解决的)总结yum

python3 pip终端出现错误解决的方法详解

《python3pip终端出现错误解决的方法详解》这篇文章主要为大家详细介绍了python3pip如果在终端出现错误该如何解决,文中的示例方法讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下... 目录前言一、查看是否已安装pip二、查看是否添加至环境变量1.查看环境变量是http://www.cppcns

idea中project的显示问题及解决

《idea中project的显示问题及解决》:本文主要介绍idea中project的显示问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录idea中project的显示问题清除配置重China编程新生成配置总结idea中project的显示问题新建空的pr

redis在spring boot中异常退出的问题解决方案

《redis在springboot中异常退出的问题解决方案》:本文主要介绍redis在springboot中异常退出的问题解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴... 目录问题:解决 问题根源️ 解决方案1. 异步处理 + 提前ACK(关键步骤)2. 调整Redis消费者组

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red

Java内存区域与内存溢出异常的详细探讨

《Java内存区域与内存溢出异常的详细探讨》:本文主要介绍Java内存区域与内存溢出异常的相关资料,分析异常原因并提供解决策略,如参数调整、代码优化等,帮助开发者排查内存问题,需要的朋友可以参考下... 目录一、引言二、Java 运行时数据区域(一)程序计数器(二)Java 虚拟机栈(三)本地方法栈(四)J

Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题

《Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题》:本文主要介绍Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录一、前言二、系统架构检测三、卸载旧版 Go四、下载并安装正确版本五、配置环境变量六、验证安装七、常见

解决Java异常报错:java.nio.channels.UnresolvedAddressException问题

《解决Java异常报错:java.nio.channels.UnresolvedAddressException问题》:本文主要介绍解决Java异常报错:java.nio.channels.Unr... 目录异常含义可能出现的场景1. 错误的 IP 地址格式2. DNS 解析失败3. 未初始化的地址对象解决