Reactjs:作为道具访问时未定义的键
Reactjs: Key undefined when accessed as a prop
工具:Reactjs 0.14.0香草通量
我需要唯一的标识符有两个原因:
- 儿童对账
- 跟踪孩子被点击的内容
假设我有一个消息列表,看起来像这样:
[
{
id: 1241241234, // <-----The unique id is kept here
authorName: "Nick"
text: "Hi!"
},
...
]
现在我使用CCD_ 1来创建";所有者;所有者组件MessageSection
内部的组件(MessageListItem
)
function getMessageListItem(message) {
return (
<MessageListItem key={message.id} message={message} />
);
}
var MessageSection = React.createClass({
render: function() {
var messageListItems = this.state.messages.map(getMessageListItem);
<div>
{messageListItems }
</div>
}
});
但是this.props.key
在MessageListItem
中是未定义的,尽管我知道它是在传递时定义的。
var ConvoListItem = React.createClass({
render: function() {
console.log(this.props.key); // Undefined
}
});
我猜React不让key
作为道具是有原因的。
问题:
如果我不能使用key
作为道具,那么处理在包含状态的子元素的动态列表上键入和设置唯一标识符的双重需求的正确方法是什么?
key和ref并不是真正的"道具"。它们由react内部使用,而不是作为道具传递给组件。考虑将其作为诸如"id"之类的道具传递。
最好使用id。然后在eventHandler中可以使用event.target.id.
function getMessageListItem(message) {
return (
<MessageListItem key={message.id} id={message.id} message={message}/>
);
}
正如我们在其他答案中已经确定的那样,您不能使用key
,因为它不是作为道具传递的,而是由react在内部使用。这是我的2美分作为替代品:
由于您在创建<MessageListItem>
组件时将整个消息数组作为一个道具进行传递,因此不一定需要使用Array.prototype.map()
0传递另一个道具。只要需要使用id,您就可以简单地使用{this.props.message.id}
。
正如您所发现的,key
属性由React本身消耗,而不是传递给子组件。React使用它来跟踪数组中的条目,以避免不必要地重新渲染它们(无论是在调用它们的render
还是与DOM协调方面)。
不幸的是,这意味着如果你也想在孩子身上使用它,你必须通过两次。在您的代码中,已经将其传递两次(一次作为key
,一次作为message
的一部分)。因此,您可以保留当前的JSX,只需在子级中使用message
中的id
即可:
var MessageListItem = React.createClass({
render: function() {
console.log(this.props.message.id);
// ^^^^^^^^^^^−−−−− Has the value
}
});
更多:
- 列表和密钥
- 为什么需要钥匙(从上面链接)
- 特殊道具警告-它告诉我们
key
和ref
是不传递给子组件的特殊道具
- 在js中访问元素时不透明度和样式未定义,但在css中定义
- 访问嵌套 json 对象的属性将返回未定义
- Uncaught ReferenceError:尝试在Android网络视图中访问时未定义函数
- 服务变量分配了数据,但在访问时始终未定义
- 尝试从我的 chrome 扩展程序访问 gmail 中的 iframe 时出现未定义的错误,但不是从开发者控制台访问
- 访问节点js中对象内部的数组-未定义
- 按名称访问元素时未定义的值
- 通过AJAX访问时,$_POST中出现未定义的索引错误
- 访问数字类型的未定义属性
- JSON可以't访问数据返回未定义
- 可以't访问JSON中的特定字段,在javascript中表示未定义
- 未定义的函数???从JavaScript访问SharePoint时
- 未定义访问具有对象属性的jquery选择器
- 无法循环访问比较文本值的数组,使用量角器未定义的结果
- “(回调方法)未定义”在 Firefox 插件上的 JSONP 访问中
- 跟踪服务器上的站点访问 - Meteor 中未定义的会话变量
- 在另一个函数中访问变量,返回未定义的 - JavaScript
- Angular js 指令控制器访问范围属性,但返回未定义
- 无法访问父 SharePoint URL.未捕获的类型错误: 无法读取未定义的属性“get_web”
- 未定义的错误访问安卓相机