Objects are not valid as a React child报错解决

目录
  • 总览
  • map
  • JSON.stringify
  • Date
  • 花括号
  • async
  • 总结

总览

当我们尝试在JSX代码中,直接渲染对象或者数组时,会产生"Objects are not valid as a React child"错误。为了解决该错误,在JSX代码中,使用map()方法来渲染数组或者访问对象的属性。

下面是错误如何发生的示例。

export default function App() {
  const employees = [
    {id: 1, name: 'Alice', country: 'Austria'},
    {id: 2, name: 'Bob', country: 'Belgium'},
    {id: 3, name: 'Carl', country: 'Canada'},
  ];
  const obj = {
    id: 4,
    name: 'Dean',
    country: 'Denmark',
  };
  // ️ Uncaught Error: Objects are not valid as a React child (found: object with keys {id, name, country}).
  // If you meant to render a collection of children, use an array instead.
  return (
    <div>
      {employees}
      {obj}
    </div>
  );
}

map

上述代码片段的问题在于,在JSX代码中我们尝试直接渲染数组或者对象。

为了解决该错误,当渲染JSX代码时,使用map()方法来渲染数组或者访问对象的属性。

export default function App() {
  const employees = [
    {id: 1, name: 'Alice', country: 'Austria'},
    {id: 2, name: 'Bob', country: 'Belgium'},
    {id: 3, name: 'Carl', country: 'Canada'},
  ];
  const obj = {
    id: 4,
    name: 'Dean',
    country: 'Denmark',
  };
  return (
    <div>
      {employees.map((employee, index) => {
        return (
          <div key={index}>
            <h2>name: {employee.name}</h2>
            <h2>country: {employee.country}</h2>
            <hr />
          </div>
        );
      })}
      <hr />
      <hr />
      <hr />
      <div>
        <h2>name: {obj.name}</h2>
        <h2>county: {obj.country}</h2>
      </div>
      <hr />
    </div>
  );
}

当调试时,可以使用console.log来打印导致错误的值。

JSON.stringify

或者,你可以在JSX代码中使用JSON.stringify()转换该值,以确保它是预期的类型。

export default function App() {
  const employees = [
    {id: 1, name: 'Alice', country: 'Austria'},
    {id: 2, name: 'Bob', country: 'Belgium'},
    {id: 3, name: 'Carl', country: 'Canada'},
  ];
  const obj = {
    id: 4,
    name: 'Dean',
    country: 'Denmark',
  };
  return (
    <div>
      <h4>{JSON.stringify(employees)}</h4>
      <h4>{JSON.stringify(obj)}</h4>
    </div>
  );
}

JSON.stringify()方法将会在对象渲染之前,将其转换为字符串。

你必须确保在JSX代码中,不会渲染对象或者数组。相反,你必须渲染原始值,比如说字符串以及数值。

Date

另一个导致该错误的常见原因是,在JSX代码中我们试图直接渲染Date对象时。

export default function App() {
  const date = new Date();
  // ️ Objects are not valid as a React child (found: [object Date]).
  return (
    <div>
      <h4>{date}</h4>
    </div>
  );
}

为了解决该问题,我们必须访问Date对象上的方法,比如说,toLocaleDateString()

export default function App() {
  return (
    <div>
      <h4>{date.toLocaleDateString()}</h4>
    </div>
  );
}

现在,我们使用字符串代替对象来进行渲染,因此该错误被解决。

花括号

如果错误依旧存在,请确保当渲染变量时,你没有使用双花括号。

export default function App() {
  const message = 'hello world';
  //  Objects are not valid as a React child (found: object with keys {message}).
  return (
    <div>
      <h4>{{message}}</h4>
    </div>
  );
}

注意message变量包裹在两组花括号内,这也是为什么React认为尝试渲染一个对象。为了解决该问题,可以只将变量包裹在一组大括号中。

export default function App() {
  return (
    <div>
      <h4>{message}</h4>
    </div>
  );
}

现在React把message变量当作一个包含字符串的表达式,而不是一个对象。

async

如果错误依旧存在,请确保在JSX代码中没有调用async函数。

async函数返回一个Promise对象,因此在JSX代码中,如果调用了async函数,则错误就会发生。

export default function App() {
  async function getData() {
    return Promise.resolve(42);
  }
  //  Objects are not valid as a React child (found: [object Promise]).
  return (
    <div>
      <h4>{getData()}</h4>
    </div>
  );
}

为了解决该错误,我们必须在useEffect钩子或者事件处理器里调用async函数,比如说,onClick

import {useEffect, useState} from 'react';
export default function App() {
  const [num, setNum] = useState(0);
  useEffect(() => {
    async function getData() {
      const result = await Promise.resolve(42);
      setNum(result);
    }
    getData();
  }, []);
  return (
    <div>
      <h4>{num}</h4>
    </div>
  );
}

useEffect钩子中调用async函数可以解决这个错误,因为我们现在渲染的是一个数字,而不是Promise对象。

总结

发生"Objects are not valid as a React child"的React错误有多种原因:

  • 在JSX代码中直接渲染对象或者数组;
  • 在JSX代码中直接渲染Date对象;
  • 在两组花括号中包裹变量,比如:{{message}}而不是{message}
  • 在JSX代码中调用async函数。

翻译原文链接:bobbyhadz.com/blog/react-…

以上就是Objects are not valid as a React child报错解决的详细内容,更多关于Objects React child报错的资料请关注我们其它相关文章!

(0)

相关推荐

  • 解决React报错No duplicate props allowed

    目录 总览 className 总结 总览 当我们为相同的组件传递相同的属性多次时,就会导致"No duplicate props allowed"警告.为了解决该警告,请确保只传递一次该属性.比如说,如果传递多次className属性,将它们连接成一个空格分隔的字符串. 下面的示例用来展示如何导致警告的. const App = () => { // ️ JSX elements cannot have multiple attributes with the same nam

  • 解决React报错React.Children.only expected to receive single React element child

    目录 总览 React片段 DOM元素 总览 当我们把多个子元素传递给一个只期望有一个React子元素的组件时,会产生"React.Children.only expected to receive single React element child"错误.为了解决该错误,将所有元素包装在一个React片段或一个封闭div中. 这里有个示例来展示错误是如何发生的. // App.js import React from 'react'; function Button(props)

  • React报错Type '() => JSX.Element[]' is not assignable to type FunctionComponent

    目录 总览 React片段 React.Fragment div 总结 总览 当我们尝试从函数组件中返回元素组成的数组时,会产生"Type '() => JSX.Element[]' is not assignable to type FunctionComponent"错误.为了解决该错误,可以将元素数组包裹在React片段中. 这里有个示例用来展示错误是如何发生的. // App.tsx import React from 'react'; // ️ Type '() =&g

  • React报错Function components cannot have string refs

    目录 总览 useRef 不会重新渲染 总览 当我们在一个函数组件中使用一个字符串作为ref时,会产生"Function components cannot have string refs"错误.为了解决该错误,使用useRef()钩子来得到一个可变的ref对象,这样你就可以在组件中作为ref使用. 这里有个示例用来展示错误是如何发生的. // App.js export default function App() { // A string ref has been found

  • React报错Too many re-renders解决

    目录 总览 传递函数 传递依赖 移入依赖 传递对象属性 记忆值 总览 产生"Too many re-renders. React limits the number of renders to prevent an infinite loop"错误有多方面的原因: 在一个组件的渲染方法中调用一个设置状态的函数. 立即调用一个事件处理器,而不是传递一个函数. 有一个无限设置与重渲染的useEffect钩子. 这里有个示例来展示错误是如何发生的: import {useState} fro

  • Can't perform a React state update on an unmounted component报错解决

    目录 总览 isMounted 提取 总览 为了解决"Warning: Can't perform a React state update on an unmounted component" ,可以在你的useEffect钩子中声明一个isMounted布尔值,用来跟踪组件是否被安装.一个组件的状态只有在该组件被挂载时才会被更新. import {useState, useEffect} from 'react'; const App = () => { const [sta

  • 解决React报错Property 'X' does not exist on type 'HTMLElement'

    目录 总览 类型断言 总结 总览 在React中,当我们试图访问类型为HTMLElement 的元素上不存在的属性时,就会发生Property 'X' does not exist on type 'HTMLElement'错误.为了解决该错误,在访问属性之前,使用类型断言来正确地类型声明元素. 这里有三个例子来展示错误是如何发生的. // App.tsx import {useEffect} from 'react'; export default function App() { useEf

  • Objects are not valid as a React child报错解决

    目录 总览 map JSON.stringify Date 花括号 async 总结 总览 当我们尝试在JSX代码中,直接渲染对象或者数组时,会产生"Objects are not valid as a React child"错误.为了解决该错误,在JSX代码中,使用map()方法来渲染数组或者访问对象的属性. 下面是错误如何发生的示例. export default function App() { const employees = [ {id: 1, name: 'Alice'

  • 解决React报错Functions are not valid as a React child

    目录 总览 调用函数 总结 总览 产生"Functions are not valid as a React child. This may happen if you return a Component instead of <Component /> from render."错误 通常是因为以下两个原因: 从render中返回一个函数引用而不是一个组件. 使用 react router 路由作为<Route path="/about" el

  • React报错解决之ref返回undefined或null

    目录 总览 useEffect 事件 总结 总览 当我们试图在其对应的DOM元素被渲染之前访问其current属性时,React的ref通常会返回undefined或者null.为了解决该问题,可以在useEffect钩子中访问ref,或者当事件触发时再访问ref. import {useRef, useEffect} from 'react'; export default function App() { const ref = useRef(); console.log(ref.curre

  • React Hook 'useEffect' is called in function报错解决

    目录 总览 声明组件 声明自定义钩子 总结 总览 为了解决错误"React Hook 'useEffect' is called in function that is neither a React function component nor a custom React Hook function",可以将函数名的第一个字母大写,或者使用use作为函数名的前缀.比如说,useCounter使其成为一个组件或一个自定义钩子. 这里有个示例用来展示错误是如何发生的. // App.j

  • React hook 'useState' is called conditionally报错解决

    目录 总览 顶层调用 总览 当我们有条件地使用useState钩子时,或者在一个可能有返回值的条件之后,会产生"React hook 'useState' is called conditionally"错误.为了解决该错误,将所有React钩子移到任何可能油返回值的条件之上. 这里有个例子用来展示错误是如何发生的. import React, {useState} from 'react'; export default function App() { const [count,

  • 解决React报错React Hook useEffect has a missing dependency

    目录 总览 禁用规则 依赖移入 依赖移出 useMemo useCallback 总览 当useEffect钩子使用了一个我们没有包含在其依赖数组中的变量或函数时,会产生"React Hook useEffect has a missing dependency"警告.为了解决该错误,禁用某一行的eslint规则,或者将变量移动到useEffect钩子内. 这里有个示例用来展示警告是如何发生的. // App.js import React, {useEffect, useState}

  • 关于React Native报Cannot initialize a parameter of type'NSArray<id<RCTBridgeModule>>错误(解决方案)

    最近,在运行一个老RN项目的时候,使用Xcode运行的时候报了如下的代码错误: Cannot initialize a parameter of type 'NSArray<id<RCTBridgeModule>> *'                 with an lvalue of type 'NSArray<Class> *__strong' Cannot initialize a parameter of type 'NSArray<Class>

  • react项目升级报错,babel报错,.babelrc配置兼容等问题及解决

    目录 react项目升级报错,babel报错,.babelrc配置兼容问题 遇到问题 最终解决方案 react运行报错TypeError 现记录一下思路 react项目升级报错,babel报错,.babelrc配置兼容问题 由于开发环境和项目版本的兼容问题,尝试升级了react-scripts后,一大堆问题接踵而至,翻遍了百度和csdn,往往解决了旧的又出现新的,或者开发没问题而打包时报错,现罗列一下遇到的主要问题和最终解决方案,以供参考. 遇到问题 digital envelope routi

  • React报错之Parameter event implicitly has an any type解决

    目录 引言 总览 设置类型 逃生舱any 确定类型 引言 原文链接:bobbyhadz.com/blog/react-… 作者:Borislav Hadzhiev 正文从这开始~ 总览 当我们不在事件处理函数中为事件声明类型时,会产生"Parameter 'event' implicitly has an 'any' type"错误.为了解决该错误,显示地为event参数声明类型. 比如说,在input元素上,将处理change事件声明类型为React.ChangeEvent<H

  • 解决React报错Parameter 'props' implicitly has an 'any' type

    目录 总览 安装类型文件 声明类型 泛型 重新安装 总览 当我们没有为函数组件或者类组件的props声明类型,或忘记为React安装类型声明文件时,会产生"Parameter 'props' implicitly has an 'any' type"错误.为了解决这个错误,在你的组件中明确地为props对象设置一个类型. 安装类型文件 你首先要确定的是你已经安装了React类型声明文件.在项目的根目录下打开终端,并运行以下命令. # ️ with NPM npm install --s

随机推荐