try 在NextJS中创建一个tic-tac-toe游戏,并try 创建一个供我的组件阅读的板上下文.在为更复杂的状态向包装器中引入了一个减缩器之后,我现在得到了一个空错误.

终端中出现错误:

警告:无效的钩子调用.钩子只能在函数组件的主体内部调用.发生这种情况的原因如下:

  1. React和渲染器的版本可能不匹配(例如React DOM)
  2. 你可能违反了规则
  3. 同一个应用程序中可能有多个React副本

我相信我在这个项目中只安装了react版本,下次使用create next app时会安装react版本.我基本上被困在哪里寻找哪里出了问题.在NextJS中提供上下文时,我可以不使用useReducer钩子而不是useState钩子吗?

上下文声明:

const TTTContext = createContext();
const TTTBoard = new Board(3);

const gameStateReducer = (state, action) => {
    switch (action.type) {
        //...reducer logic
    }
}

const TTTWrapper = ({ children }) => {    
    const [gameState, dispatch] = useReducer(gameStateReducer, {board: TTTBoard, playerPiece:"DEFAULT"});
    const gameContextValue = () => {gameState, dispatch};
    return (
        <TTTContext.Provider value={gameContextValue}>
            {children}
        </TTTContext.Provider>
    );
}

const useTTTContext = () => {
    return useContext(TTTContext)
};

module.exports = { TTTWrapper, useTTTContext }

上下文应用于_app.这里:

    <TTTWrapper>
      <Component {...pageProps} />
    </TTTWrapper>

游戏状态将在实际网格组件中检索:

import { useTTTContext } from "../contexts/TTTContext";
const {gameState, dispatch} = useTTTContext();

已解决:const {gameState, dispatch} = useTTTContext();位于其组件体之外.

推荐答案

从您提供的代码来看,问题似乎出现在最后一段代码中:

import { useTTTContext } from "../contexts/TTTContext";
const {gameState, dispatch} = useTTTContext();

useTTTContext似乎没有在任何React功能组件主体或任何定制React挂钩内使用/调用.它应该被移动到一个React函数或定制钩子体中.

Javascript相关问答推荐

React存档iframe点击行为

在React中获取数据后,如何避免不必要的组件闪现1秒?

为什么我的列表直到下一次提交才更新值/onChange

如何使覆盖div与可水平滚动的父div相关?

从包含数百行的表中获取更改后的值(以表单形式发送到后端)的正确方法是什么?

如何使用TypeScrip设置唯一属性?

如何在HTMX提示符中设置默认值?

自定义图表工具提示以仅显示Y值

当代码另有说明时,随机放置的圆圈有时会从画布上消失

在验证和提交表单后使用useNavigate()进行react 重定向,使用带有加载器和操作的路由

如果NetSuite中为空,则限制筛选

用另一个带有类名的div包装元素

react 路由DOM有条件地呈现元素

在Java脚本中构建接口的对象

如何设置时间选取器的起始值,仅当它获得焦点时?

更改管线时不渲染组件的react

将字体样式应用于material -UI条形图图例

我想为我的Reaction项目在画布上加载图像/视频,图像正在工作,但视频没有

:host::ng-Deep不将样式应用于material 复选框

将promise列表拆分到组.按组并行和顺序执行所有promise