在我组件的渲染函数中,我有:

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>
    );
  }

一切呈现良好,但当点击<li>元素时,我收到以下错误:

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.

如果我改成this。onitemclick。绑定(this, item) to (e) => onItemClick(e, item)内的映射函数,一切都按预期工作。

如果有人能解释我做错了什么,为什么我会得到这个错误,那就太好了

更新1: onItemClick函数如下所示。setState会导致错误消失。

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

但是我不能删除这一行,因为我需要更新这个组件的状态


当前回答

由于错误,react认为您正在尝试显示“li”的对象,但实际上您并没有这样做。

你在错误的地方使用了“绑定”方法。当你在“li”中使用bind时,“this”将被认为是“li”的对象。由于object有一个额外的关键字(onItemClick),因此它不是一个react标签,它是一个具有react li标签属性的js对象。

如果你在Component的构造函数中使用'bind'方法 不会有问题的。但在您的用例中,这是不可能的。所以“(e) => onItemClick(e, item)”是最好的尝试。

忽略我糟糕的英语。

其他回答

如果出于某种原因你导入了firebase。然后尝试运行npm i—save firebase@5.0.3。这是因为firebase破坏反应本机,所以运行这个将修复它。

对于那些提到Stringify()和toString()作为解决方案的人,我会说这对我有用,但我们必须理解问题以及为什么会发生。在我的代码中,这是一个简单的问题。我有2个按钮调用相同的函数,但其中一个按钮没有正确地将参数传递给该函数。

我的问题是,在render()函数的return语句中,不必要地在一个包含HTML元素的变量周围加上花括号。这使得React将其视为对象而不是元素。

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

  return (
    {element}
  )
}

一旦我从元素中移除花括号,错误就消失了,元素被正确呈现。

所发生的是您试图实现的onClick函数立即被执行。 因为我们的代码不是HTML,它是javascript,所以它被解释为一个函数执行。 onClick函数接受函数作为参数,而不是函数执行。

const项=[“EN”,“它”,“FR”、“GR”,“俄罗斯”). map((项)= > { 返回(<李onClick = {(e) = > onItemClick (e,项)}关键={项}>{项}< /李>); });

这将在List Item上定义一个onClick函数,该函数将在单击它后执行,而不是在组件呈现时立即执行。

问题是,当你渲染li时,你是在传递而不是将函数传递给你正在调用它的组件,所以一旦li被渲染,它就会调用它,你需要将引用传递给函数,而不是调用它来做这件事,如果没有参数可以传递,你可以这样写它

onClick={this.onItemClick.bind}

或者像这样,如果有争论要通过

onClick={()=>this.onItemClick.bind(this, item)}

在这种情况下,它将创建一个匿名函数来传递它的引用