美文网首页
2020-11-16技术小记

2020-11-16技术小记

作者: 草珊瑚_6557 | 来源:发表于2020-11-24 10:31 被阅读0次

    移动端分页策略

    问题:
    加载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>
    

    相关文章

      网友评论

          本文标题:2020-11-16技术小记

          本文链接:https://www.haomeiwen.com/subject/khoabktx.html