UPDATE我可以在render()函数的return语句中正常访问所有内容。 F.e user.exercises [0] .exercise.name输出“蹲”。这就是为什么我更难以理解为什么在return语句之前我无法访问它以创建一个将值映射到表的函数。 UPDATE无法访问React对象或数组中的特定键
我似乎有访问React中特定键的问题。我尝试读取的对象是从mongodb的后端API请求的,并以JSON格式输出。我已经尝试通过lodash将对象映射到数组后访问它,但问题是相同的。我可能只是读对象错误并指定了错误的键,但我看不到它。我没有任何问题console.logging整个JSON或顶部键,通过写{user.name} f.e“name”或“年龄”,但任何更深入和崩溃。这里的JSON:
{
"_id": "592ab4523a4d39085fe4c1d9",
"nickname": "mmsmsy",
"name": "Mateusz",
"gender": "male",
"age": 26,
"exercises": [
{
"exercise": {
"name": "squats",
"records": []
}
},
{
"exercise": {
"name": "legpresses",
"records": []
}
},
{
"exercise": {
"name": "deadlifts",
"records": []
}
},
{
"exercise": {
"name": "benchpresses",
"records": []
}
},
{
"exercise": {
"name": "pullups",
"records": []
}
},
{
"exercise": {
"name": "shoulderpresses",
"records": []
}
},
{
"exercise": {
"name": "curls",
"records": []
}
}
]
}
而且阵营代码:
import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import axios from 'axios';
import _ from 'lodash';
class UserDetails extends Component{
constructor(props) {
super(props)
this.state = {
user: null,
loading: false
}
}
componentDidMount() {
this.setState({
loading: true
});
axios.get(`http://192.168.0.248:3001/api/v1/users/${this.props.match.params.id}`)
.then(res => res.data)
.then(user => {
this.setState({
user: user,
loading: false
});
});
}
render() {
const {loading, user} = this.state;
let userInfo = _.map(user, (value, prop) => {
return { "prop": prop, "value": value };
});
console.log(user, userInfo);
if (loading || !user) {
return (
<p className="user-loading">Loading ...</p>
);
}
return (
<div id="user-details">
<div className="nav">
<Link className="nav-back-to-list" to="/">Back to the list</Link>
</div>
<div id="user-details-icon">
<img src={`/images/user_${user.gender}.png`} alt={`generic user ${user.gender} icon`} />
</div>
<table>
<tbody><tr><td>Nickname</td><td>{user.nickname}</td></tr></tbody>
<tbody><tr><td>Name</td><td>{user.name}</td></tr></tbody>
<tbody><tr><td>Gender</td><td>{user.gender}</td></tr></tbody>
<tbody><tr><td>Age</td><td>{user.age}</td></tr></tbody>
</table>
<h1>Records</h1>
</div>
)
}
}
export default UserDetails;
这里就是我得到没有错误与执行console.log(用户);
Object {_id: "592ab4523a4d39085fe4c1d9", nickname: "mmsmsy", name: "Mateusz", gender: "male", age: 26…}age: 26exercises: Array(7)0: Objectexercise: Objectname: "squats"records: Array(0)length: 0__proto__: Array(0)__proto__: Objectconstructor: function Object()hasOwnProperty: function hasOwnProperty()isPrototypeOf: function isPrototypeOf()propertyIsEnumerable: function propertyIsEnumerable()toLocaleString: function toLocaleString()toString: function toString()valueOf: function valueOf()__defineGetter__: function __defineGetter__()__defineSetter__: function __defineSetter__()__lookupGetter__: function __lookupGetter__()__lookupSetter__: function __lookupSetter__()get __proto__: function __proto__()set __proto__: function __proto__()__proto__: Object1: Objectexercise: Object__proto__: Object2: Object3: Object4: Object5: Object6: Objectlength: 7__proto__: Array(0)gender: "male"name: "Mateusz"nickname: "mmsmsy"_id: "592ab4523a4d39085fe4c1d9"__proto__: Object
这里是用lodash将它转换为数组console.log(userInfo);
(6) [Object, Object, Object, Object, Object, Object]
现在,我得到的例子和错误,如果我试图访问f.e: 的console.log(user.exercises [0] .exercise.name);
Uncaught TypeError: Cannot read property 'exercises' of null
at UserDetails.render (UserDetails.js:33)
at ReactCompositeComponent.js:796
at measureLifeCyclePerf (ReactCompositeComponent.js:75)
at ReactCompositeComponentWrapper._renderValidatedComponentWithoutOwnerOrContext (ReactCompositeComponent.js:795)
at ReactCompositeComponentWrapper._renderValidatedComponent (ReactCompositeComponent.js:822)
at ReactCompositeComponentWrapper.performInitialMount (ReactCompositeComponent.js:362)
at ReactCompositeComponentWrapper.mountComponent (ReactCompositeComponent.js:258)
at Object.mountComponent (ReactReconciler.js:46)
at ReactCompositeComponentWrapper.performInitialMount (ReactCompositeComponent.js:371)
at ReactCompositeComponentWrapper.mountComponent (ReactCompositeComponent.js:258)
at Object.mountComponent (ReactReconciler.js:46)
at ReactDOMComponent.mountChildren (ReactMultiChild.js:238)
at ReactDOMComponent._createInitialChildren (ReactDOMComponent.js:697)
at ReactDOMComponent.mountComponent (ReactDOMComponent.js:516)
at Object.mountComponent (ReactReconciler.js:46)
at ReactCompositeComponentWrapper.performInitialMount (ReactCompositeComponent.js:371)
at ReactCompositeComponentWrapper.mountComponent (ReactCompositeComponent.js:258)
at Object.mountComponent (ReactReconciler.js:46)
at ReactCompositeComponentWrapper.performInitialMount (ReactCompositeComponent.js:371)
at ReactCompositeComponentWrapper.mountComponent (ReactCompositeComponent.js:258)
at Object.mountComponent (ReactReconciler.js:46)
at ReactCompositeComponentWrapper.performInitialMount (ReactCompositeComponent.js:371)
at ReactCompositeComponentWrapper.mountComponent (ReactCompositeComponent.js:258)
at Object.mountComponent (ReactReconciler.js:46)
at mountComponentIntoNode (ReactMount.js:104)
at ReactReconcileTransaction.perform (Transaction.js:140)
at batchedMountComponentIntoNode (ReactMount.js:126)
at ReactDefaultBatchingStrategyTransaction.perform (Transaction.js:140)
at Object.batchedUpdates (ReactDefaultBatchingStrategy.js:62)
at Object.batchedUpdates (ReactUpdates.js:97)
at Object._renderNewRootComponent (ReactMount.js:320)
at Object._renderSubtreeIntoContainer (ReactMount.js:401)
at Object.render (ReactMount.js:422)
at Object.<anonymous> (index.js:10)
at __webpack_require__ (bootstrap 9a6d4f1…:657)
at fn (bootstrap 9a6d4f1…:85)
at Object.<anonymous> (fetch.js:461)
at __webpack_require__ (bootstrap 9a6d4f1…:657)
at validateFormat (bootstrap 9a6d4f1…:706)
at bundle.js:710
render @ UserDetails.js:33
(anonymous) @ ReactCompositeComponent.js:796
measureLifeCyclePerf @ ReactCompositeComponent.js:75
_renderValidatedComponentWithoutOwnerOrContext @ ReactCompositeComponent.js:795
_renderValidatedComponent @ ReactCompositeComponent.js:822
performInitialMount @ ReactCompositeComponent.js:362
mountComponent @ ReactCompositeComponent.js:258
mountComponent @ ReactReconciler.js:46
performInitialMount @ ReactCompositeComponent.js:371
mountComponent @ ReactCompositeComponent.js:258
mountComponent @ ReactReconciler.js:46
mountChildren @ ReactMultiChild.js:238
_createInitialChildren @ ReactDOMComponent.js:697
mountComponent @ ReactDOMComponent.js:516
mountComponent @ ReactReconciler.js:46
performInitialMount @ ReactCompositeComponent.js:371
mountComponent @ ReactCompositeComponent.js:258
mountComponent @ ReactReconciler.js:46
performInitialMount @ ReactCompositeComponent.js:371
mountComponent @ ReactCompositeComponent.js:258
mountComponent @ ReactReconciler.js:46
performInitialMount @ ReactCompositeComponent.js:371
mountComponent @ ReactCompositeComponent.js:258
mountComponent @ ReactReconciler.js:46
mountComponentIntoNode @ ReactMount.js:104
perform @ Transaction.js:140
batchedMountComponentIntoNode @ ReactMount.js:126
perform @ Transaction.js:140
batchedUpdates @ ReactDefaultBatchingStrategy.js:62
batchedUpdates @ ReactUpdates.js:97
_renderNewRootComponent @ ReactMount.js:320
_renderSubtreeIntoContainer @ ReactMount.js:401
render @ ReactMount.js:422
(anonymous) @ index.js:10
__webpack_require__ @ bootstrap 9a6d4f1…:657
fn @ bootstrap 9a6d4f1…:85
(anonymous) @ fetch.js:461
__webpack_require__ @ bootstrap 9a6d4f1…:657
validateFormat @ bootstrap 9a6d4f1…:706
(anonymous) @ bundle.js:710
不幸的是没有改变。 –
并设置'user'作为axios调用的响应'然后(res => {this.setState({user:res.data,loading:false});}' –
我不知道我是否理解你我认为你没有从axios请求中得到任何正确的数据,但是我和我在记录整个响应时没有任何问题,但是当试图访问练习中的值时,我一直在错误我更新了记录整个信息和userInfo变量时获得的数据的问题 –