从需求谈起:在 MIP 页中异步加载数据

MIP(移动网页加速器)加速原理 除了靠谱的 MIP-Cache CDN 加速外,最值得一提的就是组件系统。所有 JS 交互都需要使用 MIP 组件实现,保证页面中所有 JS 都是最精简高效的,避免一个导航效果需要引用 jquery.js,bootstrap.js,bootstrap-some-nav.js 等多个 JS 实现。

诚然,“所有交互都要使用组件,或自己封装组件” 对于大部分开发者朋友来说,是有些不自由的。很多 MIP 开发者会有类似的疑问:

我想从服务器获取数据,渲染到页面上。是不是要自己封装 MIP 组件啦?

又或者:

推荐数据是实时计算的,并且有很多条,要做瀑布流加载效果,我的 JS 要怎么引入到页面里来?

这些合理合法的异步数据加载需求,MIP 都已经支持了,而且不需要写一行 JS 代码!

异步加载数据-通用解决方案

在直接将用法之前,先感性地认识一下异步加载数据的通用方案。虽然每个网站的后端请求地址不同,数据库操作方式不同。但大家的需求是相同的:

异步加载数据,并呈现在页面上。

为了实现这个效果,大家也不约而同地选择了类似方案:

  1. 发送一个异步请求获取 JSON 数据
  2. 根据返回的数据 status 确认请求是否有效
  3. 解析有效的 JSON 数据,拼接在 HTML 标签中插入文档

写成伪代码是这个样子的:

// 第一步:发送异步请求,获取数据
var data = 异步请求 ('https://m. 域名 .com/ 请求地址 ', ' 体育新闻 ',' 第一页数据 ');
// 第二步:解析数据,拼装 DOM
var 实际内容 = [];
if(data.status == ' 请求成功 ') {
for(var i in data. 新闻数组) {
var 单个新闻 = data. 新闻数组 [i];
var 实际内容 [i] = '<a href = 单个新闻 . 链接> 单个新闻 . 标题 </a>'
}
}
// 第三步:将拼装好的 DOM 插入到文档流
document.querySelector(' 新闻 wrapper').innerHTML(实际内容 .join(''));

上述步骤中,异步请求拼装,for 循环数据处理,最终 DOM 操作都是通用的,真正变化的只有以下三个变量:

  • 异步请求链接
  • 返回数据格式
  • 插入位置

MIP 组件非常贴心地将所有通用 JS 封装起来,露出几个配置接口,供开发者直接使用。由于应用场景和交互要求区别,共实现了两个组件:MIP 列表组件和 MIP 无限下拉。

推荐 1:异步数据 MIP 组件--列表组件

列表组件 名称为<mip-list>,可用于将页面中配置的 JSON 数据渲染到页面中,也可以发送异步请求,并拼装数据插入到页面中。通常用于可变化数据的显示,如天气信息,阅读量等。

用法如下(有所简略):

<mip-list src="https:// 后端异步请求地址 " preLoad>

    <!-- template 标签为 html 模板,不会显示。每条数据按照这个模板的格式插入页面 -->
<template type="mip-mustache">
<a href="{{数据中的链接}}">{{数据中的新闻标题}}</a>
</template> </mip-list> <!-- mip-list 组件执行依赖以下两个 JS -->
<script src="https://c.mipcdn.com/static/v1/mip-list/mip-list.js"></script>
<script src="https://c.mipcdn.com/static/v1/mip-mustache/mip-mustache.js"></script>

配置服务器返回请求,对应的数据格式为:

{
"status": 0,
"data":
{
"items": [
{
" 数据中的链接 ": "https://a.xx.com/001",
" 数据中的新闻标题 ": "001_ 这是一个新闻标题 ",
},
{
" 数据中的链接 ": "https://a.xx.com/002",
" 数据中的新闻标题 ": "002_ 这是另一个新闻标题 ",
}
}
}

最终,mip-list 组件根据数据,拼装 DOM 插入页面,最终效果为:

<mip-list src="https:// 后端异步请求地址 " preLoad>
<template type="mip-mustache">
<a href="{{数据中的链接}}">{{数据中的新闻标题}}</a>
</template> <div class="mip-fill-content" role="list">
<!-- 开始:根据异步请求返回值,渲染出的 HTML -->
<a href="https://a.xx.com/001">001_ 这是一个新闻标题 </a>
<a href="https://a.xx.com/002">002_ 这是另一个新闻标题 </a>
<!-- 结束:根据异步请求返回值,渲染出的 HTML -->
</div>
</mip-list>

除了上文介绍的用法,<mip-list>列表组件支持渲染同步数据,点击加载更多等功能。可以参照 MIP 官网 mip-list 文档 说明来使用。

推荐 2:异步数据 MIP 组件--无限下拉

无限下拉 组件名称为<mip-infinitescroll>,当用户滚动到页面底部,或距离页面底部有一定距离时,自动发送异步请求获取更多数据,并插入页面。通常用于正文后的相关文章推荐,“你可能感兴趣” 栏目。

用法如下(有所简略):

<mip-infinitescroll data-src="https:// 后端异步请求地址 " template="myTemplate">

	<!-- template 标签为 html 模板,不会显示。每条数据按照这个模板的格式插入页面 -->
<template type="mip-mustache" id="myTemplate">
<a href="{{数据中的链接}}">{{数据中的新闻标题}}</a>
</template> <!-- mip-infinitescroll-results 是拼装完毕结果的插入位置 -->
<div class="mip-infinitescroll-results">
</div> </mip-infinitescroll> <!-- mip-infinitescroll 组件执行依赖以下两个 JS -->
<script src="https://c.mipcdn.com/static/v1/mip-infinitescroll/mip-infinitescroll.js"></script>
<script src="https://c.mipcdn.com/static/v1/mip-mustache/mip-mustache.js"></script>

配置服务器返回请求,对应的数据格式为:

{
"status": 0,
"data":
{
"items": [
{
" 数据中的链接 ": "https://a.xx.com/001",
" 数据中的新闻标题 ": "001_ 这是一个新闻标题 ",
},
{
" 数据中的链接 ": "https://a.xx.com/002",
" 数据中的新闻标题 ": "002_ 这是另一个新闻标题 ",
}
}
}

MIP 无限下拉会遍历 data.items 每条数据(Key-Value),根据 Key 查找槽位,将对应的 Value 渲染到页面.mip-infinitescroll-results中。最终的结果如下:

<mip-infinitescroll data-src="https:// 后端异步请求地址 " template="myTemplate">
<template type="mip-mustache" id="myTemplate">
<a href="{{数据中的链接}}">{{数据中的新闻标题}}</a>
</template>
<div class="mip-infinitescroll-results"> <!-- 开始:根据异步请求返回值,渲染出的 HTML -->
<a href="https://a.xx.com/001">001_ 这是一个新闻标题 </a>
<a href="https://a.xx.com/002">002_ 这是另一个新闻标题 </a>
<!-- 结束:根据异步请求返回值,渲染出的 HTML --> </div>
</mip-infinitescroll>

mip-infinitescroll 组件的具体使用方法见 MIP 官网-无限下拉,除了上述的用法,还支持个性化配置以下字段:

  • 每次插入到页面的结果条数
  • 插入页面的结果总条数
  • 异步请求服务器过期时间
  • “加载中……” 文案
  • “没有更多内容了 >o<” 文案

建议,讨论,参与开发

MIP 是开源的项目,欢迎各位开发者参与组件维护,共同优化千万站点使用的组件。

mip-list 的组件源码在 github/mip-list, mip-infinitescroll 的组件源码在 github/mip-infinitescroll, 可以通过 提交 PR 的方式直接参与开发,也可以 新建 Issue 提出建议。

MIP 组件哥,立正,鞠躬,在 MIP 前端技术 QQ 群(580967494)等你。

新手教程:不写JS,在MIP页中实现异步加载数据的更多相关文章

  1. highcharts.js两种数据绑定方式和异步加载数据的使用

    一,我们先来看看异步加载数据的写法(这是使用MVC的例子) 1>js写法 <script src="~/Scripts/jquery-2.1.4.min.js"> ...

  2. iScroll.js 向上滑动异步加载数据回弹问题

    iScroll是一款用于移动设备web开发的一款插件.像缩放.下拉刷新.滑动切换等移动应用上常见的一些效果都可以轻松实现. 现在最新版本是5.X,官网这里:http://iscrolljs.com/ ...

  3. 关于使用Iscroll.js异步加载数据后不能滑动到最底端的问题解决方案

    关于使用Iscroll.js异步加载数据后不能滑动到最底端,拉到最下边又弹回去的问题困扰了我老半天,相信很多朋友都遇到了.我刚好不小心解决了,和大家分享一下.由于各种忙,下边就直接上代码吧. (前提是 ...

  4. js如何使浏览器允许脚本异步加载

    js如何使浏览器允许脚本异步加载 如果脚本体积很大,下载和执行的时间就会很长,因此造成浏览器堵塞,用户会感觉到浏览器“卡死”了,没有任何响应.这显然是很不好的体验,所以浏览器允许脚本异步加载,下面就是 ...

  5. ExtJS入门教程05,grid的异步加载数据

    上一篇演示了extjs grid的基本用法,并加载了本地数据.今天我们将演示如何加载异步数据. 所谓异步,就是通过ajax的方式将服务器端的数据加载到我们的grid中.为了提供数据,我们先定义一个数据 ...

  6. js 窗口滚动到一定高度时加载数据

    <script type="text/javascript"> //当窗口滚动到一定高度时 某块页面开始加载数据 window.onload = function() ...

  7. js滚动异步加载数据的思路

    <body> <div style="width:200px; height:1000px; border:1px solid red;" id="to ...

  8. 异步加载数据——turn.js

    var tostore = GetQueryString("tostore"); var photo_id = GetQueryString("photo_id" ...

  9. 网页性能优化之异步加载js文件

    一个网页的有很多地方可以进行性能优化,比较常见的一种方式就是异步加载js脚本文件.在谈异步加载之前,先来看看浏览器加载js文件的原理. 浏览器加载 JavaScript 脚本,主要通过<scri ...

随机推荐

  1. virtualenv 中 install flask 的小问题

    最经在学习Python flask 框架 ,用virtualenv建立好我的flask虚拟环境后,执行 sudo pip install flask 并没有报错 我以为已经装上了flask,但当我进入 ...

  2. Redis模块化基本介绍

    概要 Redis Modules System基本概念 基本应用 参考资料 1. Redis Modules System基本概念 Redis Modules System是4.0出现一大改动点,使得 ...

  3. Java并发-取消与关闭

    如果外部代码可以再某个操作正常完成之前就将其置入"完成"状态,那么这个操作就是可以取消的.取消的原因有:用户请求取消.有时间限制的操作.应用程序事件.错误和关闭等 中断 如果使用某 ...

  4. Myeclipse+selenium2.0+Junit+TestNg环境搭建

    这周末把自动化的环境搭好了,在网上也百度了很多,现在分享下,希望大家少走一点歪路. 需要用到的安装包都在这个里面,自取: 链接:https://pan.baidu.com/s/10ohf757ztgN ...

  5. 数据库SQL语句中 查询选修了全部课程的学生的学号和姓名

    一.SQL语言查询选修了全部课程的学生的学号和姓名. 两种解决途径: 第一种: 我们可以表示为在SC表中某个学生选修的课程数等于C表中课程总数.相应的SQL语言如下: select S#,SNAME ...

  6. C++相关:部分标准库特殊设施

    C++ tuple(元组) tuple是C++11新标准里的类型.它是一个类似pair类型的模板.pair类型是每个成员变量各自可以是任意类型,但是只能有俩个成员,而tuple与pair不同的是它可以 ...

  7. Netty中如何序列化数据

    JDK提供了ObjectOutputStream和ObjectInputStream,用于通过网络对POJO的基本数据类型和图进行序列化和反序列化.该API并不复杂,而且可以被应用于任何实现了java ...

  8. PHP入门小练习

    1.编写字符串检查函数,判断一个字符串是否为有效电话号码.要求:手机号码的长度为11位的数字,固定电话为开头三或四个数字后跟一个短横线后接8位数字. <? function isTel($tel ...

  9. DataSourceBuilder.create().build()

    Spring Boot also provides a utility builder class DataSourceBuilder that can be used to create one o ...

  10. CORS 实战 专题

    本文会代码层面对CORS问题进行剖析 CORS相关相关概念可参考http://www.cnblogs.com/softidea/p/5496719.html ERROR info: XMLHttpRe ...