{"action":"created","issue":{"url":"https://api.github.com/repos/weexteam/article/issues/111","repository_url":"https://api.github.com/repos/weexteam/article","labels_url":"https://api.github.com/repos/weexteam/article/issues/111/labels{/name}","comments_url":"https://api.github.com/repos/weexteam/article/issues/111/comments","events_url":"https://api.github.com/repos/weexteam/article/issues/111/events","html_url":"https://github.com/weexteam/article/issues/111","id":193990626,"number":111,"title":"一个简单的长列表开发教程","user":{"login":"DoranYun","id":16359169,"avatar_url":"https://avatars.githubusercontent.com/u/16359169?v=3","gravatar_id":"","url":"https://api.github.com/users/DoranYun","html_url":"https://github.com/DoranYun","followers_url":"https://api.github.com/users/DoranYun/followers","following_url":"https://api.github.com/users/DoranYun/following{/other_user}","gists_url":"https://api.github.com/users/DoranYun/gists{/gist_id}","starred_url":"https://api.github.com/users/DoranYun/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DoranYun/subscriptions","organizations_url":"https://api.github.com/users/DoranYun/orgs","repos_url":"https://api.github.com/users/DoranYun/repos","events_url":"https://api.github.com/users/DoranYun/events{/privacy}","received_events_url":"https://api.github.com/users/DoranYun/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2016-12-07T08:51:30Z","updated_at":"2016-12-19T11:57:12Z","closed_at":null,"body":"# 一个简单的长列表开发教程\r\n\r\n长列表展示是一个常见需求，下面我们开发一个列表页面展示 Github star 数最高的 JavaScript 项目并支持常见的上拉加载、回到顶部等功能。\r\n\r\n我们先来看一下我们要实现的效果：\r\n\r\n![mobile_preview](https://img.alicdn.com/tps/TB11uFWOFXXXXcdaXXXXXXXXXXX-511-1024.jpg)\r\n\r\n### 预备篇： Github API\r\n\r\n获取 Github 数据需要使用 Github API，本例中，我们使用到 [search repositories](https://developer.github.com/v3/search/#search-repositories) API。我们根据 `q=language:javascript&sort=stars&order=desc` 这几个参数能够取到一段 JSON 数据，内容是按 star 数排序的 JavaScript 项目。由于数据太大，Github 支持分页返回数据，只需带上 `page` 参数即可。\r\n\r\n数据非常丰富，但此处我们仅需要三个字段：\r\n\r\n- `full_name`：项目全称\r\n- `stargazers_count`：star 数\r\n- `html_url`：repo 地址\r\n\r\n### 第1步：编写基本代码\r\n\r\n我们要在每个 `<cell>` 中分别展示 repo 的全称和 star 数。基本代码如下：\r\n\r\n```html\r\n<template>\r\n  <div class=\"wrapper\">\r\n    <list class=\"list\">\r\n      <cell class=\"row\" repeat=\"item in items\" id=\"item-{{$index}}\">\r\n        <div>\r\n          <text class=\"item\">Repo name: {{item.full_name}}</text>\r\n        </div>\r\n        <div>\r\n          <text class=\"item\">Repo star: {{item.stargazers_count}}</text>\r\n        </div>\r\n      </cell>\r\n    </list>\r\n  </div>\r\n</template>\r\n\r\n<style>\r\n.wrapper {\r\n  position: absolute;\r\n  top: 0;\r\n  right: 0;\r\n  bottom: 0;\r\n  left: 0;\r\n}\r\n.list{\r\n  flex: 1;\r\n}\r\n.row {\r\n  padding: 20;\r\n  border-bottom-color: #eeeeee;\r\n  border-bottom-width: 2;\r\n  border-bottom-style: solid;\r\n}\r\n</style>\r\n\r\n<script>\r\nmodule.exports = {\r\n  data: {\r\n    items:[]\r\n  },\r\n  methods: {}\r\n}\r\n</script>\r\n```\r\n\r\n这里有一点需要注意，对于内嵌的 `<list>`，必须有一个可计算的高度，你可以显示的指定高度，也可以使用 `position` 或 `flex` 来限制高度。由于我们的列表是全屏显示，我们使用 `position` 将列表设置为全屏展示。\r\n\r\n### 第2步：请求数据\r\n\r\n此时，`items` 为空数组，无任何数据，我们需要发起异步请求获取数据，并将其填充到 `items` 数组中。\r\n\r\n这里，我们会使用到 [`stream`](https://alibaba.github.io/weex/cn/doc/modules/stream.html) 模块，此模块为我们提供了常用的网络请求 API，我们会用到 [`fetch`](https://alibaba.github.io/weex/cn/doc/modules/stream.html#fetchoptions-callbackprogresscallback)。具体信息请查阅 [`fetch`](https://alibaba.github.io/weex/cn/doc/modules/stream.html#fetchoptions-callbackprogresscallback)。\r\n\r\n我们在全局下引入 stream 模块，在 `created` 生命周期内发起异步请求获取第一页数据。此处，我们选择在 `created` 生命周期，原因在于在 `created` 生命周期内，页面还未开始渲染，我们能够更早发起请求。\r\n\r\n我们将发起请求封装为一个方法 `renderData()`，以便重用。\r\n\r\n```html\r\n<template>\r\n  <div class=\"wrapper\">\r\n    <list class=\"list\">\r\n      <cell class=\"row\" repeat=\"item in items\" id=\"item-{{$index}}\">\r\n        <div>\r\n          <text class=\"item\">Repo name: {{item.full_name}}</text>\r\n        </div>\r\n        <div>\r\n          <text class=\"item\">Repo star: {{item.stargazers_count}}</text>\r\n        </div>\r\n      </cell>\r\n    </list>\r\n  </div>\r\n</template>\r\n\r\n<style>\r\n.wrapper {\r\n  position: absolute;\r\n  top: 0;\r\n  right: 0;\r\n  bottom: 0;\r\n  left: 0;\r\n}\r\n.list{\r\n  flex: 1;\r\n}\r\n.row {\r\n  padding: 20;\r\n  border-bottom-color: #eeeeee;\r\n  border-bottom-width: 2;\r\n  border-bottom-style: solid;\r\n}\r\n</style>\r\n\r\n<script>\r\nvar stream = require('@weex-module/stream') || {}\r\n\r\nvar SEARCH_URL = 'https://api.github.com/search/repositories?q=language:javascript&sort=stars&order=desc'\r\nmodule.exports = {\r\n  data: {\r\n    page: 1,\r\n    items:[]\r\n  },\r\n  created: function () {\r\n    var url = SEARCH_URL + '&page=' + this.page\r\n\r\n    this.renderData(url)\r\n\r\n    this.page++\r\n  },\r\n  methods: {\r\n    renderData: function (url) {\r\n      var self = this\r\n\r\n      stream.fetch({\r\n        method: 'GET',\r\n        url: url,\r\n        type:'json'\r\n      }, function(res) {\r\n        try {\r\n          var results = res.data.items || []\r\n\r\n          if (Array.isArray(results)) {\r\n            for(var i = 0; i < results.length; i++) {\r\n              self.items.push(results[i])\r\n            }\r\n          }\r\n        } catch(e) {}\r\n      },function(res){\r\n\r\n      })\r\n    }\r\n  }\r\n}\r\n</script>\r\n```\r\n\r\n### 第3步：顶部吸附\r\n\r\n我们为页面提供一个吸附在顶部的标题，以便提示页面内容：\r\n\r\n在 `<cell>` 前插入 `<header>` 标签并添加样式。\r\n\r\n```html\r\n<template>\r\n  <div class=\"wrapper\">\r\n    <list class=\"list\">\r\n      <header class=\"header\">\r\n        <text class=\"title\">Search Results</text>\r\n      </header>\r\n      <cell class=\"row\" repeat=\"item in items\" id=\"item-{{$index}}\">\r\n        <div>\r\n          <text class=\"item\">Repo name: {{item.full_name}}</text>\r\n        </div>\r\n        <div>\r\n          <text class=\"item\">Repo star: {{item.stargazers_count}}</text>\r\n        </div>\r\n      </cell>\r\n    </list>\r\n  </div>\r\n</template>\r\n\r\n<style>\r\n.header {\r\n  padding: 25;\r\n  background-color: #efefef;\r\n  border-bottom-color: #eeeeee;\r\n  border-bottom-width: 2;\r\n  border-bottom-style: solid;\r\n}\r\n.title {\r\n  text-align: center;\r\n}\r\n.wrapper {\r\n  position: absolute;\r\n  top: 0;\r\n  right: 0;\r\n  bottom: 0;\r\n  left: 0;\r\n}\r\n.list{\r\n  flex: 1;\r\n}\r\n.row {\r\n  padding: 20;\r\n  border-bottom-color: #eeeeee;\r\n  border-bottom-width: 2;\r\n  border-bottom-style: solid;\r\n}\r\n</style>\r\n\r\n<script>\r\nvar stream = require('@weex-module/stream') || {}\r\n\r\nvar SEARCH_URL = 'https://api.github.com/search/repositories?q=language:javascript&sort=stars&order=desc'\r\nmodule.exports = {\r\n  data: {\r\n    page: 1,\r\n    items:[]\r\n  },\r\n  created: function () {\r\n    var url = SEARCH_URL + '&page=' + this.page\r\n\r\n    this.renderData(url)\r\n\r\n    this.page++\r\n  },\r\n  methods: {\r\n    renderData: function (url) {\r\n      var self = this\r\n\r\n      stream.fetch({\r\n        method: 'GET',\r\n        url: url,\r\n        type:'json'\r\n      }, function(res) {\r\n        try {\r\n          var results = res.data.items || []\r\n\r\n          if (Array.isArray(results)) {\r\n            for(var i = 0; i < results.length; i++) {\r\n              self.items.push(results[i])\r\n            }\r\n          }\r\n        } catch(e) {}\r\n      },function(res){\r\n\r\n      })\r\n    }\r\n  }\r\n}\r\n</script>\r\n```\r\n\r\n### 第4步：上拉加载\r\n\r\n我们添加上拉加载功能以便用户查看更多 repo：\r\n\r\n1. 在 `<cell>` 后插入 `<loading>` 组件；\r\n2. 为 `<loading>` 组件添加 `loading` 事件；\r\n3. 此事件会调用 `loadingData()` 方法，获取下一页数据；我们在上拉时显示 `<loading>`，加载出数据后将其隐藏；\r\n4. 我们将列表限制为 15 页，如果页数大于 15，将文案改为“NO MORE”。\r\n\r\n```html\r\n<template>\r\n  <div class=\"wrapper\">\r\n    <list class=\"list\">\r\n      <header class=\"header\">\r\n        <text class=\"title\">Search Results</text>\r\n      </header>\r\n      <cell class=\"row\" repeat=\"item in items\" id=\"item-{{$index}}\">\r\n        <div>\r\n          <text class=\"item\">Repo name: {{item.full_name}}</text>\r\n        </div>\r\n        <div>\r\n          <text class=\"item\">Repo star: {{item.stargazers_count}}</text>\r\n        </div>\r\n      </cell>\r\n      <loading onloading=\"loadingData\" style=\"width: 750; padding: 30;\" display=\"{{loadingDisplay}}\">\r\n        <text class=\"text\">{{loadingText}}</text>\r\n      </loading>\r\n    </list>\r\n  </div>\r\n</template>\r\n\r\n<style>\r\n.header {\r\n  padding: 25;\r\n  background-color: #efefef;\r\n  border-bottom-color: #eeeeee;\r\n  border-bottom-width: 2;\r\n  border-bottom-style: solid;\r\n}\r\n.title {\r\n  text-align: center;\r\n}\r\n.text {\r\n  text-align: center;\r\n}\r\n.wrapper {\r\n  position: absolute;\r\n  top: 0;\r\n  right: 0;\r\n  bottom: 0;\r\n  left: 0;\r\n}\r\n.list{\r\n  flex: 1;\r\n}\r\n.row {\r\n  padding: 20;\r\n  border-bottom-color: #eeeeee;\r\n  border-bottom-width: 2;\r\n  border-bottom-style: solid;\r\n}\r\n</style>\r\n\r\n<script>\r\nvar stream = require('@weex-module/stream') || {}\r\n\r\nvar SEARCH_URL = 'https://api.github.com/search/repositories?q=language:javascript&sort=stars&order=desc'\r\nmodule.exports = {\r\n  data: {\r\n    isLoaded: true,\r\n    page: 1,\r\n    loadingDisplay: 'hide',\r\n    loadingText: 'Loading...',\r\n    items:[]\r\n  },\r\n  created: function () {\r\n    var url = SEARCH_URL + '&page=' + this.page\r\n\r\n    this.renderData(url)\r\n\r\n    this.page++\r\n  },\r\n  methods: {\r\n    renderData: function (url) {\r\n      var self = this\r\n\r\n      stream.fetch({\r\n        method: 'GET',\r\n        url: url,\r\n        type:'json'\r\n      }, function(res) {\r\n        self.loadingDisplay = 'hide'\r\n\r\n        try {\r\n          var results = res.data.items || []\r\n\r\n          if (Array.isArray(results)) {\r\n            for(var i = 0; i < results.length; i++) {\r\n              self.items.push(results[i])\r\n            }\r\n          }\r\n        } catch(e) {}\r\n      },function(res){\r\n\r\n      })\r\n    },\r\n    loadingData: function (e) {\r\n      var url = SEARCH_URL + '&page=' + this.page\r\n      var self = this\r\n\r\n      if (self.isLoaded === false) return \r\n\r\n      self.loadingDisplay = 'show'\r\n    \r\n      if (self.page <=10 ) {\r\n        self.renderData(url)\r\n        self.page++\r\n      } else {\r\n        self.loadingDisplay = 'hide'\r\n        self.loadingText = 'NO MORE!'\r\n      }\r\n    }\r\n  }\r\n}\r\n</script>\r\n```\r\n\r\n### 第5步：回到顶部\r\n\r\n点击回到顶部按钮将会滚动到第一个 `<cell>`，这一步，我们会用到以下几个 API：\r\n\r\n- `click` 事件：毫无疑问，点击时将会触发此事件的执行函数，具体信息参考 [`click`](https://alibaba.github.io/weex/cn/doc/references/common-event.html)\r\n- `this.$el()`：获取对应 id 的元素对象的引用，可在组件的方法中通过 `this` 访问。e.g.：`this.$el('item-0')`\r\n-  `scrollToElement`：让页面滚动到指定节点。通过 `dom` module 访问，更多信息可参考 [`dom` module](https://alibaba.github.io/weex/cn/doc/modules/dom.html)\r\n\r\n我们按如下步骤编写代码：\r\n\r\n1. 在 `<list>` 组件后插入按钮，将其固定在右下角；\r\n2. 为按钮添加 `click` 事件；\r\n3. 点击时，通过 `goToTop()` 方法回到顶部。\r\n\r\n```html\r\n<template>\r\n  <div class=\"wrapper\">\r\n    <list class=\"list\">\r\n      <header class=\"header\">\r\n        <text class=\"title\">Search Results</text>\r\n      </header>\r\n      <cell class=\"row\" repeat=\"item in items\" id=\"item-{{$index}}\">\r\n        <div>\r\n          <text class=\"item\">Repo name: {{item.full_name}}</text>\r\n        </div>\r\n        <div>\r\n          <text class=\"item\">Repo star: {{item.stargazers_count}}</text>\r\n        </div>\r\n      </cell>\r\n      <loading onloading=\"loadingData\" style=\"width: 750; padding: 30;\" display=\"{{loadingDisplay}}\">\r\n        <text class=\"text\">{{loadingText}}</text>\r\n      </loading>\r\n    </list>\r\n    <div class=\"up\" onclick=\"goToTop\">\r\n      <img class=\"img\" src=\"https://img.alicdn.com/tps/TB1ZVOEOpXXXXcQaXXXXXXXXXXX-200-200.png\"></img>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<style>\r\n.header {\r\n  padding: 25;\r\n  background-color: #efefef;\r\n  border-bottom-color: #eeeeee;\r\n  border-bottom-width: 2;\r\n  border-bottom-style: solid;\r\n}\r\n.title {\r\n  text-align: center;\r\n}\r\n.text {\r\n  text-align: center;\r\n}\r\n.wrapper {\r\n  position: absolute;\r\n  top: 0;\r\n  right: 0;\r\n  bottom: 0;\r\n  left: 0;\r\n}\r\n.list{\r\n  flex: 1;\r\n}\r\n.row {\r\n  padding: 20;\r\n  border-bottom-color: #eeeeee;\r\n  border-bottom-width: 2;\r\n  border-bottom-style: solid;\r\n}\r\n.up {\r\n  width: 70;\r\n  height: 70;\r\n  position: fixed;\r\n  right: 20;\r\n  bottom: 20;\r\n}\r\n.img {\r\n  width: 70;\r\n  height: 70;\r\n}\r\n</style>\r\n\r\n<script>\r\nvar dom = require('@weex-module/dom') || {}\r\nvar stream = require('@weex-module/stream') || {}\r\n\r\nvar SEARCH_URL = 'https://api.github.com/search/repositories?q=language:javascript&sort=stars&order=desc'\r\nmodule.exports = {\r\n  data: {\r\n    isLoaded: true,\r\n    page: 1,\r\n    loadingDisplay: 'hide',\r\n    loadingText: 'Loading...',\r\n    items:[]\r\n  },\r\n  created: function () {\r\n    var url = SEARCH_URL + '&page=' + this.page\r\n\r\n    this.renderData(url)\r\n\r\n    this.page++\r\n  },\r\n  methods: {\r\n    renderData: function (url) {\r\n      var self = this\r\n\r\n      stream.fetch({\r\n        method: 'GET',\r\n        url: url,\r\n        type:'json'\r\n      }, function(res) {\r\n        self.loadingDisplay = 'hide'\r\n\r\n        try {\r\n          var results = res.data.items || []\r\n\r\n          if (Array.isArray(results)) {\r\n            for(var i = 0; i < results.length; i++) {\r\n              self.items.push(results[i])\r\n            }\r\n          }\r\n        } catch(e) {}\r\n      },function(res){\r\n\r\n      })\r\n    },\r\n    loadingData: function (e) {\r\n      var url = SEARCH_URL + '&page=' + this.page\r\n      var self = this\r\n      \r\n      if (self.isLoaded === false) return\r\n\r\n      self.loadingDisplay = 'show'\r\n    \r\n      if (self.page <=10 ) {\r\n        self.renderData(url)\r\n        self.page++\r\n      } else {\r\n        self.loadingDisplay = 'hide'\r\n        self.loadingText = 'NO MORE!'\r\n      }\r\n    },\r\n    goToTop: function (e) {\r\n      dom.scrollToElement(this.$el('item-0'), {\r\n        offset: -100\r\n      })\r\n    }\r\n  }\r\n}\r\n</script>\r\n```\r\n\r\n### 第6步：下拉刷新\r\n\r\n为兼容所有版本，我们在 `<header>` 组件后插入 `<refresh>` 组件，并添加 `refresh` 事件调用 `renderData()` 重新加载数据。这里和使用 `<loading>` 类似。\r\n\r\n当用户下拉刷新时，我们弹出一个 toast 提醒用户页面正在刷新数据。这里用到了 `modal` module 的 `toast` 方法。详情参考 [modal module](http://alibaba.github.io/weex/cn/doc/modules/modal.html)。\r\n\r\n```html\r\n<template>\r\n  <div class=\"wrapper\">\r\n    <list class=\"list\">\r\n      <header class=\"header\">\r\n        <text class=\"title\">Search Results</text>\r\n      </header>\r\n      <refresh style=\"width: 750; padding: 30;\" onrefresh=\"refreshData\" display=\"{{refreshDisplay}}\">\r\n        <text class=\"text\"> ↓ Pull to refresh </text>\r\n        <loading-indicator class=\"indicator\"></loading-indicator>\r\n      </refresh>\r\n      <cell class=\"row\" repeat=\"item in items\" id=\"item-{{$index}}\">\r\n        <div>\r\n          <text class=\"item\">Repo name: {{item.full_name}}</text>\r\n        </div>\r\n        <div>\r\n          <text class=\"item\">Repo star: {{item.stargazers_count}}</text>\r\n        </div>\r\n      </cell>\r\n      <loading onloading=\"loadingData\" style=\"width: 750; padding: 30;\" display=\"{{loadingDisplay}}\">\r\n        <text class=\"text\">{{loadingText}}</text>\r\n      </loading>\r\n    </list>\r\n    <div class=\"up\" onclick=\"goToTop\">\r\n      <img class=\"img\" src=\"https://img.alicdn.com/tps/TB1ZVOEOpXXXXcQaXXXXXXXXXXX-200-200.png\"></img>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<style>\r\n.header {\r\n  padding: 25;\r\n  background-color: #efefef;\r\n  border-bottom-color: #eeeeee;\r\n  border-bottom-width: 2;\r\n  border-bottom-style: solid;\r\n}\r\n.title {\r\n  text-align: center;\r\n}\r\n.text {\r\n  text-align: center;\r\n}\r\n.wrapper {\r\n  position: absolute;\r\n  top: 0;\r\n  right: 0;\r\n  bottom: 0;\r\n  left: 0;\r\n}\r\n.list{\r\n  flex: 1;\r\n}\r\n.row {\r\n  padding: 20;\r\n  border-bottom-color: #eeeeee;\r\n  border-bottom-width: 2;\r\n  border-bottom-style: solid;\r\n}\r\n.up {\r\n  width: 70;\r\n  height: 70;\r\n  position: fixed;\r\n  right: 20;\r\n  bottom: 20;\r\n}\r\n.img {\r\n  width: 70;\r\n  height: 70;\r\n}\r\n</style>\r\n\r\n<script>\r\nvar dom = require('@weex-module/dom') || {}\r\nvar modal = require('@weex-module/modal') || {}\r\nvar stream = require('@weex-module/stream') || {}\r\n\r\nvar SEARCH_URL = 'https://api.github.com/search/repositories?q=language:javascript&sort=stars&order=desc'\r\nmodule.exports = {\r\n  data: {\r\n    isLoaded: true,\r\n    page: 1,\r\n    loadingDisplay: 'hide',\r\n    refreshDisplay: 'hide',\r\n    loadingText: 'Loading...',\r\n    items:[]\r\n  },\r\n  created: function () {\r\n    var url = SEARCH_URL + '&page=' + this.page\r\n\r\n    this.renderData(url)\r\n\r\n    this.page++\r\n  },\r\n  methods: {\r\n    renderData: function (url) {\r\n      var self = this\r\n\r\n      stream.fetch({\r\n        method: 'GET',\r\n        url: url,\r\n        type:'json'\r\n      }, function(res) {\r\n        self.refreshDisplay = 'hide'\r\n        self.loadingDisplay = 'hide'\r\n\r\n        try {\r\n          var results = res.data.items || []\r\n\r\n          if (Array.isArray(results)) {\r\n            for(var i = 0; i < results.length; i++) {\r\n              self.items.push(results[i])\r\n            }\r\n          }\r\n        } catch(e) {}\r\n      },function(res){\r\n\r\n      })\r\n    },\r\n    loadingData: function (e) {\r\n      var url = SEARCH_URL + '&page=' + this.page\r\n      var self = this\r\n\r\n      if (self.isLoaded === false) return \r\n\r\n      self.loadingDisplay = 'show'\r\n    \r\n      if (self.page <=10 ) {\r\n        self.renderData(url)\r\n        self.page++\r\n      } else {\r\n        self.loadingDisplay = 'hide'\r\n        self.loadingText = 'NO MORE!'\r\n      }\r\n    },\r\n    goToTop: function (e) {\r\n      dom.scrollToElement(this.$el('item-0'), {\r\n        offset: -100\r\n      })\r\n    },\r\n    refreshData: function (e) {\r\n      var url = SEARCH_URL + '&page=1'\r\n\r\n      if (this.isLoaded === false) return \r\n      \r\n      this.refreshDisplay = 'show'\r\n\r\n      modal.toast({\r\n        'message': 'Refreshing...', \r\n        'duration': 1\r\n      })\r\n\r\n      this.items = []\r\n      this.page = 1\r\n      this.renderData(url)\r\n\r\n      this.refreshDisplay = 'hide'\r\n    }\r\n  }\r\n}\r\n</script>\r\n```\r\n\r\n[体验一下](http://dotwe.org/13e8c117b5af140d9ec07e575b1982b4)"},"comment":{"url":"https://api.github.com/repos/weexteam/article/issues/comments/267947418","html_url":"https://github.com/weexteam/article/issues/111#issuecomment-267947418","issue_url":"https://api.github.com/repos/weexteam/article/issues/111","id":267947418,"user":{"login":"DoranYun","id":16359169,"avatar_url":"https://avatars.githubusercontent.com/u/16359169?v=3","gravatar_id":"","url":"https://api.github.com/users/DoranYun","html_url":"https://github.com/DoranYun","followers_url":"https://api.github.com/users/DoranYun/followers","following_url":"https://api.github.com/users/DoranYun/following{/other_user}","gists_url":"https://api.github.com/users/DoranYun/gists{/gist_id}","starred_url":"https://api.github.com/users/DoranYun/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DoranYun/subscriptions","organizations_url":"https://api.github.com/users/DoranYun/orgs","repos_url":"https://api.github.com/users/DoranYun/repos","events_url":"https://api.github.com/users/DoranYun/events{/privacy}","received_events_url":"https://api.github.com/users/DoranYun/received_events","type":"User","site_admin":false},"created_at":"2016-12-19T11:57:12Z","updated_at":"2016-12-19T11:57:12Z","body":"@Genng 看一下 sdk 里是否集成了 stream 模块"}}
{"actor":{"display_login":"DoranYun"}}