2020-11-16技术小记

2020-11-24  本文已影响0人  草珊瑚_6557

移动端分页策略

问题:
加载0到9个数据后,此时数据库新增了一个最新数据。下次请求10到19个数据时,会有一个数据和之前的0到9数据重复。

修复方式:
1、后台更改接口,需要传入第10个数据的id传入,基于此进行范围数据查询返回。
2、前端使用0-10,0-20,0-30分页方式

页面hash路由和history路由区别

hash 模式下,仅 hash 符号之前的内容会被包含在请求中,如 http://www.abc.com,因此对于后端来说,即使没有做到对路由的全覆盖,也不会返回 404 错误。

history 模式下,前端的 URL 必须和实际向后端发起请求的 URL 一致,如 http://www.abc.com/book/id。如果后端缺少对 /book/id 的路由处理,将返回 404 错误。
所以你要在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。”

浏览器原生支持的判断元素进入"视口"(viewport)的api

Intersection Observer API
https://developer.mozilla.org/zh-CN/docs/Web/API/Intersection_Observer_API
http://www.ruanyifeng.com/blog/2016/11/intersectionobserver_api.html
试用场景:移动端分页

var intersectionObserver = new IntersectionObserver(
  function (entries) {
    // 如果不可见,就返回
    if (entries[0].intersectionRatio <= 0) return;
    loadItems(10);
    console.log('Loaded new items');
  });

// 开始观察
intersectionObserver.observe(
  document.querySelector('.scrollerFooter')
);

一个完整的demo

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>intersection observer api的异步记载无限滚动用例</title>
  <style>
    body{
      margin: 0;
    }
    #root div{
      border-bottom: 1px solid #ccc;
      height: 100px;
    }
    .scrollerFooter{
      width: 100%;
      height: 100px;
    }
  </style>
</head>
<body>
  <div id="root"></div>
  <div class="scrollerFooter">加载更多</div>
</body>
<script>
  let loading = false;
  const addItem = ()=>{
    loading = true;
    const root = document.getElementById('root');
    const fragment = document.createDocumentFragment();
    for (let i=0;i<10;i++) {
      let li = document.createElement('div');
      li.innerHTML = `div ${i}`;
      fragment.appendChild(li);
    }
    setTimeout(()=>{
      loading = false;
      root.appendChild(fragment);
    },2000);
    
  };
  const intersectionObserver = new IntersectionObserver(
    (entries) => {
      // 如果不可见,就返回
      if(loading){
        return
      }

      // 也可用IntersectionObserverEntry.isIntersecting,兼容性参考:https://developer.mozilla.org/zh-CN/docs/Web/API/IntersectionObserverEntry/isIntersecting
      if (entries[0].intersectionRatio <= 0) {
        return
      };
      addItem();
      console.log('加载更多');
    },
    {
      threshold: [1]
    }
  );

  // 开始观察
  intersectionObserver.observe(
    document.querySelector('.scrollerFooter')
  );

  addItem();
</script>
</html>
上一篇 下一篇

猜你喜欢

热点阅读