Задать вопрос
@Rabbit13245
Начинающий веб-разработчик

Как убрать прокрутку до активного компонента в React?

Добрый вечер. Подскажите почему так происходит.
Есть компонент-контроллер
class CasesController extends React.Component {
    constructor(props) {
        super(props);
    }

    sortCasesPriority(caseA, caseB) {
        if (caseA.comeLater > caseB.comeLater) return 1;
        if (caseB.comeLater > caseA.comeLater) return -1;
        if (caseA.comeLater == caseB.comeLater) {
            if (caseA.priority > caseB.priority) return -1;
            if (caseB.priority > caseA.priority) return 1;
        }
    }

    render() {
        const {cases} = this.props;
        return (
            cases.sort(this.sortCasesPriority).map(singleCase => {
                    return (
                        <Case
                            key={singleCase.id}
                            singleCase={singleCase}
                        />
                    )
                }
            ))
    }
}

в котором отрисовываются Case.
по умолчанию у всех Case comeLater = 0. В Case есть кнопка, которая изменяет comeLater на 1. соответственно (так задана функция сортировки) элемент перемещается в самый низ списка. Но окно браузера тоже идет за ним и прокручивается в самый низ страницы. С чем это связано и как можно это изменить?

P.S.
action и reducer для изменения comeLater
export function comeLaterCase(caseId){
    return{
        type: COME_LATER_CASE,
        payload: caseId
    }
}
case COME_LATER_CASE:
            //изменяем только тот элемент, где совпал ID
            let newLaterCases = state.cases.filter(singleCase => {
                if (singleCase.id == action.payload)
                    singleCase.comeLater = ++singleCase.comeLater;
                return singleCase;
            });
            return {...state, cases: newLaterCases};


компонент Case, в котором как раз есть кнопка на изменение comeLater.
class Case extends React.Component {
    constructor(props) {
        super(props);

        const {singleCase} = this.props;
        this.singleCase = singleCase;
        this.handleComeLaterButton = this.handleComeLaterButton.bind(this);
    }

    handleComeLaterButton(){
        const {comeLaterCase} = this.props.casesActions;
        comeLaterCase(this.singleCase.id);
    }

    render() {
        const {singleCase} = this.props;
        return (
            <div className="singleCase">
                <div>
                {singleCase.text}
                </div>
                <div>
                    <RaisedButton label="Игнорировать" onTouchTap={this.handleComeLaterButton}/>
                </div>
            </div>
        )
    }
}

И да, есть роуты
ReactDOM.render(
    <Provider store={store}>
            <HashRouter>
                <MuiThemeProvider muiTheme={getMuiTheme(darkBaseTheme)}>
                    <div className="App">
                        <ul className="menu-bar">
                            <li className="menu-item"><Link className="menu-item-link" to="/">Главная</Link></li>
                            <li className="menu-item"><Link className="menu-item-link" to="/cases">Кейсы</Link></li>
                        </ul>
                        <Route exact path="/" component={App} />
                        <Route path="/cases" component={CasesController} />
                    </div>
                </MuiThemeProvider>
            </HashRouter>
    </Provider>,
    document.getElementById("container")
);
  • Вопрос задан
  • 465 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
Поправьте меня если не так, но по моему решить проблему с помощью какого нибудь preventDefault тут не получится.

Значит придется при нажатии кнопки вызывать функцию, которая отправляет скролл страницы вверх.
window.scrollTo(0,0)

Однако проблема в том, что пользователь может находится не в верху страницы во время нажатия. Значит нужно записывать значение window.pageYOffset на момент нажатия в переменную, а
затем указывать его в функции вместо нулевого значения.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы