使用CdList轻松构建列表应用

在进行 cms,用户中心开发时遇到了很多列表展示的需求。无非就是:筛选、排序、分页等功能的组合,同时还需要支持 history 记录(前进、后退等)

为了提升组内同学开发效率, CdList 便诞生了:

  1. 分页、排序、筛选、日期、搜索等作为插件进行创建

      var pageInstance = new CdList.addons.Pagination({...})
    
  2. 对任意插件的操作,都会触发回调,由开发者自行拼接列表 API 请求地址

  getUrl: function (data) {
    console.log(data);
    return '/ajax.json?' + $.param(data)
  }
  1. 写好渲染每行数据的模板,之后的一切交给 CdList 帮你搞定

  2. 借助 History Api 列表的数据为异步请求,并且支持 url 定位(产品需求进入页面后直接选中筛选项目的某一项,可通过 url 进行控制)

所有开发资源

快速开始

1. 安装

  • 非 webpack 构建:
    1. 进入 git repo,下载 lib/cdlist.js 即可
    2. 如需要默认样式引入lib/cdlist.css
  • webpack 构建:
    1. npm install cdlist --save
    2. 在 js 文件中
    var CdList = require('cdlist');
    

2. 创建列表应用

下面使用高德 API 创建示例,讲解使用方法,戳此链接查看DEMO

  1. 选择要使用的插件
BF4E436B-E2A7-49CC-99DD-B720C3D4FC48.png

这个实例中需要创建 SearchPaginationFilter三个插件点击可获得完整api

创建插件的创建代码如下:

// 初始化搜索插件
var search = new CdList.addons.Search({
  historyEnable: 1,
  placeholder: '输入您想查询的内容'
});
// 初始化分页插件
var pg = new CdList.addons.Pagination({
  historyEnable: 1,
  onChange: function () {
    $('body, html').animate({
      scrollTop: $('.cdlist-container').offset().top
    }, 300);
  },
  getSetting: function (json) {
    return {
      total: parseInt(json.count / 13)
    }
  }
});
// 初始化筛选插件
var filter = new CdList.addons.Filter({
  historyEnable: 1,
  line: 1,
  filters: [
    {
      label: '服务类型:',
      name: 'types',
      datas: [
        { name: '不限', value: '' },
        { name: '餐饮服务', value: '05' },
        { name: '汽车服务', value: '01' },
        { name: '购物服务', value: '06' },
        { name: '医疗服务', value: '09' },
      ]
    },
    {
      label: '城市编码:',
      name: 'city',
      datas: [
        { name: '北京', value: 'beijing' },
        { name: '上海', value: 'shanghai' },
        { name: '深圳', value: 'shenzhen' },
        { name: '广州', value: 'guangzhou' },
      ]
    }
  ]
});
  • historyEnable 标识此插件是否记录 history(是否可以通过前进、后退控制)
  • Pagination.onChange 为分页插件操作后的回调
  • Pagination.getSetting 需要返回总页数,其参数为首次请求 api 的数据
  • Filter.line 设置是否以 ul、li 形式展示筛选插件、否则将展示为 select 结构
  • Filter.filters 配置筛选数据
  1. 创建列表实例

列表实例承载了:数据请求、模板载入、应用插件等功能。

  1. 插件本身没有任何作用,只有挂载到某个列表实例才会展示
  2. 所有对插件的操作都会触发 getUrl 回调,其参数为每个插件当前的选中状态,开发者需要自行构建请求 api
  3. 如果为 json api 可以直接发送 get 请求;如果想自定义请求方式需要在getAjaxData 回调中写自己 ajax 请求,并返回实例
// 创建 cdlist 表格应用,整合所有插件 
var cdList = window.cdlist = new CdList({
  ulClass: 'amap-list',
  addons: [search, filter, pg],

  getUrl: function (data) {
    var param = {
      keywords: data.search,
      types: data.filter.types,
      city: data.filter.city,
      page: data.pagination + 1,
      key: '6a8449ec9b2da3fcff320383bfc69e92',
      extensions: 'all',
      offset: 13
    };
    return 'https://restapi.amap.com/v3/place/text?' + $.param(param);
  },

  empty: function () {
    return '<div class="amap-list-empty">抱歉,没有您查找的 POI </div>'
  },

  getAjaxData: function (url) {
    return $.ajax({
      url: url,
      dataType: 'jsonp'
    });
  },

  rows: function (item) {
    var html = ['<li>',
      '<div class="img" style="background-image:url(' + (item.photos[0] && (item.photos[0].url + '?operate=merge&w=160&h=150&position=5') || DEFAULT_IMAGE) + ')"/>',
      '<div class="item-main">',
        '<div class="item-name">' + item.name + '</div>',
        '<div class="item-address">详细地址' + item.address + '</div>',
      '</div>',
    '</li>'].join('');

    return html;
  },

  getRowsData: function (json) {
    return json.pois;
  }
}, '#cdlist-wrap');
  • new CdList 第一个参数为配置项,第二个参数为列表容器
  • ulClass 未列表增加自定义类名
  • getUrl 回调返回列表 api 请求地址
  • getAjaxData 进行 jsonp 的请求
  • getRowsData 返回请求接口的列表数据
  • rows 返回每一行的渲染模板
  • empty 返回如果没有数据时的替代内容

更详细配置戳API

  1. 让他跑起来
  cdList.getList();

就这么简单一共 99 行代码,构建了丰富的列表应用,再也不用担心PM的各种列表需求了

设计思路

  1. 每个插件独立配置,由开发者选择使用,并易于扩展自定义插件。
  2. 插件之间没有直接交互,都通过CdList 实例派发的事件进行控制
  3. CdList 实例提供 History 记录、更改功能,并将其派发到每个插件中
CdList 架构.png

场景

适合什么
  1. 后台系统的列表展示需求
  2. 用户端对样式、自定义操作要求不高的列表应用
  3. 数据的排序、搜索、分类都是由 api 接口提供
不适合什么
  1. 数据的排序、搜索、分类为前端逻辑
  2. 交互、样式自定义很复杂的列表(电商平台的商品列表)

后续计划

  1. 移除 jQuery 的依赖
  2. 丰富更多的插件
  3. 插件提供的使用方法、事件还需补充
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,600评论 18 139
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,718评论 2 17
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,165评论 0 1
  • 《ijs》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 5,073评论 0 7
  • AngularJS是什么?AngularJs(后面就简称ng了)是一个用于设计动态web应用的结构框架。首先,它是...
    200813阅读 1,588评论 0 3