新手教程:不写JS,在MIP页中实现异步加载数据
从需求谈起:在 MIP 页中异步加载数据
MIP(移动网页加速器) 的 加速原理 除了靠谱的 MIP-Cache CDN 加速外,最值得一提的就是组件系统。所有 JS 交互都需要使用 MIP 组件实现,保证页面中所有 JS 都是最精简高效的,避免一个导航效果需要引用 jquery.js,bootstrap.js,bootstrap-some-nav.js 等多个 JS 实现。
诚然,“所有交互都要使用组件,或自己封装组件” 对于大部分开发者朋友来说,是有些不自由的。很多 MIP 开发者会有类似的疑问:
我想从服务器获取数据,渲染到页面上。是不是要自己封装 MIP 组件啦?
又或者:
推荐数据是实时计算的,并且有很多条,要做瀑布流加载效果,我的 JS 要怎么引入到页面里来?
这些合理合法的异步数据加载需求,MIP 都已经支持了,而且不需要写一行 JS 代码!
异步加载数据-通用解决方案
在直接将用法之前,先感性地认识一下异步加载数据的通用方案。虽然每个网站的后端请求地址不同,数据库操作方式不同。但大家的需求是相同的:
异步加载数据,并呈现在页面上。
为了实现这个效果,大家也不约而同地选择了类似方案:
- 发送一个异步请求获取 JSON 数据
- 根据返回的数据 status 确认请求是否有效
- 解析有效的 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页中实现异步加载数据的更多相关文章
- highcharts.js两种数据绑定方式和异步加载数据的使用
一,我们先来看看异步加载数据的写法(这是使用MVC的例子) 1>js写法 <script src="~/Scripts/jquery-2.1.4.min.js"> ...
- iScroll.js 向上滑动异步加载数据回弹问题
iScroll是一款用于移动设备web开发的一款插件.像缩放.下拉刷新.滑动切换等移动应用上常见的一些效果都可以轻松实现. 现在最新版本是5.X,官网这里:http://iscrolljs.com/ ...
- 关于使用Iscroll.js异步加载数据后不能滑动到最底端的问题解决方案
关于使用Iscroll.js异步加载数据后不能滑动到最底端,拉到最下边又弹回去的问题困扰了我老半天,相信很多朋友都遇到了.我刚好不小心解决了,和大家分享一下.由于各种忙,下边就直接上代码吧. (前提是 ...
- js如何使浏览器允许脚本异步加载
js如何使浏览器允许脚本异步加载 如果脚本体积很大,下载和执行的时间就会很长,因此造成浏览器堵塞,用户会感觉到浏览器“卡死”了,没有任何响应.这显然是很不好的体验,所以浏览器允许脚本异步加载,下面就是 ...
- ExtJS入门教程05,grid的异步加载数据
上一篇演示了extjs grid的基本用法,并加载了本地数据.今天我们将演示如何加载异步数据. 所谓异步,就是通过ajax的方式将服务器端的数据加载到我们的grid中.为了提供数据,我们先定义一个数据 ...
- js 窗口滚动到一定高度时加载数据
<script type="text/javascript"> //当窗口滚动到一定高度时 某块页面开始加载数据 window.onload = function() ...
- js滚动异步加载数据的思路
<body> <div style="width:200px; height:1000px; border:1px solid red;" id="to ...
- 异步加载数据——turn.js
var tostore = GetQueryString("tostore"); var photo_id = GetQueryString("photo_id" ...
- 网页性能优化之异步加载js文件
一个网页的有很多地方可以进行性能优化,比较常见的一种方式就是异步加载js脚本文件.在谈异步加载之前,先来看看浏览器加载js文件的原理. 浏览器加载 JavaScript 脚本,主要通过<scri ...
随机推荐
- python3.6 安装win32api时候找不到regitry的问题
首先下载 https://sourceforge.net/projects/pywin32/files/pywin32/ 找到对应的即可 我需要的是这个 打开之后会提示3.6未注册 在任意位置新建一个 ...
- C语言中函数中传入一个数组,并且返回一个数组
一.C语言可以很容易将一个数组传递给一个自定义函数,格式如下: main() { adb(float a[],int n); } float adb(float a[],int n) { …… ret ...
- Java Elasticsearch新手入门教程
概要: 1.使用Eclipse搭建Elasticsearch详情参考下面链接 2.Java Elasticsearch 配置 3.ElasticSearch Java Api(一) -添加数据创建索引 ...
- Spring对象生存周期(Scope)的分析
一.Scope定义 Scope用来声明容器中管理的对象所应该处的限定场景或者说对象的存活时间,即容器在对象进入相应的Scope之前,生产并装配这些对象,在该对象不再处于这些Scope之后,容器通常会销 ...
- C# DataGridView绑定List对象时,利用BindingList来实现增删查改
当DataGridView的DataSource是DataTable的时候,DataTable的数据改变时,DataGridView的数据会随之改变,无需重新绑定到DataGridView. 当Da ...
- Python 3.6 中文手册——前言
1. 前言 如果你在电脑上做了很多工作,最终你会发现有一些任务你想要自动化.例如,你可能希望对大量的文本文件执行搜索和替换,或者以复杂的方式重命名并排列一堆照片文件.也许你想写一个小的自定义数据库,或 ...
- 关于Linux虚拟化技术KVM的科普 科普一(先用起来!)
是骡子是马是拉出来溜溜,通过<KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机>跑一遍,就会对KVM.QEMU-KVM有个大概的认识了. qemu-kvm已经不单独存在,qemu加上 ...
- Azure Go Management SDK 中国版使用示例
简介 刚学习go几天,尝试调用Azure的SDK进行管理API的操作,基本思路是基于注册的AD Application信息生成token,然后再使用Token生成serviceClient,然后再进行 ...
- TensorFlow练习2: 对评论进行分类
本帖是前一贴的补充: 使用大数据,了解怎么处理数据不能一次全部加载到内存的情况.如果你内存充足,当我没说 训练好的模型的保存和使用 使用的模型没变,还是简单的feedforward神经网络(updat ...
- javascript 内存管理
1.垃圾回收机制 在编写Javascript程序时,开发人员不用关心内存问题,内存分配及无用内存的回收完全实现了自动化管理.垃圾收集器会按照预定的时间间隔, 周期性的找出那些不再继续使用的变量,然后释 ...