У меня, похоже, есть проблема с доступом к строке ObjectID, возвращаемой MongoDB, когда она упоминается как часть ловушки React useSelector, но это не проблема в другом месте того же приложения. Есть ли проблема с символом $ в имени ключа?
мой вызов API возвращает это
{"_id": {"$oid": "5e121d3d52d781668fbc619c"}, "name": "Foo Document Name"}
import React, { useEffect } from 'react';
import { useSelector, useDispatch } from 'react-redux';
import axios from 'axios';
import { Link } from 'react-router-dom';
import { setFoo } from '../../actions';
function FooInfo(props) {
const foo = useSelector(state => state.foo);
console.log('after useSelector', foo);
const dispatch = useDispatch();
useEffect(function() {
console.log('useEffect', props.match);
axios.get(`/api/foo/${props.match.params._id}`, {headers: {'content-type': 'application/json’}})
.then(function(response) {
dispatch(setFoo(response.data));
})
.catch(function(error) {
console.log('error', error);
});
}, [dispatch, props]);
return (
<div>
<h2>{foo.name}</h2>
<small>id: {foo._id.$oid}</small>
<hr/>
</div>
)
}
из действий / индекса. js
…
export const SET_FOO = 'SET_FOO’;
export function setFoo(foo) {
return {
type: SET_FOO,
foo: foo,
_id: foo._id.$oid
};
};
Я знаю, что эта строка работает _id: foo._id.$oid
, потому что console.log после строки useSelector показывает:
after useSelector
• {_id: {…}, name: “Foo Document Name"}
• _id:
• $oid: "5e121d3d52d781668fbc619c"
• __proto__: Object
• name: "Foo Document Name"
• __proto__: Object
И объект действия содержит:
action
• {type: "SET_FOO”, foo: {…}, _id: "5e121d3d52d781668fbc619c"}
• type: "SET_FOO"
• foo:
• _id: {$oid: "5e121d3d52d781668fbc619c"}
• name: "Foo Document Name"
• __proto__: Object
• _id: "5e121d3d52d781668fbc619c"
• __proto__: Object
Браузер дает это ошибка:
TypeError: Cannot read property '$oid' of undefined
Если я удаляю. $ oid из id: {foo._id. $ oid}, я получаю эту ошибку в браузере:
Error: Objects are not valid as a React child (found: object with keys {$oid}). If you meant to render a collection of children, use an array instead.
foo._id не может быть неопределенным, так как удаление. $ oid демонстрирует, что foo._id содержит что-то.
Это похоже на проблему с реагирующими хуками для меня, но я новичок, поэтому я не доверяю своей точке зрения здесь. Я полагаю, что это может иметь место, потому что изменение строки useSelector на: const [foo, tempID] = useSelector (state => [state.foo, state.foo._id. $ Oid]); также выдает ошибку TypeError.