将函数提取到独立的 reactjs 组件中会抛出对象作为 React 子级无效(找到:[object Window])

Posted

技术标签:

【中文标题】将函数提取到独立的 reactjs 组件中会抛出对象作为 React 子级无效(找到:[object Window])【英文标题】:extracting a function into standalone reactjs component throws Objects are not valid as a React child (found: [object Window]) 【发布时间】:2021-06-28 09:44:01 【问题描述】:

当我使用 useRowCellSettings 作为组件中的函数渲染下面的组件时,它没有错误地工作,当将 useRowCellSettings 提取到独立组件中时它会引发错误。

import React from "react";
const MyDatatable = (props) => 
  let columnHeaders =  [
        title: "Id" , accessor: 'id' , index: 0,
        title: "Name" , accessor: 'name', width: "300px", index: 2
        ]
        
   let rowData = [
      id: 1, name: 'a', age: 29, qualification: 'B.com', rating: 3, profile: 'ps',
      id: 2, name: 'b', age: 35, qualification: 'B.Sc', rating: 5, profile: 'h'
   ]
        
  const [headers, setHeaders] = React.useState(columnHeaders);

  const [data, setData] = React.useState(rowData);

  const renderContent = () => 

      let contentView = data.map((row, rowIdx) => 
      let id = row[keyField];
      let tds = headers.map((header, index) => 
          //grab the content of the column
      let content = row[header.accessor];
      let cell = header.custom_render_options;

      content = useRowCellSettings(cell, content);

      return (
        <td key=index data-id=id data-row=rowIdx>
          content
        </td>
      );
    );

    return (
      <tr key=rowIdx>
          tds
      </tr>
    );
            //
   ); //closes contentView variable

   return contentView;
  

 const useRowCellSettings = (cell, content) => 

      if(cell) 
        if (typeof(cell) === "object") 
          //if (cell.type === 'image' && content) 
          if (cell.type === 'image') 
            //wrap the content with image tag & assign style from the cell
            content = content ? <img style=cell.style src=content /> :
                              <><input type="file"  id="img" name="img" /> </>
              //closes cell.type
             //close cell == object
        else if (typeof(cell) === 'function') 
            content = cell(content);
         
        //closes if cell
       return content;
  

如下图将useRowCellSettings解压成独立组件,然后调用新的独立组件而不是父组件中的useRowCellSettings函数会导致报错: 对象作为 React 子级无效(找到:[object Window])。如果您打算渲染一组子项,请改用数组。

import React from "react";
const ImageType = (props) => 

  if(props.cell) 

    if (typeof(props.cell) === "object") 

      if (props.cell.type === 'image') 

        const content = props.content ? <img style=props.cell.style src=content /> : <input type="file"  id="img" name="img" accept="image/*"/>
         //closes cel.type

      //close if cell == object
     else if (typeof(props.cell) === 'function') 
         const content = props.cell(content);
     
    //closes if cell

   return content;


【问题讨论】:

你可以重新格式化你的代码以获得更好的可读性 您尝试返回的content 是a global variable with that name。您没有在本地正确声明它 感谢@Martin 的这一点。 你的代码中还有其他地方不小心创建了全局变量:寻找columnHeadersrowData,它们没有在本地声明 【参考方案1】:
import React from 'react';
const ImageType = props => 
    let content = null;

    if (props.cell) 
        if (typeof props.cell === 'object') 
            if (props.cell.type === 'image') 
                content = props.content ? (
                    <img style=props.cell.style src=props.content />
                ) : (
                    <input type='file' id='img' name='img' accept='image/*' />
                );
            
         else if (typeof props.cell === 'function') 
            content = props.cell(props.content);
        
    

    return content;
;

您混淆了内容变量。

【讨论】:

以上是关于将函数提取到独立的 reactjs 组件中会抛出对象作为 React 子级无效(找到:[object Window])的主要内容,如果未能解决你的问题,请参考以下文章

ReactJS Array.push 函数在 setState 中不起作用

react js中如何知道组件渲染情况

更改输入时闪亮会抛出警告:错误:无法提取不存在的列

为啥在类构造函数中使用 setState 方法时 React 会抛出错误?

使用从各种输入字符串中提取的字符形成字符串。检查错误,提交时会抛出 NZEC 错误

Java RuntimeException