2-9 回到顶部功能

回到顶部的功能,因为代码量很少,因此就不将他单独拆分为一个js 文件了。我们在src/pages/home 下的index 中写它。

index 如下。

import React, {Component} from 'react';
import { connect } from 'react-redux';
import {HomeWrapper, HomeLeft, HomeRight, BackTop } from './style';
import List from './components/List';
import Recommend from './components/Recommend';
import Topic from './components/Topic';
import Writer from './components/Writer';
import bannerImage from '../../statics/ooo.jpg';
import { actionCreators } from './store';

class Home extends Component {
    render () {
        return (
            <HomeWrapper>
                <HomeLeft>
                    <img
                        className="banner-img"
                        src={bannerImage}
                        alt=''
                    />
                    <Topic></Topic>
                    <List></List>
                </HomeLeft>
                <HomeRight>
                    <Recommend></Recommend>
                    <Writer></Writer>
                </HomeRight>
                <BackTop>回到顶部</BackTop>
            </HomeWrapper>
        )
    }
    componentDidMount () {
        this.props.changeHomeData();
    }
}

const mapDispatch = (dispatch) => {
    return {
        changeHomeData () {
            const action = actionCreators.getHomeInfo();
            dispatch(action);
        }
    }
}
export default connect(null, mapDispatch)(Home);

然后在 style.js 中定义一下,如下。

然后在 index 中定义一下点击“顶部” 的click 事件,如下。

import React, {Component} from 'react';
import { connect } from 'react-redux';
import {HomeWrapper, HomeLeft, HomeRight, BackTop } from './style';
import List from './components/List';
import Recommend from './components/Recommend';
import Topic from './components/Topic';
import Writer from './components/Writer';
import bannerImage from '../../statics/ooo.jpg';
import { actionCreators } from './store';

class Home extends Component {
    handleScrollTop () {
        window.scrollTo(0,0);
    }
    render () {
        return (
            <HomeWrapper>
                <HomeLeft>
                    <img
                        className="banner-img"
                        src={bannerImage}
                        alt=''
                    />
                    <Topic></Topic>
                    <List></List>
                </HomeLeft>
                <HomeRight>
                    <Recommend></Recommend>
                    <Writer></Writer>
                </HomeRight>
                <BackTop onClick={this.handleScrollTop}>顶部</BackTop>
            </HomeWrapper>
        )
    }
    componentDidMount () {
        this.props.changeHomeData();
    }
}

const mapDispatch = (dispatch) => {
    return {
        changeHomeData () {
            const action = actionCreators.getHomeInfo();
            dispatch(action);
        }
    }
}
export default connect(null, mapDispatch)(Home);

然后,再实现一下,在页面回到顶部的时候,这个小组件就没了,往下翻就会出现。

这个我们通过一个变量保存,它的出现和隐藏。打开 src/pages/home/store 下的 reducer

import { fromJS } from 'immutable';
import * as actionTypes from './actionTypes';

const defaultState = fromJS({
    topicList: [],
    articleList: [],
    recommendList: [],
    articlePage: 1,
    showScroll: false
});

export default (state = defaultState, action) => {
    switch (action.type) {
        case actionTypes.CHANGE_HOME_DATA:
            return state.merge({
                "topicList": fromJS(action.topicList),
                "articleList": fromJS(action.articleList),
                "recommendList": fromJS(action.recommendList)
            });
        case actionTypes.ADD_ARTICLE_LIST:
            return state.merge({
                "articleList": state.get("articleList").concat(action.articleList),
                "articlePage": action.page
            })
        default:
            return state;
    }
}

然后,我们在src/pages/home 下的 index 中做初始化,如下。

import React, {Component} from 'react';
import { connect } from 'react-redux';
import {HomeWrapper, HomeLeft, HomeRight, BackTop } from './style';
import List from './components/List';
import Recommend from './components/Recommend';
import Topic from './components/Topic';
import Writer from './components/Writer';
import bannerImage from '../../statics/ooo.jpg';
import { actionCreators } from './store';

class Home extends Component {
    handleScrollTop () {
        window.scrollTo(0,0);
    }
    render () {
        return (
            <HomeWrapper>
                <HomeLeft>
                    <img
                        className="banner-img"
                        src={bannerImage}
                        alt=''
                    />
                    <Topic></Topic>
                    <List></List>
                </HomeLeft>
                <HomeRight>
                    <Recommend></Recommend>
                    <Writer></Writer>
                </HomeRight>
                {this.props.showScroll ? <BackTop onClick={this.handleScrollTop}>顶部</BackTop> : null }
            </HomeWrapper>
        )
    }
    componentDidMount () {
        this.props.changeHomeData();
    }
}

const mapState = (state) => {
    return {
        showScroll: state.get("home").get("showScroll")
    }
}
const mapDispatch = (dispatch) => {
    return {
        changeHomeData () {
            const action = actionCreators.getHomeInfo();
            dispatch(action);
        }
    }
}
export default connect(mapState, mapDispatch)(Home);

上面我们只是把初始进来的时候隐藏“顶部” 按钮。下面,我们来写,当页面不是顶部的时候,显示“顶部”按钮。如下是 index。

import React, {Component} from 'react';
import { connect } from 'react-redux';
import {HomeWrapper, HomeLeft, HomeRight, BackTop } from './style';
import List from './components/List';
import Recommend from './components/Recommend';
import Topic from './components/Topic';
import Writer from './components/Writer';
import bannerImage from '../../statics/ooo.jpg';
import { actionCreators } from './store';

class Home extends Component {
    handleScrollTop () {
        window.scrollTo(0,0);
    }
    render () {
        return (
            <HomeWrapper>
                <HomeLeft>
                    <img
                        className="banner-img"
                        src={bannerImage}
                        alt=''
                    />
                    <Topic></Topic>
                    <List></List>
                </HomeLeft>
                <HomeRight>
                    <Recommend></Recommend>
                    <Writer></Writer>
                </HomeRight>
                {this.props.showScroll ? <BackTop onClick={this.handleScrollTop}>顶部</BackTop> : null }
            </HomeWrapper>
        )
    }
    componentDidMount () {
        this.props.changeHomeData();
        this.bindEvents();
    }
    bindEvents() {
        window.addEventListener("scroll", this.props.changeScrollTopShow);
    }
}

const mapState = (state) => {
    return {
        showScroll: state.get("home").get("showScroll")
    }
}
const mapDispatch = (dispatch) => {
    return {
        changeHomeData () {
            const action = actionCreators.getHomeInfo();
            dispatch(action);
        },
        changeScrollTopShow () {
            console.log();
            if ( document.documentElement.scrollTop > 100) {
                dispatch(actionCreators.toggleShowScroll(true));
            } else {
                dispatch(actionCreators.toggleShowScroll(false));
            }
        }
    }
}
export default connect(mapState, mapDispatch)(Home);

然后在 actionCreators 中添加 toogleShowScroll 

import axios from 'axios';
import { fromJS } from 'immutable';
import * as actionTypes from './actionTypes';

const changeHomeData = (result) => ({
    type: actionTypes.CHANGE_HOME_DATA,
    topicList: result.topicList,
    articleList: result.articleList,
    recommendList: result.recommendList
});

const addHomeList = (result, page) => ({
    type: actionTypes.ADD_ARTICLE_LIST,
    articleList: fromJS(result.articleList),
    page: page
})

export const getHomeInfo = () => {
    return (dispatch) => {
        axios.get("/api/home.json").then((res) => {
            const result = res.data.data;
            const action = changeHomeData(result);
            dispatch(action);
        });
    }
}

export const getMoreList = (page) => {
    return (dispatch) => {
        axios.get("/api/homeList.json?page=" + page).then((res) => {
            const result = res.data.data;
            const action = addHomeList(result, page + 1);
            dispatch(action);
        })
    }
}

export const toggleShowScroll = (show) => ({
    type: actionTypes.TOGGLE_SCROLL_SHOW,
    show: show
})

最后,往 reducer 中添加一个case

import { fromJS } from 'immutable';
import * as actionTypes from './actionTypes';

const defaultState = fromJS({
    topicList: [],
    articleList: [],
    recommendList: [],
    articlePage: 1,
    showScroll: false
});

export default (state = defaultState, action) => {
    switch (action.type) {
        case actionTypes.CHANGE_HOME_DATA:
            return state.merge({
                "topicList": fromJS(action.topicList),
                "articleList": fromJS(action.articleList),
                "recommendList": fromJS(action.recommendList)
            });
        case actionTypes.ADD_ARTICLE_LIST:
            return state.merge({
                "articleList": state.get("articleList").concat(action.articleList),
                "articlePage": action.page
            });
        case actionTypes.TOGGLE_SCROLL_SHOW:
            return state.set("showScroll", action.show);
        default:
            return state;
    }
}

注意一点,我们在index 中写的是,当组件挂载后,会往 window 中绑定一个scroll 事件。我们一定别忘记了,当这个组件被从页面移除的时候,一定要把window 的scroll 事件也移除。

import React, {Component} from 'react';
import { connect } from 'react-redux';
import {HomeWrapper, HomeLeft, HomeRight, BackTop } from './style';
import List from './components/List';
import Recommend from './components/Recommend';
import Topic from './components/Topic';
import Writer from './components/Writer';
import bannerImage from '../../statics/ooo.jpg';
import { actionCreators } from './store';

class Home extends Component {
    handleScrollTop () {
        window.scrollTo(0,0);
    }
    render () {
        return (
            <HomeWrapper>
                <HomeLeft>
                    <img
                        className="banner-img"
                        src={bannerImage}
                        alt=''
                    />
                    <Topic></Topic>
                    <List></List>
                </HomeLeft>
                <HomeRight>
                    <Recommend></Recommend>
                    <Writer></Writer>
                </HomeRight>
                {this.props.showScroll ? <BackTop onClick={this.handleScrollTop}>顶部</BackTop> : null }
            </HomeWrapper>
        )
    }
    componentDidMount () {
        this.props.changeHomeData();
        this.bindEvents();
    }
    bindEvents() {
        window.addEventListener("scroll", this.props.changeScrollTopShow);
    }
    componentWillUnmount () {
        window.removeEventListener("scroll", this.props.changeScrollTopShow);
    }
}

const mapState = (state) => {
    return {
        showScroll: state.get("home").get("showScroll")
    }
}
const mapDispatch = (dispatch) => {
    return {
        changeHomeData () {
            const action = actionCreators.getHomeInfo();
            dispatch(action);
        },
        changeScrollTopShow () {
            console.log();
            if ( document.documentElement.scrollTop > 100) {
                dispatch(actionCreators.toggleShowScroll(true));
            } else {
                dispatch(actionCreators.toggleShowScroll(false));
            }
        }
    }
}
export default connect(mapState, mapDispatch)(Home);

Done.

### mescroll-uni 回到顶部功能的实现 mescroll-uni 组件提供了内置的支持以实现在页面滚动过程中显示和隐藏回到顶部按钮的功能[^1]。为了启用此功能,开发者可以在初始化 `mescroll` 对象时通过配置项来激活该行为。 #### 启用回到顶部按钮的方法 在 JavaScript 或 TypeScript 文件中创建 Mescroll 实例并传递相应的选项: ```javascript const mescroll = new MeScroll({ up: { use: true, auto: false, // 是否自动加载下一页数据 (首次进入时不触发) callback: getListData // 上拉回调函数 }, down: { use: true, auto: true, // 进入页面时自动执行一次下拉刷新 callback: refreshListData // 下拉刷新回调函数 }, topBtn: { // 配置回到顶部按钮 warpId: &#39;back-to-top&#39;, // 自定义回到顶部 DOM 的 id 属性值,默认为&#39;mescroll-totop&#39; supportClick: true, // 支持点击事件,默认开启 minShowTime: 500, // 显示最短时间(ms),默认500ms offsetToTop: 800 // 距离顶部多少距离开始展示,默认800px } }); ``` 上述代码片段展示了如何利用 `topBtn` 字段来自定义回到顶部的行为,包括指定其 HTML 元素 ID、是否允许点击交互、最小可见时间和触发条件等参数[^2]。 对于模板部分,则需确保视图中有对应的占位符供插件挂载实际控件: ```html <!-- H5 页面结构 --> <div class="content"> <!-- 数据列表容器 --> <view id="data-list"></view> <!-- 返回顶部按钮位置预留 --> <div id="back-to-top" style="display:none;"></div> </div> ``` 这里需要注意的是,如果希望自定义样式或者图标,可以通过 CSS 来调整 `#back-to-top` 元素的表现形式;而具体的业务逻辑则交由 JS 控制层处理即可[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值