# react-scroll-paged-view
[View README in English](./README.md)
[如果你对我的开发过程感兴趣不妨读读,相信会有所收获](./docs/Dev_Record.md)
**滚动视图,内滚动,整页滚动,嵌套滚动视图**
## 安装
```
npm install react-scroll-paged-view --save
```
## 简介
- 支持 RN 端,相应的 web 端组件也有
- 整页滚动和页内滚动结合,类似京东等 app 的商品详情页上下页查看
- iOS RN 代码完美支持,Android 则提供了原生包支持,基于 RN ScrollView 改动了部分代码得以支持
- 目前开源的 RN 项目中并没有内滚动和页滚动结合的,基于需要写了这个组件
- 此外还额外提供了核心功能模块 ViewPaged 可供使用
- 提供子组件封装的 ScrollView 组件,可以选择使用
- 所有分页为按需加载,不必担心初始会全部渲染
- 无限分页也是懒处理,最小程度校准当前索引页,即使快速切换滑动也很流畅
- RN 和 web 动画基于 animated 库,共用一套代码处理
- 提供了 renderHeader 和 renderFooter 可做 tab 切换或轮播图等
- web 版的两个组件都有提供类变量 isTouch 用于判断是否为触摸事件,可借此区分滚动触发的点击事件
- 支持 ssr,2.1+版本移除初始测量尺寸所导致的组件重复创建和销毁,性能更好
- 2.1.3+版本在为横向滚动且不无限滚动时使用 ScrollView 作为滚动容器,这样子视图可以使用 ScrollView 来纵向滚动
## 注意
- ~~**兼容至"react-native": "~0.54.0"版本**~~
- ~~**react native0.47 版本的使用 0.1.\*版本**~~
- **已完美兼容以上 RN 的版本,直接安装最新的包即可**
- **没有出现在内部 ScrollView 组件中的点击事件可以用 onPressIn 代替**
- **infinite 和 autoPlay 只提供给 ViewPaged 组件,ScrollPagedView 会默认关闭此选项**
## Demo
| IOS | Android | Web |
| ---------------------- | ------------------------------ | ---------------------- |
|  |  |  |
### Other
你所能实现的取决于你所能想象的
| Horizontal | Tab | Carousel |
| ------------------------------------ | ---------------------- | -------------------------------- |
|  |  |  |
## 使用
### ScrollPagedView
ScrollPagedView 组件基于 ViewPaged 组件封装了内滚动组件,通过 context 使用
```javascript
import ScrollPagedView from 'react-scroll-paged-view'
import InsideScrollView from './InsideScrollView'
...
_onChange = (pageIndex) => {
...
}
render() {
return (
)
}
...
```
#### Context ScrollView(InsideScrollView)
```javascript
...
static contextTypes = {
ScrollView: PropTypes.func,
}
render() {
const ScrollView = this.context.ScrollView
return (
...
)
}
...
```
### ViewPaged
ViewPaged 组件和 ScrollPagedView 组件用法一致,可以自由使用 infinite 和 autoPlay
```javascript
import { ViewPaged } from 'react-scroll-paged-view'
```
## Export module
- default - ScrollPagedView
- ViewPaged
## 属性
### ScrollPagedView
ScrollPagedView 组件基于 ViewPaged 组件,可以根据需要传入 ViewPaged 的 props,参考下面 ViewPaged 组件的 props
| Name | propType | default value | description |
| ------- | -------- | ------------- | ------------------------------------------------------------- |
| withRef | bool | false | 获取 ViewPaged 实例 ref,通过组件的 getViewPagedInstance 方法 |
### Context ScrollView
| Name | propType | default value | description |
| ------------------------ | -------- | ------------- | -------------------- |
| nativeProps(native only) | object | {} | RN scrollView Props |
| webProps(web only) | object | {} | Web scrollView Props |
### ViewPaged
RN 和 web 有相同的 props,表现也一致
#### Common Props
| Name | propType | default value | description |
| -------------- | ---------------- | ------------- | ------------------------------------------------------------------ |
| style | object | {} | ViewPaged 样式 |
| initialPage | number | 0 | 初始页索引 |
| vertical | bool | true | 是否为垂直切换视图 |
| onChange | function | () => {} | 切换分页回调,参数为 currentPage 和 prevPage |
| duration | number | 400 | 动画持续时间(以毫秒为单位) |
| infinite | bool | false | 是否为无限滚动视图 |
| renderHeader | function/element | undefined | Header 组件,参数为 activeTab, goToPage, width, pos |
| renderFooter | function/element | undefined | Footer 组件,参数为 activeTab, goToPage, width, pos |
| renderPosition | string | top | Header/Footer 方向,有 4 个值,分别为'top','left','bottom','right' |
| autoPlay | bool | false | 是否自动轮播 |
| autoPlaySpeed | number | 2000 | 自动轮播间隔时间(以毫秒为单位) |
| hasAnimation | bool | true | 点击切换时否有动画 |
| locked | bool | false | 是否允许拖动切换 |
| preRenderRange | number | 0 | 控制每次更新时 render 组件的范围 |
| isMovingRender | bool | false | 触摸移动时预加载下一页 |
#### RN Only Props
| Name | propType | default value | description |
| ----------------------------------- | -------- | ------------- | ---------------------------------- |
| onStartShouldSetPanResponder | function | () => true | 参考 React Native 官网手势响应系统 |
| onStartShouldSetPanResponderCapture | function | () => false | 参考 React Native 官网手势响应系统 |
| onMoveShouldSetPanResponder | function | () => true | 参考 React Native 官网手势响应系统 |
| onMoveShouldSetPanResponderCapture | function | () => false | 参考 React Native 官网手势响应系统 |
| onPanResponderTerminationRequest | function | () => true | 参考 React Native 官网手势响应系统 |
| onShouldBlockNativeResponder | function | () => true | 参考 React Native 官网手势响应系统 |
| onPanResponderTerminate | function | () => {} | 参考 React Native 官网手势响应系统 |
## TODO
- [x] 优化滚动区域索引,使用代理 ScrollView 完成
- [x] Android 兼容 React Native 不同版本
- [x] 支持 web 端组件
- [x] 优化 web 端组件
- [x] 优化 web 无限滚动
- [x] 完善 web 端 ViewPaged
- [x] 优化结构、代码,统一命名
- [x] 统一兼容 React Native 不同版本
- [x] 记录开发过程
- [x] 完善 RN 端 ViewPaged 达到和 web 端表现一致
- [x] 更多 props 配置
## Changelog
- 0.1.\*
- 1.0.\*
- 1.1.\*
- 1.2.\*
- 1.3.\*
- 1.5.\*
- 1.6.\*
### 2.0.\*
- 整体重构项目,针对 web 端重构提高代码复用
- 增加了依赖包 animated,动画处理更为流畅,性能更好
- 使用 hoc 最大程度复用了三端的公共代码,各个端仅保留自己平台的代码
- 统一了 RN 端和 web 端的 props,并使其表现一致
- 针对 ssr 服务端渲染也做了支持
### 2.1.\*
- 针对 ssr 统一了 RN 和 web 的 render 方法
- 移除初始测量组件尺寸时独立的一次 render
- 避免子组件重复创建和销毁,性能更好
### 2.1.4+
- 移除了上传 npm 包里的.babelrc 等配置文件,react native 会使用包里的 babel 配置,没有安装这些配置依赖会报错
### 2.2.0+
- 优化代码结构,精确控制组件 render 次数,提高页面性能,并提供预加载和 render 范围的 props