| New file | 
 |  |  | 
 |  |  | <template> | 
 |  |  |    <!-- #ifdef APP-NVUE --> | 
 |  |  |    <list | 
 |  |  |       class="u-list" | 
 |  |  |       :enableBackToTop="enableBackToTop" | 
 |  |  |       :loadmoreoffset="lowerThreshold" | 
 |  |  |       :showScrollbar="showScrollbar" | 
 |  |  |       :style="[listStyle]" | 
 |  |  |       :offset-accuracy="Number(offsetAccuracy)" | 
 |  |  |       @scroll="onScroll" | 
 |  |  |       @loadmore="scrolltolower" | 
 |  |  |    > | 
 |  |  |       <slot /> | 
 |  |  |    </list> | 
 |  |  |    <!-- #endif --> | 
 |  |  |    <!-- #ifndef APP-NVUE --> | 
 |  |  |    <scroll-view | 
 |  |  |       class="u-list" | 
 |  |  |       :scroll-into-view="scrollIntoView" | 
 |  |  |       :style="[listStyle]" | 
 |  |  |       scroll-y | 
 |  |  |       :scroll-top="Number(scrollTop)" | 
 |  |  |       :lower-threshold="Number(lowerThreshold)" | 
 |  |  |       :upper-threshold="Number(upperThreshold)" | 
 |  |  |       :show-scrollbar="showScrollbar" | 
 |  |  |       :enable-back-to-top="enableBackToTop" | 
 |  |  |       :scroll-with-animation="scrollWithAnimation" | 
 |  |  |       @scroll="onScroll" | 
 |  |  |       @scrolltolower="scrolltolower" | 
 |  |  |       @scrolltoupper="scrolltoupper" | 
 |  |  |    > | 
 |  |  |       <view> | 
 |  |  |          <slot /> | 
 |  |  |       </view> | 
 |  |  |    </scroll-view> | 
 |  |  |    <!-- #endif --> | 
 |  |  | </template> | 
 |  |  |  | 
 |  |  | <script> | 
 |  |  |    import props from './props.js'; | 
 |  |  |    // #ifdef APP-NVUE | 
 |  |  |    const dom = uni.requireNativePlugin('dom') | 
 |  |  |    // #endif | 
 |  |  |    /** | 
 |  |  |     * List 列表 | 
 |  |  |     * @description 该组件为高性能列表组件 | 
 |  |  |     * @tutorial https://www.uviewui.com/components/list.html | 
 |  |  |     * @property {Boolean}         showScrollbar      控制是否出现滚动条,仅nvue有效 (默认 false ) | 
 |  |  |     * @property {String | Number}   lowerThreshold      距底部多少时触发scrolltolower事件 (默认 50 ) | 
 |  |  |     * @property {String | Number}   upperThreshold      距顶部多少时触发scrolltoupper事件,非nvue有效 (默认 0 ) | 
 |  |  |     * @property {String | Number}   scrollTop         设置竖向滚动条位置(默认 0 ) | 
 |  |  |     * @property {String | Number}   offsetAccuracy      控制 onscroll 事件触发的频率,仅nvue有效(默认 10 ) | 
 |  |  |     * @property {Boolean}         enableFlex         启用 flexbox 布局。开启后,当前节点声明了display: flex就会成为flex container,并作用于其孩子节点,仅微信小程序有效(默认 false ) | 
 |  |  |     * @property {Boolean}         pagingEnabled      是否按分页模式显示List,(默认 false ) | 
 |  |  |     * @property {Boolean}         scrollable         是否允许List滚动(默认 true ) | 
 |  |  |     * @property {String}         scrollIntoView      值应为某子元素id(id不能以数字开头) | 
 |  |  |     * @property {Boolean}         scrollWithAnimation   在设置滚动条位置时使用动画过渡 (默认 false ) | 
 |  |  |     * @property {Boolean}         enableBackToTop      iOS点击顶部状态栏、安卓双击标题栏时,滚动条返回顶部,只对微信小程序有效 (默认 false ) | 
 |  |  |     * @property {String | Number}   height            列表的高度 (默认 0 ) | 
 |  |  |     * @property {String | Number}   width            列表宽度 (默认 0 ) | 
 |  |  |     * @property {String | Number}   preLoadScreen      列表前后预渲染的屏数,1代表一个屏幕的高度,1.5代表1个半屏幕高度  (默认 1 ) | 
 |  |  |     * @property {Object}         customStyle         定义需要用到的外部样式 | 
 |  |  |     * | 
 |  |  |     * @example <u-list @scrolltolower="scrolltolower"></u-list> | 
 |  |  |     */ | 
 |  |  |    export default { | 
 |  |  |       name: 'u-list', | 
 |  |  |       mixins: [uni.$u.mpMixin, uni.$u.mixin,props], | 
 |  |  |       watch: { | 
 |  |  |          scrollIntoView(n) { | 
 |  |  |             this.scrollIntoViewById(n) | 
 |  |  |          } | 
 |  |  |       }, | 
 |  |  |       data() { | 
 |  |  |          return { | 
 |  |  |             // 记录内部滚动的距离 | 
 |  |  |             innerScrollTop: 0, | 
 |  |  |             // vue下,scroll-view在上拉加载时的偏移值 | 
 |  |  |             offset: 0, | 
 |  |  |             sys: uni.$u.sys() | 
 |  |  |          } | 
 |  |  |       }, | 
 |  |  |       computed: { | 
 |  |  |          listStyle() { | 
 |  |  |             const style = {}, | 
 |  |  |                addUnit = uni.$u.addUnit | 
 |  |  |             if (this.width != 0) style.width = addUnit(this.width) | 
 |  |  |             if (this.height != 0) style.height = addUnit(this.height) | 
 |  |  |             // 如果没有定义列表高度,则默认使用屏幕高度 | 
 |  |  |             if (!style.height) style.height = addUnit(this.sys.windowHeight, 'px') | 
 |  |  |             return uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle)) | 
 |  |  |          } | 
 |  |  |       }, | 
 |  |  |       provide() { | 
 |  |  |          return { | 
 |  |  |             uList: this | 
 |  |  |          } | 
 |  |  |       }, | 
 |  |  |       created() { | 
 |  |  |          this.refs = [] | 
 |  |  |          this.children = [] | 
 |  |  |          this.anchors = [] | 
 |  |  |       }, | 
 |  |  |       mounted() {}, | 
 |  |  |       methods: { | 
 |  |  |          updateOffsetFromChild(top) { | 
 |  |  |             this.offset = top | 
 |  |  |          }, | 
 |  |  |          onScroll(e) { | 
 |  |  |             let scrollTop = 0 | 
 |  |  |             // #ifdef APP-NVUE | 
 |  |  |             scrollTop = e.contentOffset.y | 
 |  |  |             // #endif | 
 |  |  |             // #ifndef APP-NVUE | 
 |  |  |             scrollTop = e.detail.scrollTop | 
 |  |  |             // #endif | 
 |  |  |             this.innerScrollTop = scrollTop | 
 |  |  |             this.$emit('scroll', Math.abs(scrollTop)) | 
 |  |  |          }, | 
 |  |  |          scrollIntoViewById(id) { | 
 |  |  |             // #ifdef APP-NVUE | 
 |  |  |             // 根据id参数,找到所有u-list-item中匹配的节点,再通过dom模块滚动到对应的位置 | 
 |  |  |             const item = this.refs.find(item => item.$refs[id] ? true : false) | 
 |  |  |             dom.scrollToElement(item.$refs[id], { | 
 |  |  |                // 是否需要滚动动画 | 
 |  |  |                animated: this.scrollWithAnimation | 
 |  |  |             }) | 
 |  |  |             // #endif | 
 |  |  |          }, | 
 |  |  |          // 滚动到底部触发事件 | 
 |  |  |          scrolltolower(e) { | 
 |  |  |             uni.$u.sleep(30).then(() => { | 
 |  |  |                this.$emit('scrolltolower') | 
 |  |  |             }) | 
 |  |  |          }, | 
 |  |  |          // #ifndef APP-NVUE | 
 |  |  |          // 滚动到底部时触发,非nvue有效 | 
 |  |  |          scrolltoupper(e) { | 
 |  |  |             uni.$u.sleep(30).then(() => { | 
 |  |  |                this.$emit('scrolltoupper') | 
 |  |  |                // 这一句很重要,能绝对保证在性功能障碍的webview,滚动条到顶时,取消偏移值,让页面置顶 | 
 |  |  |                this.offset = 0 | 
 |  |  |             }) | 
 |  |  |          } | 
 |  |  |          // #endif | 
 |  |  |       }, | 
 |  |  |    } | 
 |  |  | </script> | 
 |  |  |  | 
 |  |  | <style lang="scss" scoped> | 
 |  |  |    @import "../../libs/css/components.scss"; | 
 |  |  |  | 
 |  |  |    .u-list { | 
 |  |  |       @include flex(column); | 
 |  |  |  | 
 |  |  |    } | 
 |  |  | </style> |