Я новичок, чтобы реагировать, и я только начал изучать хуки и контекст.
Я получаю некоторые данные из API со следующим кодом:
const getScreen = async uuid => {
const res = await axios.get(
`${url}/api/screen/${uuid}`
);
dispatch({
type: GET_SCREEN,
payload: res.data
});
};
Какие продолжает использовать редуктор.
case GET_SCREEN:
return {
...state,
screen: action.payload,
};
На экране. js, я звоню getScreen
и отправляю UUID
, чтобы показать точный экран. Работает отлично. У меня возникает проблема, когда я пытаюсь получить API (каждые 3 секунды для тестирования) и обновить состояние nodeupdated
на основе того, что он получает из API. Проблема в том, что screen.data
всегда неопределен (из-за того, что он асинхронный?)
import React, {
useState,
useEffect,
useContext,
} from 'react';
import SignageContext from '../../context/signage/signageContext';
const Screen = ({ match }) => {
const signageContext = useContext(SignageContext);
const { getScreen, screen } = signageContext;
const [nodeupdated, setNodeupdated] = useState('null');
const foo = async () => {
getScreen(match.params.id);
setTimeout(foo, 3000);
};
useEffect(() => {
foo();
setNodeupdated(screen.data)
}, []);
Если я удаляю [], фактически получает данные из API ... но в бесконечном количестве oop.
Дело в том, что это, казалось, прекрасно работало до того, как я преобразовал его в ловушки:
componentDidMount() {
// Get screen from UUID in url
this.props.getScreen(this.props.match.params.id);
// Get screen every 30.5 seconds
setInterval(() => {
this.props.getScreen(this.props.match.params.id);
this.setState({
nodeUpdated: this.props.screen.data.changed
});
}, 3000);
}