# nested-scroll

# 介绍

协调嵌套的 BetterScroll 滚动行为。

警告

v2.1.0 支持多层嵌套的 BetterScroll,并且功能更强大,性能更好。在这之前,只支持双层嵌套,请尽快升级至 2.1.0 版本。

提示

v2.1.0 完美解决多层嵌套 BetterScroll 的 click 事件多次派发的问题。

# 安装

npm install @better-scroll/nested-scroll --save

// or

yarn add @better-scroll/nested-scroll

# 使用

你需要首先引入 nested-scroll 插件,并通过全局方法 BScroll.use() 使用

  import BScroll from '@better-scroll/core'
  import NestedScroll from '@better-scroll/nested-scroll'

  BScroll.use(NestedScroll)

上面步骤完成后,BScroll 的 options 中配置 nestedScroll

  // < v2.1.0
  // parent bs
  new BScroll('.outerWrapper', {
    nestedScroll: true
  })
  // child bs
  new BScroll('.innerWrapper', {
    nestedScroll: true
  })

  // v2.1.0
  // parent bs
  new BScroll('.outerWrapper', {
    nestedScroll: {
      groupId: 'dummy-divide' // string or number
    }
  })
  // child bs
  new BScroll('.innerWrapper', {
    nestedScroll: {
      groupId: 'dummy-divide'
    }
  })

具有相同 groupId 的 BetterScroll 实例(bs)共享同一个 NestedScroll 实例(ns),ns 会协调每个 bs 滚动行为,一旦某个 bs 销毁的时候,ns 都会失去对它的掌控,例如:

// parent bs
const bs1 = new BScroll('.outerWrapper', {
  nestedScroll: {
    groupId: 'shared' // string or number
  }
})
// child bs
const bs2 = new BScroll('.innerWrapper', {
  nestedScroll: {
    groupId: 'shared'
  }
})

console.log(bs1.plugins.nestedScroll === bs2.plugins.nestedScroll) // true

bs2.destroy() // nestedScroll 不再约束 bs2,不再协调 bs1 与 bs2 的滚动行为

# 示例

  • 竖向双层嵌套 2.1.0

    <template>
      <div class="container">
        <div ref="outerScroll" class="outer-wrapper">
          <div class="outer-content">
            <ul>
              <li class="outer-list-item" @click="handleOuterClick" v-for="(item, index) in outerOpenData" :key="index">{{item}}</li>
            </ul>
            <div ref="innerScroll" class="inner-wrapper">
              <ul class="inner-content">
                <li class="inner-list-item" v-for="(item, index) in innerData" @click="handleInnerClick" :key="index">{{item}}</li>
              </ul>
            </div>
            <ul>
              <li class="outer-list-item" @click="handleOuterClick" v-for="(item, index) in outerCloseData" :key="index">{{item}}</li>
            </ul>
          </div>
    
        </div>
      </div>
    </template>
  • 竖向三层嵌套 2.1.0

    <template>
      <div class="container">
        <div ref="outerScroll" class="outer-wrapper">
          <div class="outer-content">
            <ul>
              <li class="outer-list-item" @click="handleOuterClick" v-for="(item, index) in outerOpenData" :key="index">{{item}}</li>
            </ul>
            <div ref="middleScroll"  class="middle-wrapper">
              <div class="middle-content">
                <ul>
                  <li class="middle-list-item" @click="handleMiddleClick" v-for="(item, index) in middleOpenData" :key="index">{{item}}</li>
                </ul>
                <div ref="innerScroll" class="inner-wrapper">
                  <ul class="inner-content">
                    <li class="inner-list-item" v-for="(item, index) in innerData" @click="handleInnerClick" :key="index">{{item}}</li>
                  </ul>
                </div>
                <ul>
                  <li class="middle-list-item" @click="handleMiddleClick" v-for="(item, index) in middleCloseData" :key="index + 100">{{item}}</li>
                </ul>
              </div>
            </div>
            <ul>
              <li class="outer-list-item" @click="handleOuterClick" v-for="(item, index) in outerCloseData" :key="index + 100">{{item}}</li>
            </ul>
          </div>
    
        </div>
      </div>
    </template>
  • 横向双层嵌套 2.1.0

    • 横向竖向双层嵌套 2.1.0

# 实例方法 2.1.0

提示

以下方法皆已代理至 BetterScroll 实例,例如:

import BScroll from '@better-scroll/core'
import NestedScroll from '@better-scroll/nested-scroll'

BScroll.use(NestedScroll)

const bs1 = new BScroll('.parent-wrapper', {
  nestedScroll: {
    groupId: 'dummy'
  }
})

const bs2 = new BScroll('.child-wrapper', {
  nestedScroll: {
    groupId: 'dummy'
  }
})

// 销毁 nestedScroll,bs1 与 bs2 共享同一个 nestedScroll 实例,因为他们的 groupId 相同
bs1.purgeNestedScroll() // 与 bs2.purgeNestedScroll() 的效果一样

# purgeNestedScroll()

  • 介绍:销毁管控自己的 nestedScroll

注意

不同的 groupId 会生成不同的 nestedScroll,相同的 groupId 会共享同一份 nestedScroll,因此你应该在合适的时机(比如组件销毁的时候)调用 purgeNestedScroll 来清理内存。或者你也可以调用 BetterScroll 的 destroy 方法把自身从 nestedScroll 移除,例如:

const bs1 = new BScroll('.parent-wrapper', {
  nestedScroll: {
    groupId: 'dummy'
  }
})

const bs2 = new BScroll('.child-wrapper', {
  nestedScroll: {
    groupId: 'dummy'
  }
})

bs1.destroy() // nestedScroll 不再管控 bs1
bs2.destroy() // nestedScroll 不再管控 bs2

# 静态方法 2.1.0

# getAllNestedScrolls()

  • 介绍:获取当前所有的 nestedScroll 实例

  • 返回:nestedScroll 实例组成的数组

import NestedScroll from '@better-scroll/nested-scroll'

const nestedScrolls: NestedScroll[] = NestedScroll.getAllNestedScrolls()

# purgeAllNestedScrolls()

  • 介绍:销毁当前所有的 nestedScroll 实例
import NestedScroll from '@better-scroll/nested-scroll'

// 不再约束任何 BetterScroll 实例
NestedScroll.purgeAllNestedScrolls()