react .createClass() 滚动到 ref:scrollIntoView 不是函数

IT技术 javascript reactjs dom react-router
2021-05-03 23:33:02

当我尝试滚动到“参考”时,我无法弄清楚出了什么问题。我一直在疯狂地搜索并找到完全有意义的 url,但它在我的场景中不起作用。

我有一个使用 react 15.4.2 和 react-router 3.0.0 的应用程序。我有一个到一个组件的路由,它接受一个可选的路由参数,我正在尝试使用它滚动到 componentDidUpdate() 上的元素。我试过实现几种不同的方式,但在遵循 ref.scrollIntoView() 的最新实现时,我收到一个错误...

scrollIntoView 不是函数

我确保在 componentDidUpdate() 时存在“ref 回调”。

我是否只是缺少使用 .createClass() 之类的东西是缺少使用类定义时获得的方法,还是我的方法完全错误?

我可以直接使用一个包,但是像这样的事情无法理解当我像本地人一样困扰我时发生了什么。

代码已被简化以在保持类似流程的同时展示问题。代码语法可能存在差异。

应用程序

const App = React.createClass({
    render() {
        return (
            <Router history={ appHistory }>
                <Route path='home' component={ Home }>
                    <IndexRoute component={ Page } />
                    <Route path='page(/:itemIndex)' component={ Page } />
                </Route>
                <Route path='add-new-item' component={ AddNewItem } />
            </Router>
        )
    }
});

HOME 只是一个带有导航栏的包装器,它根据活动索引呈现子项

添加新项目 是一个组件,它将转到 /page/[新创建项目的索引]

const Page = React.createClass({
    getInitialState() {
        return {
            data: undefined,
            scrollTo: parseInt(this.props.params.goalIndex) || undefined
        };
    },

    componentWillMount() {
        // this gets data and does a setState for data
    },

    componentDidUpdate() {
        let { scrollTo } = this.state;

        if( scrollTo && this['item-' + scrollTo] ) {
            this['item-' + scrollTo].scrollIntoView();
        }
    },

    renderTiles() {
        return this.state.data.map( ( item, index ) => {
            return (
                <Item
                    key={ 'item-' + index }
                    ref={ node => this['item-' + index] = node }
                >
                    <p>foo bar...</p>
                </Item>
            )
        });
    },

    render() {
        return (
            <div>
                { this.state.data && this.renderTiles() }
            </div>
        );
    }
});
2个回答

带有 ref 的嵌套 React 组件就是这样,而不是带有 DOM 元素方法的 DOM 元素,因此 Element 方法将不可用。

为了轻松修复,您可以将 React 组件包装在标准 DOM 元素中并为其分配一个 ref。

renderTiles() {
    return this.state.data.map( ( item, index ) => {
        return (
            <div
                key={ 'item-' + index }
                ref={ node => this['item-' + index] = node }
            >
                <Item>
                    <p>foo bar...</p>
                </Item>
            </div>
        )
    });
},

已接受答案中的概念对于 UI 框架(例如 Reactstrap、Semantic UI、Material UI 等)中的元素尤其适用。

当它们具有相同的名称时,这很容易被忘记。

<Input><Form>在 ReactStrap 中不是<input><form>

正如公认的答案所表明的那样,这种带有 ref 的组件“不是带有 DOM 元素方法的 DOM 元素”。