文件分为三部分:index.js+PullUp.js+PullDown.js
index.js:better.scroll的初始化
PullUp.js:初始化上拉加载更多
PullDown.js:初始化下拉刷新功能
index.js
'use strict';Object.defineProperty(exports, "__esModule", { value: true});var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();var _templateObject = _taggedTemplateLiteral(['\n overflow: hidden;\n position: relative; // \u53EF\u9632\u6B62 scrollbar \u8D85\u51FA wrapper \u9AD8\u5EA6\n'], ['\n overflow: hidden;\n position: relative; // \u53EF\u9632\u6B62 scrollbar \u8D85\u51FA wrapper \u9AD8\u5EA6\n']);var _react = require('react');var _react2 = _interopRequireDefault(_react);var _propTypes = require('prop-types');var _propTypes2 = _interopRequireDefault(_propTypes);var _styledComponents = require('styled-components');var _styledComponents2 = _interopRequireDefault(_styledComponents);var _betterScroll = require('better-scroll');var _betterScroll2 = _interopRequireDefault(_betterScroll);var _PullDown = require('./PullDown');var _PullDown2 = _interopRequireDefault(_PullDown);var _PullUp = require('./PullUp');var _PullUp2 = _interopRequireDefault(_PullUp);function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }function _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }var Wrapper = _styledComponents2.default.div(_templateObject);var Scroller = function (_PureComponent) { _inherits(Scroller, _PureComponent); function Scroller(props) { _classCallCheck(this, Scroller); var _this = _possibleConstructorReturn(this, (Scroller.__proto__ || Object.getPrototypeOf(Scroller)).call(this, props)); _this.state = { pullDown: false, pullUp: false }; _this.wrapperRef = _react2.default.createRef(); return _this; } _createClass(Scroller, [{ key: 'componentDidMount', value: function componentDidMount() { var _props = this.props, options = _props.options, onPullDown = _props.onPullDown, onPullUp = _props.onPullUp; var opts = _extends({ scrollbar: { fade: true }, click: true }, options); var state = {}; if (onPullDown) { opts.pullDownRefresh = { threshold: 60, stop: 60 }; state.pullDown = true; } if (onPullUp) { opts.pullUpLoad = { threshold: 60 }; state.pullUp = true; } this.bScroll = new _betterScroll2.default(this.wrapperRef.current, opts); if (Object.keys(state).length) { this.setState(state); } } }, { key: 'render', value: function render() { var _props2 = this.props, children = _props2.children, onPullDown = _props2.onPullDown, onPullUp = _props2.onPullUp, className = _props2.className; var _state = this.state, pullDown = _state.pullDown, pullUp = _state.pullUp; return _react2.default.createElement( Wrapper, { className: className, innerRef: this.wrapperRef }, _react2.default.createElement( 'div', { className: 'bScroll-content' }, children, pullUp ? _react2.default.createElement(_PullUp2.default, { bScroll: this.bScroll, onPullUp: onPullUp }) : null ), pullDown ? _react2.default.createElement(_PullDown2.default, { bScroll: this.bScroll, onPullDown: onPullDown }) : null ); } }]); return Scroller;}(_react.PureComponent);Scroller.propTypes = { options: _propTypes2.default.object, children: _propTypes2.default.any, onPullDown: _propTypes2.default.func, onPullUp: _propTypes2.default.func, className: _propTypes2.default.string};Scroller.defaultProps = { options: {}, children: null, onPullDown: null, onPullUp: null, className: 'bScroll'};exports.default = Scroller; PullUp.js
'use strict';Object.defineProperty(exports, "__esModule", { value: true});var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();var _templateObject = _taggedTemplateLiteral(['\n width: 100%;\n height: 60px;\n'], ['\n width: 100%;\n height: 60px;\n']), _templateObject2 = _taggedTemplateLiteral(['\n height: 100%;\n line-height: 60px;\n text-align: center;\n'], ['\n height: 100%;\n line-height: 60px;\n text-align: center;\n']), _templateObject3 = _taggedTemplateLiteral(['\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n'], ['\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n']);var _react = require('react');var _react2 = _interopRequireDefault(_react);var _propTypes = require('prop-types');var _propTypes2 = _interopRequireDefault(_propTypes);var _styledComponents = require('styled-components');var _styledComponents2 = _interopRequireDefault(_styledComponents);var _spin = require('../spin');var _spin2 = _interopRequireDefault(_spin);function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }function _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }var Wrapper = _styledComponents2.default.div(_templateObject);var Before = _styledComponents2.default.div(_templateObject2);var After = _styledComponents2.default.div(_templateObject3);var PullUp = function (_PureComponent) { _inherits(PullUp, _PureComponent); function PullUp(props) { _classCallCheck(this, PullUp); var _this = _possibleConstructorReturn(this, (PullUp.__proto__ || Object.getPrototypeOf(PullUp)).call(this, props)); _this.state = { loading: false, text: '加载更多' }; return _this; } _createClass(PullUp, [{ key: 'componentDidMount', value: function componentDidMount() { var _this2 = this; var _props = this.props, bScroll = _props.bScroll, onPullUp = _props.onPullUp; bScroll.on('pullingUp', function () { _this2.setState({ loading: true }); var result = onPullUp(); if (!result) { _this2.setState({ loading: false, text: '没有更多数据了~' }); bScroll.finishPullUp(); } else { result.then(function () { _this2.setState({ loading: false, text: '加载更多' }); bScroll.finishPullUp(); bScroll.refresh(); }); } }); } }, { key: 'render', value: function render() { var _state = this.state, loading = _state.loading, text = _state.text; var beforeStyle = { display: !loading ? 'block' : 'none' }; return _react2.default.createElement( Wrapper, null, _react2.default.createElement( Before, { style: beforeStyle }, text ), loading ? _react2.default.createElement( After, null, _react2.default.createElement(_spin2.default, { size: '32px' }) ) : null ); } }]); return PullUp;}(_react.PureComponent);PullUp.propTypes = { bScroll: _propTypes2.default.object.isRequired, onPullUp: _propTypes2.default.func.isRequired};exports.default = PullUp; PullDown.js
'use strict';Object.defineProperty(exports, "__esModule", { value: true});var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();var _templateObject = _taggedTemplateLiteral(['\n position: absolute;\n width: 100%;\n height: 60px;\n left: 0;\n'], ['\n position: absolute;\n width: 100%;\n height: 60px;\n left: 0;\n']), _templateObject2 = _taggedTemplateLiteral(['\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n \n .icon {\n width: 32px;\n height: 32px;\n \n &.flip {\n transform: rotate(-180deg) translateZ(0); \n }\n }\n'], ['\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n \n .icon {\n width: 32px;\n height: 32px;\n \n &.flip {\n transform: rotate(-180deg) translateZ(0); \n }\n }\n']), _templateObject3 = _taggedTemplateLiteral(['\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n'], ['\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n']);var _react = require('react');var _react2 = _interopRequireDefault(_react);var _propTypes = require('prop-types');var _propTypes2 = _interopRequireDefault(_propTypes);var _styledComponents = require('styled-components');var _styledComponents2 = _interopRequireDefault(_styledComponents);var _ArrowDown = require('../icons/ArrowDown');var _ArrowDown2 = _interopRequireDefault(_ArrowDown);var _spin = require('../spin');var _spin2 = _interopRequireDefault(_spin);function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }function _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }var Wrapper = _styledComponents2.default.div(_templateObject);var Before = _styledComponents2.default.div(_templateObject2);var After = _styledComponents2.default.div(_templateObject3);var PullDown = function (_PureComponent) { _inherits(PullDown, _PureComponent); function PullDown(props) { _classCallCheck(this, PullDown); var _this = _possibleConstructorReturn(this, (PullDown.__proto__ || Object.getPrototypeOf(PullDown)).call(this, props)); _this.isRebounding = false; _this.initTop = -60; _this.initState = { top: _this.initTop + 'px', before: true, isFlip: false }; _this.state = _this.initState; return _this; } _createClass(PullDown, [{ key: 'componentDidMount', value: function componentDidMount() { var _this2 = this; var _props = this.props, bScroll = _props.bScroll, onPullDown = _props.onPullDown; bScroll.on('pullingDown', function () { _this2.setState({ before: false }); onPullDown().then(function () { _this2.isRebounding = true; bScroll.finishPullDown(); setTimeout(function () { _this2.setState(_this2.initState); _this2.isRebounding = false; bScroll.refresh(); }, bScroll.options.bounceTime); }); }); bScroll.on('scroll', function (pos) { var state = {}; if (_this2.state.before) { state.top = Math.min(pos.y + _this2.initTop, 0) + 'px'; } if (pos.y >= 60) { state.isFlip = true; } if (_this2.isRebounding) { state.top = 0 - (60 - pos.y) + 'px'; } if (Object.keys(state).length) { _this2.setState(state); } }); } }, { key: 'render', value: function render() { var _state = this.state, top = _state.top, before = _state.before, isFlip = _state.isFlip; var wrapperStyle = { top: top }; var ArrowIconClassName = isFlip ? 'icon flip' : 'icon'; return _react2.default.createElement( Wrapper, { style: wrapperStyle }, before ? _react2.default.createElement( Before, null, _react2.default.createElement(_ArrowDown2.default, { className: ArrowIconClassName }) ) : null, before ? null : _react2.default.createElement( After, null, _react2.default.createElement(_spin2.default, { size: '32px' }) ) ); } }]); return PullDown;}(_react.PureComponent);PullDown.propTypes = { bScroll: _propTypes2.default.object.isRequired, onPullDown: _propTypes2.default.func.isRequired};exports.default = PullDown;