【发布时间】:2018-04-19 01:10:41
【问题描述】:
我在一个组件中,该组件有一个 prop currentLineIndex 由其父容器传递并来自 Redux 减速器。
在同一个组件的函数中,我使用动作创建者更新currentLineIndex,然后我想滚动到新的currentLineIndex。但它还没有更新,所以我滚动到同一行。
我尝试过使用 async / await,如您所见,但它不起作用。
在我的组件中:
const { currentLineIndex, setCurrentLineIndex } = props; // passed by the parent container
const handlePlaybackEnd = async () => {
const nextIndex = currentLineIndex + 1;
// await don't wait until global state / component props gets updated
await setCurrentLineIndex(nextLineIndex);
// so when I scroll on next line, I scroll to the same line.
scrollToCurrentLine();
};
const scrollToCurrentLine = () => {
const currentLineEl = document.getElementById(currentLineIndex);
currentLineEl.scrollIntoView({ block: 'start', behaviour: 'smooth' });
};
在actions/index.js:
export function setCurrentLineIndex(index) {
return { type: SET_CURRENT_LINE_INDEX, payload: index };
}
在我的减速器中:
case SET_CURRENT_LINE_INDEX:
return {
...state,
currentLineIndex: action.payload,
};
Action 和 reducer 运行良好,我的组件状态已成功更新,但为时已晚。
我真的需要依赖 Redux 状态,而不仅仅是将 currentLineIndex 传递给 scrollToCurrentLine(),那太容易了:)
等到我的组件状态更新后,最好的解决方案是什么?
【问题讨论】:
-
可以传入当前行索引吗?
scrollToCurrentLine(nextIndex)?await不适用于同步函数。 -
我认为发生的事情是因为您将初始
prop.currentLineIndex传递给scrollToCurrentLine(),它正在使用该初始值。所以我认为你需要做的是使用componentWillReceiveProps()并在setCurrentLineIndex()更新后传递prop.currentLineIndex的新值 -
如果你的组件连接到redux状态,你应该什么都不用做,等redux更新状态,你的组件应该会自己刷新。
标签: javascript reactjs redux async-await