【发布时间】:2016-07-10 14:39:14
【问题描述】:
我正在尝试在使用 React 和 Redux 时简化工作流程。
对于基本的 DOM 操作任务,例如向下滚动元素或执行间隔检查,您必须声明许多函数,而突然之间,您可能有 100 行代码,而原本应该只有几行代码代码。
以下示例使用 react-redux 入门套件。使用辅助模块,例如
createAction、handleActions
执行的任务基本是
var objDiv = document.getElementById("id");
objDiv.scrollTop = objDiv.scrollHeight;
首先我们必须在模块
中设置我们的动作类型export const SCROLL_DOWN = 'SCROLL_DOWN'
然后我们要定义向下滚动的动作
export const setScrollDown = createAction(SCROLL_DOWN, (setScrollDown = true) => setScrollDown)
然后是 reducer,我们在其中设置状态 hasScrolledDown,而这又必须在我们所在的模块中定义。
export default handleActions({
[SCROLL_DOWN]: (state, { payload }) => {
return {
...state, hasScrolledDown: payload
}
}
}, {hasScrolledDown: false})
接下来我们必须在视图中使用所有这些
我们定义了 propTypes
class MessagesView extends React.Component {
static propTypes = {
setScrollDown: PropTypes.func,
hasScrolledDown: PropTypes.bool
};
最后我们在 componentDidMount 和 componentDidUpdate 函数中使用它们,来操作我们需要导入 react-dom 模块的 dom,这样它就在文档的顶部。
import ReactDOM from 'react-dom'
然后我们终于可以向下滚动页面了。
componentDidMount () {
this.props.setScrollDown(false)
}
componentDidUpdate (prevProps, prevState) {
if (!this.props.hasScrolledDown) {
ReactDOM.findDOMNode(this).scrollIntoView(false)
this.props.setScrollDown(true)
}
}
所以,我的问题是:我是不是走错了路,还是有一个简单的解决方案来处理像这样的简单 dom 操作?
正如您想象的那样,当您有一个大型应用程序需要在这里和那里执行基本的 dom 操作任务时,代码库增长得非常快。
【问题讨论】:
标签: reactjs redux dom-manipulation