iscroll - refresh 相关问题

1486 查看

之前做React Native 的时候问就遇到过一个问题
通过 web 获取的 image 不能和 浏览器一样通过百分比设置 width 来自适应 height,

(浏览器 默认是先渲染1个 1×1 px 的点)
React Native 官方文档解释, 为了更好的用户体验之类的,
不让页面文档被加载的图片完成时挤压下去,
所以所有非本地 <Image/> 组件必须先指定宽高,
否则无法显示出来 实际就是 0×0px.
(本地图片可以不指定, 它默认会根据自己的图片实际宽高显示)

用过 IScroll 的都知道, 有一个 refresh() 方法, 一般是当 DOM 改变(Ajax 之类的)的时候通过改方法重新计算 scrollHeight 的高度.
这也是为什么 IScroll 官方例子是在 body.onload 事件里 初始化 IScroll

但是 新 DOM 内有图片元素的话, 还需要再次监听 img.onload 事件
再次执行 refresh() 方法

实际操作中就将使用 2次 refresh()

  • ajax DOM 改变的时候需要 refresh()
  • image.onliad 再次 refresh()

那么这个 refresh() 写多了真的不爽
所以现在在写 webapp 的时候 推荐使用把 占位容器 高度写死, 这样就可以避免监听img.onload 事件
配合 vw vh 单位, 这样也能做到自适应高度

当然对图片数据的比例就要求统一了
当然 也可以使用 background-clip或者 object-fit 属性来使图片相对居中显示

[lang=jade]
.img-box
  img(src="...")
[lang=stylus]
.img-box
  width 50vw
  height 50vw
  overflow hidden
  backgroun-image url('/*loading图片*/')
  img
    width 100%
    min-height 100%
    object-fit cover
  • 面对 React Native 必须指定高度, 没办法我稚嫩好选择妥协
  • 使用 IScroll 上拉再加更多/下拉刷新 功能时, 我觉得这样做是有意义的