最近修改 superset 的项目,各种坑各种踩。本以为我以后用不上 react 框架了,没想到修改这个项目的源码,赶上了 react。

这次的坑来源于这个需求:superset做移动端嵌入,在 tab 标签切换到别的再切换回来的时候,希望还能保持原本的滚动位置。

我考察了一下发现滚动位置互相扰乱的原因是,滚动的是html元素,也就是这个页面整个是滑动的,所以切换到别的 tab,虽然切换完的没有滚动,但还是保留了上一个的滚动位置。

闲话不多说,修改思路:tab 切换的时候记录下 html 的 scrollTop,切换回来的时候再赋上。

难点:TabPane 这个组件,显示的是从 react-bootstrap 中 import 进来的,然而找不到文档(也可能是我太废 ==)

解决方向:node_modules 里面找源码

分别找到了 onExit 和 onEnter 这两个方法,看起来就是能用的样子

<TabPane
    key={index === 0 ? DASHBOARD_GRID_ID : id}
    eventKey={index}
    onExit={this.handleTabExit}
    onEnter={this.handleTabEnter}
>
    <DashboardGrid
        gridComponent={dashboardLayout[id]}
        // see isValidChild for why tabs do not increment the depth of their children
        depth={DASHBOARD_ROOT_DEPTH + 1} // (topLevelTabs ? 0 : 1)}
        width={width}
        isComponentVisible={index === tabIndex}
    />
</TabPane>

添加 onExit、onEnter

以当前 tab 的 id 作为 key 值,储存当前 tab 的滚动位置

(里面有些代码写的可能不是很规范,react有很久没有用了用的不熟练,欢迎交流哈~)

constructor(props) {
    super(props);
    this.state = {
      tabScrollTop: {}
    };
}
handleTabExit(data) {
    let tabScrollTop = this.state.tabScrollTop;
    let scrollingElement = document.scrollingElement || document.querySelector('html');
    tabScrollTop[data.id] = scrollingElement.scrollTop;
    this.setState({
      tabScrollTop: tabScrollTop
    })
}

handleTabEnter(data) {
    let tabScrollTop = this.state.tabScrollTop;
    let scrollingElement = document.scrollingElement || document.querySelector('html');
    tabScrollTop[data.id] ? (scrollingElement.scrollTop=tabScrollTop[data.id]) : (scrollingElement.scrollTop=0);
}

就酱~

这次的重点,在没有足够的文档支撑的时候,还是要学会自己去插件里找轮子~

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐