jquery dataview数据视图插件使用方法


Posted in Javascript onDecember 23, 2016

jquery-dataview是一个超轻量的jquery插件,用于对DOM进行数据填充与更新,也很适合根据DOM模板创建对象。

与一些纯模板库(例如juicer)相比,它不仅能提供根据模板填入数据、支持循环、支持条件创建等功能,还支持绑定事件,最重要的是,在创建完DOM对象后,这些对象(称为数据视图)关联到原始数据,修改数据后,相应的视图也得以更新。

与一些支持数据驱动或MVVM模式的库(例如vue)相比,它没有去做数据绑定等高级自动化的机制,那涉及诸多复杂逻辑,比如属性依赖管理等,使用者如果了解不多,很可能写出低效的代码,或触发一连串未曾预料的后果。比如在一个列表中,只更新其中一条数据的某个属性,就可能导致刷新整个列表,甚至发起与后端的多次不必要交互。

jquery-dataview插件的设计理念是简单而灵活,它不采用极其复杂的自动化更新机制,而是允许人为精准控制更新时机与更新区域;同时,它最小化并压缩后仅2K不到,很适合在移动端开发使用。

下面介绍几个入门例子。

为DOM对象填充数据

例:对一个DOM赋值

HTML:

<div class="customer">
 <p>id=<span name="id"></span></p>
 <p>name=<span name="name"></span></p>
</div>

JS填充数据:

var customer = { id: 1001, name: "SAP AG" };
$(".customer").dataview(customer);

它会递归遍历所有带name属性的结点,如<span name="id"></span>会用customer.id为其赋值。

JS修改数据后,可无参数调用dataview来刷新显示:

customer.name = "SAP China";
$(".customer").dataview();

获取DOM绑定的数据:

var data = $(".customer").dataview('getData');

为模板填充数据

这个例子在项目中更加常用,展示根据模板创建DOM、填充数据并插入文档中。

HTML: 客户列表

<div id="divCustomers"></div>

 <style type="text/template" id="tplCustomer">
  <div class="customer">
   <p>id=<span name="id"></span></p>
   <p>name=<span name="name"></span></p>
  </div>
 </style>

JS: 根据“客户”模板创建客户并插入列表中。

var customers = [
  { id: 1001, name: "SAP AG" },
  { id: 2001, name: "Oracle CO" }
 ];
 var jtplCustomer = $($("#tplCustomer").html());
 var jparent = $("#divCustomers");
 $.each(customers, function (i, customer) {
  jtplCustomer.clone()
   .dataview(customer)
   .appendTo(jparent);
 });

循环创建、条件创建、条件显示

子对象数组可以以dv-for属性来指定循环展开。

dv-if及dv-show属性:根据该属性的值计算是否创建或显示该结点。

例:使用dv-for, dv-if, dv-show等标签:

HTML:

<div id="divCustomers">
  <div dv-for="customers" dv-if="id>=1000" class="customer">
   <li>
    <span dv-show="id<=2000">id=<span name="id"></span></span>
    name=<span name="name"></span>
   </li>
  </div>
 </div>

JS:

var data = {
  customers: [
   { id: 1, name: "Olive CO" },
   { id: 1001, name: "SAP AG" },
   { id: 2001, name: "Oracle CO" }
  ]
 };
 $("#divCustomers").dataview(data);

上例中,由data.customers子数组循环创建DOM,其中id=1的customer没有创建,因为不满足dv-if="id>=1000"的条件;而id=2001的那个customer由于不满足dv-show="id<=2000"的条件,因而id没有显示出来。

指定事件

dataview不仅绑定数据,还可以用dv-on属性绑定事件,在JS中使用选项events与其对应。

<div dv-on="liOrder_click"></div>

事件名必须是{对象名}_{事件名}的格式。
上面代码最终相当于调用jo.on("click", data, liOrder_click),绑定的数据会通过event.data传递给回调函数,因而在回调函数中处理数据特别方便。

用到的函数必须通过events选项定义:

var events = {
  liOrder_click: function (ev) {
   var order = ev.data; // 等同于 $(this).dataview('getData');
   // ...
  }
 };
jo.dataview(data, {events: events});

与直接使用原生支持的onclick属性相比,使用dv-on属性的好处是事件处理函数不必是全局函数,而且事件处理函数的参数ev.data即是DOM绑定的数据,非常方便。

多层嵌套的数据

对复杂的多层次嵌套数据的支持是dataview插件的一大亮点。
通过精巧的设计,它不仅做到填充数据时特别简单,而且在更新数据时,允许自由地更新任意区域,行为易懂且效率很高。

JS数据:一个customer-客户,它包含id, name等普通属性,包含一个子对象addr-地址信息,还包含一个子对象数组orders-订单。
每个订单中,又包含一个子对象数组items-物料信息。

var customer = {
  id: 1001, 
  name: "SAP AG",
  addr: {country: "CN", city: "Shanghai"},
  orders: [
   {id: 1, amount: 9000, items: [
    {id: 101, name: "item 101"},
    {id: 102, name: "item 102"}
   ]},
   {id: 2, amount: 11000, items: [
    {id: 201, name: "item 201"}
   ]}
  ]
 }

HTML数据视图,展示客户、订单、物料三层数据:

<div class="customer">
  <p> name: <span name="name"></span> </p>
  <p> addr: <span name="addr.country"></span> / <span name="addr.city"></span> </p>
  <ul>
   <li dv-for="orders" class="order">
    <p>order id=<span name="id"></span>, amount=<span name="amount"></span></p>
    <ul>
     <li dv-for="items" class="item">
      <p>item id=<span name="id"></span></p>
      <p>item name=<span name="name"></span></p>
     </li>
    </ul>
   </li>
  </ul>
 </div>

JS:

$(".customer").dataview(customer);

 // 更新一些数据
 ++ customer.orders[0].amount;
 customer.orders[0].items[0].name += " - updated";

 // 视图局部更新:只更新一个item
 var jitem = $(".customer .order:first .item:first");
 jitem.dataview();

 // 取DOM绑定的item数据
 var itemData = jitem.dataview('getData');
 // 通过 $parent 取上层数据
 var orderData = itemData.$parent;
 var data = orderData.$parent;

 // 视图局部更新:只更新一个order:
 $(".customer .order:first").dataview();

 // 全部更新
 $(".customer").dataview();

上面只是多层次数据的简单的用法介绍,通过子对象的$parent属性可以取到上次对象。
实际使用时,常会把这些特性同计算属性、事件绑定结合起来,你会发现它会让取数据和更新视图的代码简单、灵活、易懂。

结语

作为一个超轻量级的具有数据驱动视图概念的库,推荐在项目中使用,可为让你的代码更清晰简练。
上面只是一个简单的介绍,更多如计算属性等功能可参考它的文档。

附github地址(其中有源码、文档和示例代码):

https://github.com/skyshore2001/jquery-dataview

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript图像处理—仿射变换深度理解
Jan 16 Javascript
深入理解JavaScript的React框架的原理
Jul 02 Javascript
JavaScript Ajax编程 应用篇
Jul 02 Javascript
利用原生JS自动生成文章标题树的实例
Aug 22 Javascript
jquery实现的回旋滚动效果完整实例【附demo源码下载】
Sep 20 Javascript
setTimeout学习小结
Feb 08 Javascript
jQuery+vue.js实现的多选下拉列表功能示例
Jan 15 jQuery
webpack4.x下babel的安装、配置及使用详解
Mar 07 Javascript
JavaScript中常用的简洁高级技巧总结
Mar 10 Javascript
抖音上用记事本编写爱心小程序教程
Apr 17 Javascript
layer.open 获取不到表单信息的解决方法
Sep 26 Javascript
微信小程序实现上传多张图片、删除图片
Jul 29 Javascript
基于vue的下拉刷新指令和滚动刷新指令
Dec 23 #Javascript
Bootstrap源码解读按钮(5)
Dec 23 #Javascript
基于bootstrap的选择框插件icheck
Dec 23 #Javascript
基于bootstrap的文件上传控件bootstrap fileinput
Dec 23 #Javascript
Bootstrap CSS使用方法
Dec 23 #Javascript
Bootstrap源码解读导航(6)
Dec 23 #Javascript
Angularjs中三种数据的绑定策略(“@”,“=”,“&amp;”)
Dec 23 #Javascript
You might like
PHP4引用文件语句的对比
2006/10/09 PHP
在Windows版的PHP中使用ADO
2006/10/09 PHP
关于php程序报date()警告的处理(date_default_timezone_set)
2013/10/22 PHP
深入浅析PHP7.0新特征(五大新特征)
2015/10/29 PHP
php实现连接access数据库并转txt写入的方法
2017/02/08 PHP
再谈javascript图片预加载技术(详细演示)
2011/03/12 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
jquery 跳到顶部和底部动画2句代码简单实现
2013/07/18 Javascript
深入浅析JavaScript中的作用域和上下文
2016/03/26 Javascript
Bootstrap基本插件学习笔记之Tooltip提示工具(18)
2016/12/08 Javascript
vue中用H5实现文件上传的方法实例代码
2017/05/27 Javascript
IScroll5实现下拉刷新上拉加载的功能实例
2017/08/11 Javascript
如何将你的AngularJS1.x应用迁移至React的方法
2018/02/01 Javascript
详解vuex结合localstorage动态监听storage的变化
2018/05/03 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【圆形情况】
2018/12/13 Javascript
layui table 表格上添加日期控件的两种方法
2019/09/28 Javascript
浅谈Webpack4 Tree Shaking 终极优化指南
2019/11/18 Javascript
JavaScript函数Call、Apply原理实例解析
2020/02/17 Javascript
如何手写简易的 Vue Router
2020/10/10 Javascript
python使用xauth方式登录饭否网然后发消息
2014/04/11 Python
python操作oracle的完整教程分享
2018/01/30 Python
Windows下将Python文件打包成.EXE可执行文件的方法
2018/08/03 Python
python针对不定分隔符切割提取字符串的方法
2018/10/26 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
python爬虫项目设置一个中断重连的程序的实现
2019/07/26 Python
详解python中自定义超时异常的几种方法
2019/07/29 Python
python numpy库linspace相同间隔采样的实现
2020/02/25 Python
迪斯尼商品官方网站:ShopDisney
2016/08/01 全球购物
毕业生精彩的自我评价分享
2013/10/06 职场文书
《蜗牛》教学反思
2014/02/18 职场文书
购房协议书范本
2014/10/02 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
赞美教师的句子
2019/09/02 职场文书
MATLAB 全景图切割及盒图显示的实现步骤
2021/05/14 Python
SpringBoot实现quartz定时任务可视化管理功能
2021/08/30 Java/Android
CSS中使用grid布局实现一套模板多种布局
2022/07/15 HTML / CSS