javascript Facebook React:不变违规和元素没有自动安装

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/21554584/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-27 21:09:31  来源:igfitidea点击:

Facebook React: Invariant Violation and elements than didn't mount automatically

javascriptreactjs

提问by user1050817

I am learning Facebook React by doing a small example. I decided check if my knowledge about the thisbinding was ok so I created three React.classwhere the mutable states are in the parent and the middle only pass the callbacks to the children to manipulate it.

我正在通过做一个小例子来学习 Facebook React。我决定检查我对this绑定的了解是否正确,所以我创建了三个React.class可变状态在父级中,中间只将回调传递给子级来操作它。

Basic structure:

基本结构:

- MainFrame (states here)
  - FriendBox (only pass the callbacks for change states to Friend)
    -Friend

Notice than I could use transferThisPropbut actually I preferred made this "manually".

请注意我可以使用transferThisProp但实际上我更喜欢“手动”制作。

FriendBox render contains this:

FriendBox 渲染包含以下内容:

var allFriends = this.props.friends.map((function (f) {
  return(
    <Friend key = {f.id}
            name = {f.name}
            select = {this.props.select}
    />
  )
}).bind(this))  

Friend render contains this:

朋友渲染包含以下内容:

return(
  <div className="friend">
    {this.props.name}
    <a href="" onClick={this.props.select(this.props.key)}>
      select
    </a>
  </div>
)

When running my code I get the following message:

运行我的代码时,我收到以下消息:

MainFrame.sendToFriendH:
  Invariant Violation: receiveComponent(...):
  Can only update a mounted component. react.js:7276
Uncaught Error: Invariant Violation:
  receiveComponent(...): Can only update a mounted component. 

The interesting part is that when using the react extension for chrome I can check that the virtual DOMis well and the bindings are ok. Everything looks fine except than the Child component for the first Friendelement says _lifeCycleState: "UNMOUNTED"

有趣的部分是,当使用 chrome 的 react 扩展时,我可以检查虚拟DOM是否良好并且绑定是否正常。除了第一个Friend元素的 Child 组件说之外,一切看起来都很好_lifeCycleState: "UNMOUNTED"

This made me think than I am doing a mistake where the bottom child is not being rendered and mounted. All the code fails but I don't know exactly why. Can anyone can tell me why the element is not automatically mounted and how can I fix it?

这让我觉得我犯了一个错误,即底部的孩子没有被渲染和安装。所有代码都失败了,但我不知道为什么。谁能告诉我为什么该元素没有自动安装,我该如何解决?

Full Code: http://jsfiddle.net/RvjeQ/

完整代码:http: //jsfiddle.net/RvjeQ/

回答by Sophie Alpert

When you write

当你写

onClick={this.props.select(this.props.key)}

you're calling the this.props.selecthandler immediately and setting its resultas the onClick handler. I'm guessing you want to instead do a partial application, which you can do using an arrow function:

this.props.select立即调用处理程序并将其结果设置为 onClick 处理程序。我猜你想要做一个部分应用程序,你可以使用箭头函数来做:

onClick={(e) => this.props.select.bind(this.props.key, e)}

If you don't care about the event arg, you can skip it.

如果您不关心事件 arg,则可以跳过它。

You can also use .bind()like so:

你也可以.bind()像这样使用:

onClick={this.props.select.bind(null, this.props.key)}

回答by Thank you

For what it's worth, you don't have to do

对于它的价值,你不必做

this.props.friends.map((function(){ ... }).bind(this));

The second argument to Array.prototype.mapallows you to set the context for the callback function. Use this instead

Array.prototype.map的第二个参数允许您设置回调函数的上下文。改用这个

this.props.friends.map(function(f){ ... }, this);

You could also use an Arrow Functionthat has lexical scope

您还可以使用具有词法范围的箭头函数

this.props.friends.map(f =>
  <Friend key = {f.id}
          name = {f.name}
          select = {this.props.select}
  />
)


Also, when you're working with complex props, you can do things like

此外,当您使用复杂的道具时,您可以执行以下操作

var props = {
  key:    f.id,
  name:   f.name,
  select: this.props.select
};

<Friend {...props} />