事件是交给原生事件还是交由 React 的合成事件呢? 在最初的实现中参考 react-swipe 相当于是自己封装原生事件。
但是在 React 的生态下,还是尽量用 React
封装的合成事件更为妥当。举几个原因:
.simulate
的时候能统一;原生事件和 React 合成事件类似鱼和熊掌不可兼得。
e.touches[0].pageX, cdn 讲了其包含水平滚动的位置
rest
, 第 4、5 张图片位于右侧的 rest
;初始化阶段对任何窗口执行以下算法:
向左平移当前窗口数 * width
width
index
, 和其左右的元素 index - 1
、index + 1
;transitionDuration
属性以及 transform
属性来完成delta = {x: touches.pageX - start.x,y: touches.pageY - start.y};
delta.x > 0
, 手势从右往左滑动是向右滑动 delta.x < 0
为了解决在一个页面中使用多处 Swipe
组件,首先提供了一个 id 参数来进行区分多个 Swipe 组件, 思路是在封装的组件内部通过 document.getElementById(id)
获取到这个 dom 节点,然后进行位置的初始化。
<Swipeid="demo"></Swipe>
传入额外的 id 这对使用者是一个不必要的负担, 可以在组件内使用 ref
获取到对应的 dom
。
目前的实现为非受控组件, 若要将其改为受控组件, 改的地方比较多, 必须使用 state
来替换全局参数。另外位置的信息在 React.cloneElement()
中进行处理。
jest
跑如下测试用例, 当跑到 componentDidMount
里的 document.getElementById('demo')
并不拿到相应元素。
mount(<Swipe><div key="1">PANE 1</div><div key="2">PANE 2</div><div key="3">PANE 3</div><div key="4">PANE 4</div></Swipe>)
componentDidMount() {document.getElementById('demo')}render() {return (<div id="demo">...</div>)}
原因是因为 mount
渲染组件是挂载到 jsdom 上而非真实 dom
上, 当时的解决思路如下:
mount(<Swipe><div key="1">PANE 1</div><div key="2">PANE 2</div><div key="3">PANE 3</div><div key="4">PANE 4</div></Swipe>, { attatch: document.body })
经过上述去除步骤去掉 document.getElementById
使用 ref 后, { attatch: document.body }
也便去掉了。
rest on a snap point
if it isn't currently scrolled.rest on a snap point
if it isn't currently scrolled considering the user agent's scroll parameters.阅读文档后, 该 api 浏览器兼容情况不是特别好(ios 要 11 以上), 此外, 比如循环轮播是无法实现的。