#javascript #reactjs #redux #react-redux
#javascript #reactjs #redux #реагировать-redux
Вопрос:
Я устанавливаю интервал, который запускает tick()
функцию каждую секунду, внутри него addTwo
изменяется действие count
, числовая переменная в моем состоянии. Кажется, это работает, но когда я помещаю a console.log
для печати count
в ту же функцию, которую я вызываю addTwo
, значение не обновляется, узел, содержащий значение, изменяется, но начальное значение (0) печатается в консоли, и оно не меняется.
const {createStore} = Redux;
const {Provider, connect} = ReactRedux;
const reducer = (state = {count: 0}, action) =>{
if (action.type == 'ADD-TWO'){
return{
count: state.count 2,
}
}else{
return state;
}
}
const addTwo = () =>({
type: 'ADD-TWO',
})
const store = createStore(reducer);
const App = ({count, addTwo}) =>{
const tick = () =>{
addTwo();
console.log(count);
}
const start = () => {
window.timerID = setInterval(tick, 1000);
}
return(
<>
<p>{count}</p>
<button onClick={start}>Press me!</button>
</>
)
}
const mapStateToProps = state => state;
const mapDispatchToProps = {
addTwo,
}
const AppContainer = connect(
mapStateToProps,
mapDispatchToProps,
)(App);
ReactDOM.render(
<Provider store={store}>
<AppContainer />
</Provider>
, document.getElementById('root'));
Нажмите здесь, чтобы увидеть код в codepen
Комментарии:
1. Это то, что называется «устаревшим закрытием».
setInterval
Получает версиюtick
, которая всегда имеет начальное значение.2. О, спасибо! Могу ли я исправить это, передавая счетчик в качестве аргумента?
3. Похоже, вы это исправили? Журнал задерживается на один тик, но я думаю, что это просто из-за природы
addTwo
асинхронности.4. Теперь он меняется, но запускается только при нажатии кнопки, setInterval, похоже, не работает.