tutorial react ejemplos create app javascript reactjs

javascript - ejemplos - Infracción invariable: los objetos no son válidos como React child



react js tutorial (30)

  1. Lo que sucede es que la función onClick que está intentando implementar se ejecuta de inmediato.

  2. Como nuestro código no es HTML, es javascript, por lo que se interpreta como una ejecución de función.

  3. La función onClick toma una función como argumento, no una ejecución de función.

const items = [''EN'', ''IT'', ''FR'', ''GR'', ''RU''].map((item) => { return (<li onClick={(e) => onItemClick(e, item)} key={item}>{item}</li>); });

Esto definirá una función onClick en el elemento de la lista que se ejecutará después de hacer clic en él no tan pronto como se muestre nuestro componente.

En la función de render de mi componente tengo:

render() { const items = [''EN'', ''IT'', ''FR'', ''GR'', ''RU''].map((item) => { return (<li onClick={this.onItemClick.bind(this, item)} key={item}>{item}</li>); }); return ( <div> ... <ul> {items} </ul> ... </div> ); }

todo funciona bien, sin embargo, al hacer clic en el elemento <li> recibo el siguiente error:

Error no detectado: Infracción invariable: los objetos no son válidos como React child (encontrado: objeto con claves {dispatchConfig, dispatchMarker, nativeEvent, target, currentTarget, type, eventPhase, bubbles, cancelable, timeStamp, defaultPrevented, isTrusted, view, detail, screenX , screenY, clientX, clientY, ctrlKey, shiftKey, altKey, metaKey, getModifierState, button, buttons, relatedTarget, pageX, pageY, isDefaultPrevented, isPropagationStopped, _dispatchListeners, _dispatchIDs}). Si pretendía representar una colección de elementos secundarios, use una matriz en su lugar o ajuste el objeto usando createFragment (objeto) de los complementos React. Verifique el método de renderizado de Welcome .

Si cambio a this.onItemClick.bind(this, item) a (e) => onItemClick(e, item) dentro de la función de mapa, todo funciona como se esperaba.

Si alguien pudiera explicar lo que estoy haciendo mal y explicar por qué recibo este error, sería genial

ACTUALIZACIÓN 1:
La función onItemClick es la siguiente y, al eliminar this.setState, desaparece el error.

onItemClick(e, item) { this.setState({ lang: item, }); }

Pero no puedo eliminar esta línea ya que necesito actualizar el estado de este componente


¡Solo estabas usando las teclas de objeto, en lugar de todo el objeto!

Se pueden encontrar más detalles aquí: https://github.com/gildata/RAIO/issues/48

import React, { Component } from ''react''; import PropTypes from ''prop-types''; class SCT extends Component { constructor(props, context) { super(props, context); this.state = { data: this.props.data, new_data: {} }; } componentDidMount() { let new_data = this.state.data; console.log(`new_data`, new_data); this.setState( { new_data: Object.assign({}, new_data) } ) } render() { return ( <div> this.state.data = {JSON.stringify(this.state.data)} <hr/> <div style={{color: ''red''}}> {this.state.new_data.name}<br /> {this.state.new_data.description}<br /> {this.state.new_data.dependtables}<br /> </div> </div> ); } } SCT.propTypes = { test: PropTypes.string, data: PropTypes.object.isRequired }; export {SCT}; export default SCT;

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>


Acabo de pasar por una versión realmente tonta de este error, que también podría compartir aquí para la posteridad.

Tuve algunos JSX como este:

... { ... <Foo /> ... } ...

Necesitaba comentar esto para depurar algo. Usé el atajo de teclado en mi IDE, lo que resultó en esto:

... { ... { /* <Foo /> */ } ... } ...

Lo cual, por supuesto, no es válido: ¡los objetos no son válidos como hijos secundarios!


Acabo de recibir el mismo error pero debido a un error diferente: utilicé llaves dobles como:

{{count}}

para insertar el valor de count lugar del correcto:

{count}

que el compilador presumiblemente se convirtió en {{count: count}} , es decir, tratando de insertar un Object como React child.


Algo como esto me acaba de pasar ...

Escribí:

{response.isDisplayOptions && {element} }

Colocándolo dentro de un div lo arregló:

{response.isDisplayOptions && <div> {element} </div> }


El mío tuvo que ver con olvidar las llaves entre los accesorios que se envían a un componente de presentación:

Antes de:

const TypeAheadInput = (name, options, onChange, value, error) => {

Después

const TypeAheadInput = ({name, options, onChange, value, error}) => {


En caso de que esté usando Firebase alguno de los archivos dentro de su proyecto. ¡Entonces solo coloca esa declaración de importación de Firebase al final!

Sé que esto suena loco pero ¡pruébalo!


En el caso de usar Firebase, si no funciona al poner al final las declaraciones de import , puede intentar ponerlo dentro del método del ciclo de vida, es decir, puede ponerlo dentro de componentWillMount() .

componentWillMount() { const firebase = require(''firebase''); firebase.initializeApp({ //Credentials }); }


En mi caso, se me olvidó devolver un elemento html de la función render y estaba devolviendo un objeto. Lo que hice fue envolver los {items} con un elemento html, un div simple como el siguiente

<ul>{items}</ul>


Entonces recibí este error al intentar mostrar la propiedad createdAt que es un objeto Date. Si concatena .toString() al final de esta forma, realizará la conversión y eliminará el error. Simplemente publique esto como una posible respuesta en caso de que alguien más se encuentre con el mismo problema:

{this.props.task.createdAt.toString()}


Estaba teniendo este error y resultó que estaba incluyendo involuntariamente un Objeto en mi código JSX que esperaba que fuera un valor de cadena:

return ( <BreadcrumbItem href={routeString}> {breadcrumbElement} </BreadcrumbItem> )

breadcrumbElement solía ser una cadena pero debido a un refactor se había convertido en un Objeto. Desafortunadamente, el mensaje de error de React no hizo un buen trabajo al señalarme la línea donde existía el problema. Tuve que seguir mi rastro de la pila hasta que reconocí los "accesorios" que se pasaban a un componente y luego encontré el código ofensivo.

Deberá hacer referencia a una propiedad del objeto que sea un valor de cadena o convertir el Objeto en una representación de cadena que sea deseable. Una opción podría ser JSON.stringify si realmente desea ver el contenido del Objeto.


La mía tenía que ver con poner innecesariamente llaves entre una variable que contenía un elemento HTML dentro de la declaración de retorno de la función render (). Esto hizo que React lo tratara como un objeto en lugar de un elemento.

render() { let element = ( <div className="some-class"> <span>Some text</span> </div> ); return ( {element} ) }

Una vez que eliminé las llaves del elemento, el error desapareció y el elemento se procesó correctamente.


Me gustaría agregar otra solución a esta lista.

Especificaciones:

  • "reaccionar": "^ 16.2.0",
  • "react-dom": "^ 16.2.0",
  • "react-redux": "^ 5.0.6",
  • "react-scripts": "^ 1.0.17",
  • "redux": "^ 3.7.2"

Encontré el mismo error:

Error no detectado: los objetos no son válidos como React child (encontrado: objeto con claves {XXXXX}). Si desea representar una colección de elementos secundarios, utilice una matriz en su lugar.

Este fue mi código:

let payload = { guess: this.userInput.value }; this.props.dispatch(checkAnswer(payload));

Solución:

// let payload = { // guess: this.userInput.value // }; this.props.dispatch(checkAnswer(this.userInput.value));

El problema estaba ocurriendo porque la carga útil estaba enviando el artículo como un objeto. Cuando eliminé la variable de carga útil y puse el valor de entrada de usuario en el despacho, todo comenzó a funcionar como se esperaba.


Mi error fue por escribirlo de esta manera:

props.allinfo.map((stuff, i)=>{ return (<p key={i}> I am {stuff} </p>) })



en vez de:

props.allinfo.map((stuff, i)=>{ return (<p key={i}> I am {stuff.name} </p>) })

Significaba que estaba tratando de representar el objeto en lugar del valor dentro de él.

editar: esto es para reaccionar no nativo.


Mi problema fue muy particular: en mi archivo .env , puse un comentario en la línea que tenía mi URL de API:

API_URL=https://6ec1259f.ngrok.io #comment

Invariant violation error de Invariant violation al intentar iniciar sesión / registrarme, ya que la URL de la API estaba equivocada.


Mi problema fue simple cuando me enfrenté al siguiente error:

objects are not valid as a react child (found object with keys {...}

era solo que estaba pasando un objeto con las claves especificadas en el error al intentar representar el objeto directamente en un componente usando {object} esperando que fuera una cadena

object: { key1: "key1", key2: "key2" }

mientras renderizaba en un componente React, usé algo como a continuación

render() { return this.props.object; }

pero debería haber sido

render() { return this.props.object.key1; }


Obviamente, como otros han mencionado anteriormente en este hilo, en React JSX props.children no puede ser de tipo Object . Esta NO es la causa raíz del problema en su pregunta específica.

Si lee detenidamente el texto del error, verá que React ha producido el error al intentar representar un Objeto que coincide con la firma de un SyntheticEvent :

Uncaught Error: Invariant Violation: Objects are not valid as a React child (found: object with keys {dispatchConfig, dispatchMarker, nativeEvent, target, currentTarget, type, eventPhase, bubbles, cancelable, timeStamp, defaultPrevented, isTrusted, view, detail, screenX, screenY, clientX, clientY, ctrlKey, shiftKey, altKey, metaKey, getModifierState, button, buttons, relatedTarget, pageX, pageY, isDefaultPrevented, isPropagationStopped, _dispatchListeners, _dispatchIDs}). If you meant to render a collection of children, use an array instead or wrap the object using createFragment(object) from the React add-ons. Check the render method of Welcome.

Sin embargo, uno se pregunta por qué está tratando de representar un SyntheticEvent , y aquí es donde reside la respuesta real a su pregunta. Obviamente no tiene intención de representar un SyntheticEvent , pero tiene los parámetros del controlador de eventos fuera de servicio .

En su método de render , está vinculando el controlador de eventos onItemClick al componente de su clase y pasando el item como argumento:

render() { const items = [''EN'', ''IT'', ''FR'', ''GR'', ''RU''].map((item) => { return (<li onClick={this.onItemClick.bind(this, item)} key={item}>{item}</li>); }); // ...

De acuerdo con la documentación de Function.prototype.bind , todos los argumentos pasados ​​después de thisArg se anteponen a los argumentos pasados ​​posteriormente cuando la función de destino se invoca más tarde :

arg1, arg2, ...

Argumentos para anteponer argumentos proporcionados a la función enlazada cuando se invoca la función de destino.

Si luego miramos el controlador de eventos, vemos que el parámetro e aparece antes del item parámetro.

onItemClick(e, item) { this.setState({ lang: item, }); }

Cuando se onItemClick(e, item) , el item pasado durante la invocación de bind precederá al event desencadenante, por lo que el parámetro e se establecerá en el elemento asignado y vinculado, y el item parámetro se establecerá en el event .

Cuando se llama a setState , lang se establecerá en SyntheticEvent representa el evento onClick desencadenante, y cuando intente representar el valor en this.state.lang en this.state.lang lugar, recibirá el error de Infracción Invariante que ha visto.



React child (singular) debe ser un tipo de datos primitive , no un objeto, o podría ser una etiqueta JSX (que no es nuestro caso) . Utilice el paquete Proptypes en desarrollo para asegurarse de que se realice la validación.

Solo una comparación rápida de fragmentos de código (JSX) para representarlo con una idea:

  1. Error: con el objeto que se pasa al niño

    <div> {/* item is object with user''s name and its other details on it */} {items.map((item, index) => { return <div key={index}> --item object is passed which is error--->>>{item}</div>; })} </div>

  2. Sin error: con la propiedad del objeto ( que debe ser primitiva, es decir, un valor de cadena o valor entero ) que se pasa al hijo.

    <div> {/* item is object with user''s name and its other details on it */} {items.map((item, index) => { return <div key={index}> --note the name property is primitive--->{item.name}</div>; })} </div>

TLDR; (De la fuente a continuación): asegúrese de que todos los elementos que está renderizando en JSX son primitivos y no objetos al usar React. Este error generalmente ocurre porque a una función involucrada en el envío de un evento se le ha dado un tipo de objeto inesperado (es decir, pasar un objeto cuando debería pasar una cadena) o parte de JSX en su componente no hace referencia a una primitiva (es decir, this.props vs this.props.name).

Fuente - codingbismuth.com


Recibí este error al representar algo en un operador ternario. Lo que hice:

render(){ const bar = <div>asdfasdf</div> return ({this.state.foo ? {bar} : <div>blahblah</div>}) }

Resulta que debe ser una barra sin los soportes, como:

render(){ const bar = <div>asdfasdf</div> return ({this.state.foo ? bar : <div>blahblah</div>}) }


Si está utilizando Firebase y ve este error, vale la pena verificar si lo está importando correctamente. A partir de la versión 5.0.4, debe importarlo así:

import firebase from ''@firebase/app'' import ''@firebase/auth''; import ''@firebase/database''; import ''@firebase/storage'';

Sí, lo sé. También perdí 45 minutos en esto.


Si por alguna razón importó firebase. Luego intente ejecutar npm i --save [email protected] . Esto se debe a que Firebase rompe react-native, por lo que ejecutar esto lo solucionará.


Si usa componentes sin estado, siga este tipo de formato:

const Header = ({pageTitle}) => ( <h1>{pageTitle}</h1> ); export {Header};

Esto pareció funcionar para mí.


Simplemente cree un elemento JSX válido. En mi caso, asigné un componente a un objeto.

const AwesomeButtonComponent = () => <button>AwesomeButton</button> const next = { link: "http://awesomeLink.com", text: "Awesome text", comp: AwesomeButtonComponent }

En otro lugar en mi Código, quería asignar dinámicamente ese botón.

return ( <div> {next.comp ? next.comp : <DefaultAwesomeButtonComp/>} </div> )

Resuelvo esto declarando una compilación JSX que inicialicé a través de la compilación de accesorios.

const AwesomeBtnFromProps = next.comp return ( <div> {next.comp ? <AwesomeBtnFromProps/> : <DefaultAwesomeButtonComp/>} </div> )


Solo pensé que agregaría a esto ya que tenía el mismo problema hoy, resulta que fue porque estaba devolviendo solo la función, cuando lo envolví en una etiqueta <div> comenzó a funcionar, como se muestra a continuación

renderGallery() { const gallerySection = galleries.map((gallery, i) => { return ( <div> ... </div> ); }); return ( {gallerySection} ); }

Lo anterior causó el error. Solucioné el problema cambiando la sección return() a:

return ( <div> {gallerySection} </div> );

...o simplemente:

return gallerySection


También tengo el mismo problema pero mi error es tan estúpido. Estaba tratando de acceder al objeto directamente.

class App extends Component { state = { name:''xyz'', age:10 } render() { return ( <div className="App"> // this is what I am using which gives the error <p>I am inside the {state}.</p> //Correct Way is <p>I am inside the {this.state.name}.</p> </div> ); } }


Tengo el mismo problema, en mi caso, actualizo el estado redux , y los nuevos parámetros de datos no coinciden con los parámetros antiguos, así que cuando quiero acceder a algunos parámetros a través de este error,

Quizás esta experiencia ayude a alguien


Yo también recibí este error "Los objetos no son válidos como React child" y para mí la causa se debió a llamar a una función asincrónica en mi JSX. Vea abajo.

class App extends React.Component { showHello = async () => { const response = await someAPI.get("/api/endpoint"); // Even with response ignored in JSX below, this JSX is not immediately returned, // causing "Objects are not valid as a React child" error. return (<div>Hello!</div>); } render() { return ( <div> {this.showHello()} </div> ); } }

Lo que aprendí es que la representación asincrónica no es compatible con React. El equipo de React está trabajando en una solución como se documenta aquí .


Invariant Violation: Objects are not valid as a React child que me ocurrió Invariant Violation: Objects are not valid as a React child cuando renderItem un componente que necesitaba un accesorio de renderItem , como:

renderItem={this.renderItem}

y mi error fue hacer que mi método renderItem async .


try{ throw new Error(<p>An error occured</p>) }catch(e){ return (e) }

El código anterior produjo el error, luego lo reescribí así:

try{ throw(<p>An error occured</p>) }catch(e){ return (e) }

Tome nota de la eliminación del nuevo error () en el bloque de prueba ...

Una mejor manera de escribir el código para evitar este mensaje de error. Se espera que un objeto sea arrojado literalmente sin tirar es pasar una cadena al nuevo error () en lugar de JSX y devolver JSX en su bloque catch, algo como esto :

try{ throw new Error("An error occurred") }catch(e){ return ( <p>{e.message}</p> ) }