reactjs - 尝试在函数组件之外调用 useContext

标签 reactjs state

我试图弄清楚如何正确使用 React Context。我对尝试从函数组件外部访问 Context 的问题感到困惑。我收到错误:

Line 9:18: React Hook "useContext" is called in function "onDragEnd" which is neither a React function component or a custom React Hook function react-hooks/rules-of-hooks



这是我的整个 Schedule js 文件:
import React, { useContext } from 'react';
import PropTypes from 'prop-types';
import { DragDropContext } from 'react-beautiful-dnd';
import OrderColumn from '../ordercolumn/OrderColumn';
import { ScheduleContext } from '../../schedule-context';

const onDragEnd = (result) => {
    const { destination, source, draggableId } = result;
    const context = useContext(ScheduleContext); // <-- issue is here

    if (!destination) {
        return;
    }

    if (
        destination.droppableId === source.droppableId &&
        destination.index === source.index
    ) {
        return;
    }

    const column = context.columns[source.droppableId];
    const orderIDs = Array.from(column.orderIDs);
    orderIDs.splice(source.index, 1);
    orderIDs.splice(destination.index, 0, draggableId);

    const newColumn = {
        ...column,
        orderIDs: orderIDs
    };

    const newColumns = {
        ...context.columns,
        newColumn
    };

    context.setColumns(newColumns);
};

const Schedule = () => {
    const { orders, setOrders, columns, setColumns } = useContext(
        ScheduleContext
    );
    return (
        <DragDropContext onDragEnd={onDragEnd}>
            <div className={'full-width'}>
                <h1 className={'text-center'}>Schedule</h1>
                <div className={'lines row no-gutters'}>
                    {columns.map(function(val, index) {
                        if (index === 0) {
                            return (
                                <OrderColumn
                                    title={val.title}
                                    columnId={index}
                                    orders={orders}
                                    setOrders={setOrders}
                                    setColumns={setColumns}
                                />
                            );
                        } else {
                            return (
                                <OrderColumn
                                    title={val.title}
                                    columnId={index}
                                    setOrders={setOrders}
                                    setColumns={setColumns}
                                />
                            );
                        }
                    })}
                </div>
            </div>
        </DragDropContext>
    );
};

Schedule.propTypes = {
    orders: PropTypes.array
};

export default Schedule;

最佳答案

不要听起来油腔滑调,但本质上它的意思正是它所说的。 onDragEnd不是 React 组件,因为它没有返回 ReactElement或某种 JSX。如果您编辑了空白的 return 语句以返回 <div>的(对于所有路径)它将被视为一个组件并正常工作,但截至目前它没有返回任何内容。

关于reactjs - 尝试在函数组件之外调用 useContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58866465/

相关文章:

solr - 查询 solr 集群的节点状态

asp.net-mvc - 具有 Ajax 表单的模型状态

javascript - 为什么 React Router 更改 URL 但不更改 View

javascript - ReactJS - 获取调度结果的正确方法

javascript - 使用 ui-router 从 View 内部显示 View

java - 在请求之间用 spring 保持状态

javascript - 在 react + jsx 中动态设置 svg circle attr

javascript - DOMException : Permission denied - navigator. mediaDevices.getUserMedia( );

javascript - 如何防止对 react onClick 函数(在 useEffect 之外)进行状态更新?

javascript - react : why the tasks doesn't appear?