反应上下文奇怪的数据类型错误

Posted

技术标签:

【中文标题】反应上下文奇怪的数据类型错误【英文标题】:react context weird data type errors 【发布时间】:2021-10-18 02:53:45 【问题描述】:

我一直在尝试了解反应上下文以及如何从子组件更改它,但我不断收到奇怪的错误

在这里,我创建了一个数组上下文,并尝试在从子项丢弃的项目上更改它,但它给了我错误 TypeError: context.push 不是函数

import  React, createContext, useContext  from "react";
import  useState  from "react";

import  useDrag, useDrop  from "react-dnd";
import  DndProvider  from "react-dnd";
import  html5Backend  from "react-dnd-html5-backend";

function WebsiteBody(props) 
  const [context, add_to_context] = useContext(WebsiteContext);

  const [ droppedItem, didDrop, isOver, canDrop , drop] = useDrop(() => (
    accept: "card",
    drop: () => (
      name: "body",
    ),
    collect: (monitor) => (
      droppedItem: monitor.getItem(),
      didDrop: monitor.didDrop(),
      isOver: monitor.isOver(),
      canDrop: monitor.canDrop(),
    ),
  ));
 
  if (didDrop) 
    add_to_context(droppedItem.item);
  

  return (
    <div
      ref=drop
      w="100vw"
      h="100vh"
      backgroundColor="yellow"
      display="flex"
    >
      
      dropped_items.map((item) => item.name)
    </Box>
  );


const MyContext = createContext([]);

function App(props) 
  const [context, setContext] = useState([]);

  function add_item(item) 
    setContext(context.push(item));

  

  return (
      <DndProvider backend=HTML5Backend>
        <MyContext.Provider value=[context, add_item]>
          <WebsiteBody></WebsiteBody>
        </MyContext.Provider>
      </DndProvider>
  );


export default App;

【问题讨论】:

你能在你的问题中添加错误的堆栈跟踪吗? context是一个只读变量,如果你尝试修改它是不行的,试试[...context, item]而不是context.push(item) 【参考方案1】:

你的代码存在三个问题:

    直接使用Array.push 改变状态 ContextTypes 不同。一个是MyContext,另一个是WebsiteContext。 为createContext 提供的默认值无效

修改代码如下:

WebsiteContext.js

export default React.createContext([
  [],  // default value for context value 
  () =>  // default value for addItem
]);

App.js

import WebsiteContext from './WebsiteContext';

const [context, setContext] = useContext([]);

const addItem = (item) => 
  setContext(old => [...old, item]);
;

<WebsiteContext.Provider value=[context, addItem]>
</WebsiteContext.Provider>

WebsiteBody.js

import WebsiteContext from './WebsiteContext';

const [context, add_to_context] = useContext(WebsiteContext);

【讨论】:

以上是关于反应上下文奇怪的数据类型错误的主要内容,如果未能解决你的问题,请参考以下文章

布尔数据似乎在 vue 3 中的 vue 反应中表现得很奇怪

反应/打字稿:参数“道具”隐含了“任何”类型错误

如何等待数据被填充到反应中?

反应固定数据表:未捕获类型错误:this._dataList.getSize 不是函数

我在 onAttach(Context) 中遇到了这个奇怪的错误

尝试加载反应式程序集时,Expression Blend 4 失败