{"_id":"@unovo/taro-component","_rev":"29-a7eff82913cd7088c056cfbb36b0c2bf","name":"@unovo/taro-component","dist-tags":{"next":"0.2.6","latest":"0.0.1"},"versions":{"0.0.1":{"name":"@unovo/taro-component","version":"0.0.1","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.20","@tarojs/components":"1.2.20","@tarojs/rn-runner":"1.2.20","@tarojs/router":"1.2.20","@tarojs/taro":"1.2.20","@tarojs/taro-alipay":"1.2.20","@tarojs/taro-h5":"1.2.20","@tarojs/taro-swan":"1.2.20","@tarojs/taro-tt":"1.2.20","@tarojs/taro-weapp":"1.2.20","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.20","@tarojs/plugin-csso":"1.2.20","@tarojs/plugin-less":"1.2.20","@tarojs/plugin-sass":"1.2.20","@tarojs/plugin-uglifyjs":"1.2.20","@tarojs/webpack-runner":"1.2.20","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.20","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.20","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"gitHead":"a0fe32b69468c2a123267c2619a52f87f102c99a","_id":"@unovo/taro-component@0.0.1","_npmVersion":"6.2.0","_nodeVersion":"8.11.1","_npmUser":{"name":"yangtuan2010","email":"yangtuan2009@126.com"},"dist":{"integrity":"sha512-SYb1P1UKZ4QOigBHRATbGpwrVG+xSFR5v5VtgInLclNf7fqvYjqrTfP6xke7t1x52P0KdVoBAYTPkh67FbQrvA==","shasum":"900293566d1ec1f65a5fae4cd0b0ea112333bad4","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.0.1.tgz","fileCount":59,"unpackedSize":226844,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJctaWtCRA9TVsSAnZWagAAOuwQAIfwf87c/tWvzRWN2/V3\nRP8a74eHLg4G3suXNsxDJVY19D/cLBFBZlXa3KXWPnPcae6CU5ah6bR5QfGt\nF99KCnUUDfNYT+pet+azwd4P9Ehhmm69bygvyz6I56EBKQoU6zjU/neKB8Wo\nSmYVHU4ES2AtN9Lf+ZRc+zGt/MawlyxH0h3dvWcyhgJQMc2XpRdCNAxdT6pK\npjLfGg+ts0gsZNn+Sw09LopZx6JFQFS9hN8VG46XmgJUdHBx49eqbiGG/WVg\nEgilKmMuRMYQp5xq5QNneh/bHbYereNwDfj1kNxpOTlQ200LTp4n3mkFwRMm\n+H9+TrEM464Gh5W556eU6EvGRrMNgQvexRi2PEZEq+mlIwBgmR8A48HS4uI/\nHicBHkSbCrQbq2BOL2AAtOJ7X7qQWNnMrb7ya1+OgyVfHHXTlv75nfeRABQ2\nmEavAQFKEDynNotBOHEnfk1WtE3nOCWD1Up1v/aEQmA+K71HVx0iYimsBoKs\nT3605O6Et2WuDtngkyx+FqN+KVp2K1mf19J7vN8EpovnvHKP9WhoTUfm7hXf\n7m9jK+IGBcoBNMtuftvHziMP1LpxMoUOnMqxNCus5xVEyFeK4yd7bRwWUxIc\nAXPJ2y2/3se97UOSMBRRk/gpzvXf2zv7aa6fiaftaH0ySUteFY+hYFNFYBou\n6hlT\r\n=hE2f\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID0MNbKjKvj+nevqLVQcLW3GZnHE6Nr649Ufqj19bydmAiBVCgIymf23UbLtuKTvqb0+U8K+s3rhWONAP7BsamytUA=="}]},"maintainers":[{"name":"yangtuan2010","email":"yangtuan2009@126.com"},{"name":"ypeng1991","email":"yipeng@unovo.com.cn"},{"name":"xiaowanzi12","email":"xiaowanzi1226@qq.com"},{"name":"ineo6","email":"arklove@qq.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.0.1_1555408301035_0.10552871984741685"},"_hasShrinkwrap":false},"0.0.2":{"name":"@unovo/taro-component","version":"0.0.2","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.20","@tarojs/components":"1.2.20","@tarojs/rn-runner":"1.2.20","@tarojs/router":"1.2.20","@tarojs/taro":"1.2.20","@tarojs/taro-alipay":"1.2.20","@tarojs/taro-h5":"1.2.20","@tarojs/taro-swan":"1.2.20","@tarojs/taro-tt":"1.2.20","@tarojs/taro-weapp":"1.2.20","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.20","@tarojs/plugin-csso":"1.2.20","@tarojs/plugin-less":"1.2.20","@tarojs/plugin-sass":"1.2.20","@tarojs/plugin-uglifyjs":"1.2.20","@tarojs/webpack-runner":"1.2.20","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.20","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.20","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"6d29d5a7052150c21e7b1a4020a0d5eeec3e7bb1","_id":"@unovo/taro-component@0.0.2","_npmVersion":"6.2.0","_nodeVersion":"8.11.1","_npmUser":{"name":"yangtuan2010","email":"yangtuan2009@126.com"},"dist":{"integrity":"sha512-KDYismFk+vNeCxNV7sAsfQFHr8/G5bZSS8XIbk8QHbAZYY7Fufj+azgKD/tagmNSergtPUIFiVXgo4wDY6Yx3A==","shasum":"6ea002470f06498e18ae94fa5a9f8d0101be56f6","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.0.2.tgz","fileCount":58,"unpackedSize":232962,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcvtu5CRA9TVsSAnZWagAAGLMP/3jC8kh9UnmxkvXMZwnv\nASdrH2Tiv0zbXOG66YR04Pfx/6GsjQH6IYTJWpMxrM6RZaZU0AzEq8fXCn5y\nrjcVBX4GToWG4OWdIwafTD5Aq+XVtwfLIW0LLXD6yw4w08ppJosIP5QunNLt\nZvMsPbExjkWXikwbT62/LWzW/Qo3I8YZS64SvfbdhJHltmKhm//xSDrpmWYN\nkXj9SgDYZb8ehDzy7rSrY+rrGVMdLHeYd1/STg46eF2kkscS2nM/8HMvF/UA\nZPuHGJ447eFxzxFt3NLjpoM/5T4IeTSvxRppjihk3nN0O5c2bUXswmtuoHxV\n54CIuOgMCo1po4m/gs33A9dkP5By3HwKqvH5BlbXQYFIwCRImRgCT96VvUPh\nnj4cU0ogPx06V5q5g6ahcMqpMYyNR/27X8FskAaQUnV/6Fb3ylExP6j3Uh6T\n0Y/4ad9ZQp3E4y626+9P6luazx43iItNJOBxbem6b68gni3LlSvlx1AMI9rx\nvimRC3MXk7iM35DhX5HozJJuZW1RulUHMJvxViMl1xcIDRlMxxY1UrQVDGvU\nF3B9fulmeROShtxjwhmLFGwFmD2Y/hjntwlsiHvlOgMSJRn8d9asOuwsezfg\noLj0KOYrKcFayBkpGJzPLPfjGenZLFHIIntlmXZwCBsFevB8LXEQXKvKX5LL\n6Dlz\r\n=zkBl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCm824+x5Ii67wzEnuYKVaIj/JT3b1pSok1Z9GS3gr3RAIhAP0PEofc7vlYpNU+pZfXGSwsF8gLMgK7isXRFjLLPsSv"}]},"maintainers":[{"name":"ineo6","email":"arklove@qq.com"},{"name":"xiaowanzi12","email":"xiaowanzi1226@qq.com"},{"name":"yangtuan2010","email":"yangtuan2009@126.com"},{"name":"ypeng1991","email":"yipeng@unovo.com.cn"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.0.2_1556011960320_0.5544579164459882"},"_hasShrinkwrap":false},"0.0.3":{"name":"@unovo/taro-component","version":"0.0.3","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.20","@tarojs/components":"1.2.20","@tarojs/rn-runner":"1.2.20","@tarojs/router":"1.2.20","@tarojs/taro":"1.2.20","@tarojs/taro-alipay":"1.2.20","@tarojs/taro-h5":"1.2.20","@tarojs/taro-swan":"1.2.20","@tarojs/taro-tt":"1.2.20","@tarojs/taro-weapp":"1.2.20","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.20","@tarojs/plugin-csso":"1.2.20","@tarojs/plugin-less":"1.2.20","@tarojs/plugin-sass":"1.2.20","@tarojs/plugin-uglifyjs":"1.2.20","@tarojs/webpack-runner":"1.2.20","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.20","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.20","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"c58ce53464b3526d73cdf3d16f041a58d744a595","_id":"@unovo/taro-component@0.0.3","_npmVersion":"6.2.0","_nodeVersion":"8.11.1","_npmUser":{"name":"yangtuan2010","email":"yangtuan2009@126.com"},"dist":{"integrity":"sha512-g1nkdx2RiTpXY6lgaktkVKWGjRiX62csaUn9K5wMPUs10j4VqNZfn/AZ7ywE6dJ7AlDWaDCCIW+eZFRmlQDMOQ==","shasum":"11315a15d5421c1f7670f5ab088fa43e5695306d","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.0.3.tgz","fileCount":59,"unpackedSize":251434,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcvvCOCRA9TVsSAnZWagAACygP/0ETIC9ipLglv0z0UwK5\noQLcCri1ZukspcSoXHf3hnbZ69hOhKxuY43ICgS5ELDBK8NU3OOaQDwXC2ae\neKx4dsVvw1LjWo7iHTuV9+UoVDeFDHtn7mgSYNKhYG5NILk6yPL96E16Du4Y\nVFTefuv/sSdmHH5jK4xyNCdHnwkkZA1T2FrKU+1eZk0YdrzUMruj/70VPBdo\n2a21Ys/6e+rWvH4JYipHFMBa4Pky/qXa/bnPtlgW0qYNM/uaYvTcohIrwu6v\nSiSiFD7JoECb2Xj37t4YjGy7QbOOycP1ttplhlmH07J0exZwLuJbfY30t7FF\nss/mykKkDvVWUzoQiL0EUHiIUyDb8r0temuUFnx7QWQIOI4zobK2DnItDTzv\npX3Pxi/yvwRNoF6zUpZUyDFFDaRBCUwhNE+/eyFRXmZbEfEf2LSseBcIh69U\n70otP1t/xukYiha+Z0W/+f3olIDmQXsSRrN669Ysuajp2/hMILak5MQ3Jdr8\nmHqUSJFZwXFC4oxBdUjBjVSfW4cPAn+sdc6L/JF6yzPsRUwFW61c7ALjQf+R\nYmArA8LlQMwEINAVacV4cx/PpQwmegNEv9QCMXP4wnN8d7WPYHhDHKbueCYX\nbJyddGtfWG3LTn0gm2qbyEqH5LwquxRnOyjBBnCAAKE6pGp7abgKH9GrpK4t\nG4nj\r\n=Gnzj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEL8k4+pXnWAGQTJr44fWuZwvRIIL6n/DHy5d4rZBu7nAiBJuwtdxyC7Ln442h9jjS6alRxPnlZCD0SfcA5RfTCpxA=="}]},"maintainers":[{"name":"ineo6","email":"arklove@qq.com"},{"name":"xiaowanzi12","email":"xiaowanzi1226@qq.com"},{"name":"yangtuan2010","email":"yangtuan2009@126.com"},{"name":"ypeng1991","email":"yipeng@unovo.com.cn"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.0.3_1556017294267_0.16180046485019162"},"_hasShrinkwrap":false},"0.0.4":{"name":"@unovo/taro-component","version":"0.0.4","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.20","@tarojs/components":"1.2.20","@tarojs/rn-runner":"1.2.20","@tarojs/router":"1.2.20","@tarojs/taro":"1.2.20","@tarojs/taro-alipay":"1.2.20","@tarojs/taro-h5":"1.2.20","@tarojs/taro-swan":"1.2.20","@tarojs/taro-tt":"1.2.20","@tarojs/taro-weapp":"1.2.20","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.20","@tarojs/plugin-csso":"1.2.20","@tarojs/plugin-less":"1.2.20","@tarojs/plugin-sass":"1.2.20","@tarojs/plugin-uglifyjs":"1.2.20","@tarojs/webpack-runner":"1.2.20","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.20","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.20","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"2b0b5414018789b425c6bd10b33539023147ba0c","_id":"@unovo/taro-component@0.0.4","_npmVersion":"6.2.0","_nodeVersion":"8.11.1","_npmUser":{"name":"yangtuan2010","email":"yangtuan2009@126.com"},"dist":{"integrity":"sha512-2cMRMvhWR3rkgvcir78DJMU/mAy8N7NmjOx9uiqnNgovaZsVY1B9s22u1L5v6LZXf9cDm7/fHtv0SPsqh7F2mA==","shasum":"c3715cac7d2a8fb5111b3dc705ce0e9559178bbd","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.0.4.tgz","fileCount":103,"unpackedSize":635235,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcvwFZCRA9TVsSAnZWagAAxkcP/A1w9LIXeiZ+2vW+tAnt\nR33CsT9tyGjR7ngGwPGVc6A0O/v2Pjz1v3VFdmuAmnK9IMHlSCoatkwKpuZQ\n8ploCRXurgRd2KWGk8a2gPSfPL6mHcosqQHBPbaTsJDn/IyYqo1pMGd+pNB2\nTW/g33gygjEENUDs2E2nrjaJxsaGwlFs9r1XpxULBp6UFvKgQ0PIeTfYUgvS\nyTWlC4qLg0S0OG5PqFF+h44tqAJfd9xSjMQWRbiCZ4sfwaGG9hanZGEgyfbX\nHQTqE7wnSntcffKLUsC1ISQGsLzXQ5g7urdFj4XVi9fXdkd/QYx0DD01WV1T\nxynpQ2Bj/57wxA5xwGwR7IOsbaOrV95fpFTjhzCwU3PZ6i1eowNhYFfhH2UA\nM3j8h8pafHESn5nL2oROlP0g2cwoyoJFEKW4pLv9XrP7FoqZqTqEBsa9ORsS\n4xIqKviKMA5fgaRZJ9QVx1k+fcco/WUclWUjZTk5j6lUe/po38qt5vNgGiq0\nNvHZYL+uFeTZD8ZFkk8T4VNmOg01G/ISMHBYX9hR2NlVv4ykm5yReVWAOemQ\nEjwJGbgaOgyuCZ0MmyfmYR1qyKAYTZBsj/VlPEEH7thI77zZcT/GgL1R1WRQ\nZhMI/Jv4uolM3DUlCvWEd5ZDkiBwBWbsId+j5ucbdKK5FRTmzO5aD81X9PaU\n17+Y\r\n=JP9+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDSqD0Z3s0B5ey4Sp3U0zi9FlTi0SGWglKP/QrTqbKjxgIgJIAz2julErHY5R/YtCx48iW+U98TfCYrm7UF4VC/uF8="}]},"maintainers":[{"name":"ineo6","email":"arklove@qq.com"},{"name":"xiaowanzi12","email":"xiaowanzi1226@qq.com"},{"name":"yangtuan2010","email":"yangtuan2009@126.com"},{"name":"ypeng1991","email":"yipeng@unovo.com.cn"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.0.4_1556021592738_0.6679614314922995"},"_hasShrinkwrap":false},"0.0.5":{"name":"@unovo/taro-component","version":"0.0.5","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.20","@tarojs/components":"1.2.20","@tarojs/rn-runner":"1.2.20","@tarojs/router":"1.2.20","@tarojs/taro":"1.2.20","@tarojs/taro-alipay":"1.2.20","@tarojs/taro-h5":"1.2.20","@tarojs/taro-swan":"1.2.20","@tarojs/taro-tt":"1.2.20","@tarojs/taro-weapp":"1.2.20","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.20","@tarojs/plugin-csso":"1.2.20","@tarojs/plugin-less":"1.2.20","@tarojs/plugin-sass":"1.2.20","@tarojs/plugin-uglifyjs":"1.2.20","@tarojs/webpack-runner":"1.2.20","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.20","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.20","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"f788c6ef302c4bdf5800742e542b27136be4d359","_id":"@unovo/taro-component@0.0.5","_npmVersion":"6.2.0","_nodeVersion":"8.11.1","_npmUser":{"name":"yangtuan2010","email":"yangtuan2009@126.com"},"dist":{"integrity":"sha512-ihw4t95umvBtln6UZXy4NqA/c0nLqf3Okdr0tEW6ZUuh8lPdKXfD4jlbSm7zfaQMupc4TiQHPwiFKfjkNqBHsA==","shasum":"d22306b1dfc94039e01531daebf94dd9aa82d21c","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.0.5.tgz","fileCount":50,"unpackedSize":421024,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcv8SbCRA9TVsSAnZWagAA1dEP/RLx9NohWzwdpqfJcIgC\nwkj47td+cqlOQD3UVrUh/SLkK5l0C2sCcGPglujEWK0+zu6ET+o+zZUkjWEE\nGkpLqtDiXWp/yzy5BwkNf+fzvgxGop/fN1A2WR36X69dbIrrIys3TSLpuiCe\nZ/mk5unaF1uyJT3TAwXJCFeNXAuPPagXD2Ck2LF83upO7yoJbkyfRUr1DoTz\nK0ajSPvQzosT//yb6ip6mYo1DW3SOgisuySehfdfaDCrUYaWT/TqhpxU55sa\nFZFFl1W2oD4WsTMm1aUvayYNSagmvikqlHQ+qujHzRviEEQp7SV1a4ncfFkp\nJ+zJ8G9ArY6KnIL4UEEaeSF/9iZ7sin/O4CRQK7+qYPrgYeC3FsuT+1B9sg4\n8MiMWh0/GsBOFv86UN8z587gcSqx4/taPyXh1z0hjTYysr6ogixWvkotl/vx\nfqBvN888gFWcS6L53dlYRFNm3j8E99v4AdMijp3C3RNqgfxq77kYaR0lCRGD\nfBs+JeqxhtA4Da+20frNkidFGX6WZI1ee1RDNgo6Gnlk5adZsqLUOCjWGoAB\nEmtOPdzjVNPvN6mKfc3LrpGxRP+lFOr70tGmRLgjCCQEq4ytQG7thobYqNPv\nuGn5mQS9eZe7G1UfIAEG8tFlfBqCO0C3zgON1MmQlwTguX2nzOx1iOxqL5ba\nXZB/\r\n=VW9T\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICz8Y6u6U7Bx24cBQd0D8Vpro4/PhCxhB4CK1LuectQJAiEAt5ENQRTACw7M6CyPSKnSjZ//TzrHGpf7PcrT8f8i1tM="}]},"maintainers":[{"name":"ineo6","email":"arklove@qq.com"},{"name":"xiaowanzi12","email":"xiaowanzi1226@qq.com"},{"name":"yangtuan2010","email":"yangtuan2009@126.com"},{"name":"ypeng1991","email":"yipeng@unovo.com.cn"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.0.5_1556071578619_0.27162534504363123"},"_hasShrinkwrap":false},"0.0.6":{"name":"@unovo/taro-component","version":"0.0.6","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.20","@tarojs/components":"1.2.20","@tarojs/rn-runner":"1.2.20","@tarojs/router":"1.2.20","@tarojs/taro":"1.2.20","@tarojs/taro-alipay":"1.2.20","@tarojs/taro-h5":"1.2.20","@tarojs/taro-swan":"1.2.20","@tarojs/taro-tt":"1.2.20","@tarojs/taro-weapp":"1.2.20","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.20","@tarojs/plugin-csso":"1.2.20","@tarojs/plugin-less":"1.2.20","@tarojs/plugin-sass":"1.2.20","@tarojs/plugin-uglifyjs":"1.2.20","@tarojs/webpack-runner":"1.2.20","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.20","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.20","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"f788c6ef302c4bdf5800742e542b27136be4d359","_id":"@unovo/taro-component@0.0.6","_npmVersion":"6.2.0","_nodeVersion":"8.11.1","_npmUser":{"name":"yangtuan2010","email":"yangtuan2009@126.com"},"dist":{"integrity":"sha512-7GYZr3c6tL7gwEWbg1dwhL/g/E8r2lOaAGqTyQSCLfHKseqZdSSL5eoVBzr1n9k6lLtCfVwLOh9AV+e+7GHpDA==","shasum":"a39fedc78510371d1de58859b1481e2db0bd5abc","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.0.6.tgz","fileCount":51,"unpackedSize":413786,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcv9M9CRA9TVsSAnZWagAApTYP/0YxQ0Pgvw3u6Hp+AXkI\nP2msWCJho6z/bl9lzgJBXtGlB7bMxJmEhCsCM2mN8H4Ikr+vRTA8oQwwSWy2\naCbXKM6kUyuiea39kBW1w++CLxzNlSHdLFXcmrJ1ubAVUIsNbDboHwP9zDgE\n/EkZvFHbcjEmkrah8VwcfKT3ZhMTroUsLeI87a5uI0tMpkTrbL44eygVFs8g\n7frFY23r+X5P3hn6oTUSZR2D6UdcSeza5bsVyGT24jHqunFxaWCnWM0Lg3S6\nb+bT+hAiusxbWJ34KCH6upi8N6uogvvFGfjnEBT0fLQ2A3Tij93N9jvN0oIp\nthAwvM/OzqrRG7/yelSCmj7wQnszqeRfym5q+dPC8lVToak+MBL2fw1ueGVM\nw98ZZcHOC9AzSQ1UNNFW559D1YzG0785jbYuLWs5EVVZK8ya1w6+AOSmX9uP\nvqR62JPl+VbjagIXso//CNQashkmXvb7XzJ2DxFEljMKSL3M0cLyL0FogLmy\nAxVFLy6DH0eUmO0851KsLJu4foZP98mG4mozNEFrVZGkXu8G3vnHcQLvswM9\nFr9TiNzbNVQPlkyGqzEtpJwSDpYLYt3fK7Ug7RrdQZGOPUfjx6k89sZDv8U5\n22JeyEdlckY1nqB4UvfNycjRldPdGj/InIVSjWOwKiOPwBDTvGo51UQmEp6N\nB1XR\r\n=4Y6C\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD7lTQHUZRW71JEmUTU0Udvl0piJUovoOv37JM+PNpkMAIhALQIHT+LH1c7OWNQQ+KmKObCrFSVkWintBorVQX6sdQD"}]},"maintainers":[{"name":"ineo6","email":"arklove@qq.com"},{"name":"xiaowanzi12","email":"xiaowanzi1226@qq.com"},{"name":"yangtuan2010","email":"yangtuan2009@126.com"},{"name":"ypeng1991","email":"yipeng@unovo.com.cn"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.0.6_1556075324965_0.8050494986092156"},"_hasShrinkwrap":false},"0.0.7":{"name":"@unovo/taro-component","version":"0.0.7","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.20","@tarojs/components":"1.2.20","@tarojs/rn-runner":"1.2.20","@tarojs/router":"1.2.20","@tarojs/taro":"1.2.20","@tarojs/taro-alipay":"1.2.20","@tarojs/taro-h5":"1.2.20","@tarojs/taro-swan":"1.2.20","@tarojs/taro-tt":"1.2.20","@tarojs/taro-weapp":"1.2.20","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.20","@tarojs/plugin-csso":"1.2.20","@tarojs/plugin-less":"1.2.20","@tarojs/plugin-sass":"1.2.20","@tarojs/plugin-uglifyjs":"1.2.20","@tarojs/webpack-runner":"1.2.20","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.20","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.20","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"4f4e8f1d5514e2d7b2dbddcf2446f932c33b520d","_id":"@unovo/taro-component@0.0.7","_npmVersion":"6.2.0","_nodeVersion":"8.11.1","_npmUser":{"name":"yangtuan2010","email":"yangtuan2009@126.com"},"dist":{"integrity":"sha512-Bh8jUXKTbolpZyhDPxEp52aD7jzmp06+8ivtHu0+/LohMf181j3zCFEPRK98dRD2i/+/t1zWngctR8t3ovgM5g==","shasum":"1e2bd45711a7aca60df9b44c341797ecb43ccddf","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.0.7.tgz","fileCount":51,"unpackedSize":414326,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcwAAPCRA9TVsSAnZWagAA8s4P/Rt9Q6kxhUqbifmzXg+W\nV1MFWQ+mFhHecFWiiXEjNWPyCKe5aRsku0XiD4AFHqYGi3Hp6Fi69N+Nh9BB\nYfvr7lNufx/JsVE9h4zpTDJY1RXuuRxyLvdsdNa/dsSm4M2EHkDCcFLh8dTa\nUJJstky8FQEfrlqDb+YkY24iWxSPgRtKvfZVrayLG2m/YtrNuuvQ3Xq+6Zql\nu0gDsSFryNkHd21NmIcUkKa5QKEgv5fXomwp/lncALtlgmyvwLqNhrtkvZLi\nXyUxT3/J5M4D6vhQ53wDms5Zsqrh1/UnxRLSDQpfeedB7C+DM4ZGNlXwVrWl\ntH2ePDYLQOqWAsuujkDQqpvCQdkf2hNUR5+BZyoPY5p7vIjtZxLSAuDcTi3z\n/TFrlEatU3ohUH1k0+G4HAL67en/o8e8vOPhTQMYX4VfOWzqggAw/lWaCuv9\np67HXOUrNYWgrk4S219HlZP09KTzEGDsXfsNuigV7XjDNZ0+lpcetvFsdT2G\n0zhNxmM4FVJF5ikGO9f3GNPulJpgCESaDkUQvOW/iYmMYKaHvkNbr6MIEnhe\nKkvSjIkZuKero7dzSckfskkP36FW98r/LZc9ZUKGfN4/42C17lkYiXdEvuVM\nQQmv/MFiGUmguedwAhnV66hdo9jK11sZ7NeWaxa+lzUeGH26badY3uoHQ9kh\nC81Z\r\n=Jum1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDbJVZm/wdT67OI+qOkUC/6AMcGVdEcmawlFDyvk7XNaQIgeVFtpvA2aXw36ajOB78gtojA7nugPMujgvLgEo+c1mM="}]},"maintainers":[{"name":"ineo6","email":"arklove@qq.com"},{"name":"xiaowanzi12","email":"xiaowanzi1226@qq.com"},{"name":"yangtuan2010","email":"yangtuan2009@126.com"},{"name":"ypeng1991","email":"yipeng@unovo.com.cn"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.0.7_1556086799017_0.4058489507470391"},"_hasShrinkwrap":false},"0.0.8":{"name":"@unovo/taro-component","version":"0.0.8","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.20","@tarojs/components":"1.2.20","@tarojs/rn-runner":"1.2.20","@tarojs/router":"1.2.20","@tarojs/taro":"1.2.20","@tarojs/taro-alipay":"1.2.20","@tarojs/taro-h5":"1.2.20","@tarojs/taro-swan":"1.2.20","@tarojs/taro-tt":"1.2.20","@tarojs/taro-weapp":"1.2.20","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.20","@tarojs/plugin-csso":"1.2.20","@tarojs/plugin-less":"1.2.20","@tarojs/plugin-sass":"1.2.20","@tarojs/plugin-uglifyjs":"1.2.20","@tarojs/webpack-runner":"1.2.20","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.20","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.20","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"e69e835b81f88df6571d7fa5975a71495d9e9145","_id":"@unovo/taro-component@0.0.8","_npmVersion":"6.2.0","_nodeVersion":"8.11.1","_npmUser":{"name":"yangtuan2010","email":"yangtuan2009@126.com"},"dist":{"integrity":"sha512-KhMaspmRGhgPJzTr5Y2fDCfGETE/Aq/itgZvOm9qR54c43VFjnw8/2mg68a57kt6XUuYov/tCUVDkh/N0uI1oA==","shasum":"f32cf81bfc9759ab69b347abe8cec03169c34eb5","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.0.8.tgz","fileCount":51,"unpackedSize":417077,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcwDPBCRA9TVsSAnZWagAAS/QQAJFxBJZAWyhgxtuirRlM\nG81XCx5VGICbyfSJL733O4Ik8ahaHxxiW52QmZGizk9kYC0ARSu/S3wW+QG4\nEoNhO/p54Al6vPj6xGEGisx+KxBWbBcABz5bzBgvWmGraG7me3NbnPrIKxzg\n2TfnK9i+ZCs72osCr/GzpzpJHyS7RlZryZI4dtS2Q10bzGjp32baC1rz4vrR\nEskyn65sBc1k5fO+bRv/Z40EhJePi5LKS9HBOZpuZKdWcWsvWhir1oXltccj\nTiIwjfdBOmD7iXC6fOElbvLsGWC3M4aJM1vipyExtW30/f8C1XGFu732lz/W\nb24CB/eXekULygsZ0KUq9MopiUi3gO7gZ1YArghQ23wSUCJJ139F4ZePyLN/\nfl1+HKMw69AjzXxNRfOEd0nlM3iMJmnEgLop1CSlIJ/WFy+OvLRLNA6O+8tg\nlTvs8KI800ODyceaeCgzEgY6d35xIzO20t5UagHTkXB5Kw9grCOLuJ7tN/hQ\nxy43mc6AvClShIQ5XolAN2U1kF+WU8qChl45EmoXoyo/hvV94afwGkcrUIqp\ns1y6Lvz9zRo4X+8rY8i/z8V3gO8E+uge83QRxq1UZJJ1AXzK7W9E1LJ5Kok8\np7o6zkH18SqllwnLGJyk1Cf2aGyCZoSeCA4ys+x5NMlLTzAokJ/h1Zn2RXrT\nyhx1\r\n=EfXp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDbhLkx0s9m1zPwJhAvbUGPwDpNgP7tH60TcaygXDwxVQIhAJlE7mP3nKtu7whUUu+Ptz+kg+cd2Y1VSAq0CzBGawAv"}]},"maintainers":[{"name":"ineo6","email":"arklove@qq.com"},{"name":"xiaowanzi12","email":"xiaowanzi1226@qq.com"},{"name":"yangtuan2010","email":"yangtuan2009@126.com"},{"name":"ypeng1991","email":"yipeng@unovo.com.cn"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.0.8_1556100032603_0.1552497992138291"},"_hasShrinkwrap":false},"0.0.9":{"name":"@unovo/taro-component","version":"0.0.9","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.20","@tarojs/components":"1.2.20","@tarojs/rn-runner":"1.2.20","@tarojs/router":"1.2.20","@tarojs/taro":"1.2.20","@tarojs/taro-alipay":"1.2.20","@tarojs/taro-h5":"1.2.20","@tarojs/taro-swan":"1.2.20","@tarojs/taro-tt":"1.2.20","@tarojs/taro-weapp":"1.2.20","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.20","@tarojs/plugin-csso":"1.2.20","@tarojs/plugin-less":"1.2.20","@tarojs/plugin-sass":"1.2.20","@tarojs/plugin-uglifyjs":"1.2.20","@tarojs/webpack-runner":"1.2.20","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.20","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.20","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"66b8d5149697a384092cc9e078e950cc712a95af","_id":"@unovo/taro-component@0.0.9","_npmVersion":"6.2.0","_nodeVersion":"8.11.1","_npmUser":{"name":"yangtuan2010","email":"yangtuan2009@126.com"},"dist":{"integrity":"sha512-+glSqEPvYLpymiEpq12aZYBM7maT6G0FK2r48GqfB/KqduFg+0uEO26MoZpgydZCyPV38qs80zkpQ9kTnUeCIg==","shasum":"e7becf0de3804bb1b091863d827720a693e38184","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.0.9.tgz","fileCount":51,"unpackedSize":417704,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcwEN4CRA9TVsSAnZWagAAvdUP/257RsT0C8kHuGqY3faT\nHkKJd//R01BDO04UbMvKEZw28HMIHx2+0TbXt9jtsyQMiGHBGBqFcwFOIIp9\n/I96OmBzPzWCeklvaHO/jDN28MQMARhpPYg6UhKJNfm5sjv3zZhaQlOwW5Le\nTzkrroGWGGXVcVxMtjqhqFeO0u/4r/5SeS50K3VF0SlpNM8kn5bffhEL+tk7\n3xsUvDcKB7LZgd1T0Eu+MBPMbBLMnVDJ6mBaQdOeHjafSao3FXc/B0+wxUX3\n2vnc/5M9giJWQkuXsDnAaz7qAfm/nt6BvP/MYiSVWvsG8cFqkJ7fel8gZZB3\njvOJUgWCHE2lMfkQFUGbHGNhF3lUgQAJp3yo73zcViiumiaXJOE6ReNLQFmY\nLNmnxN8ZHh0cAcfSc2uCB8lnq/jw4vRpPuivHMvYob78mYcbi+FSpW/HIqIP\n0E7PaZtwJFaaksYcL5inm/oK+VYA0YrWMJTiOJb2Ajb8Au1CDBtJrId8S6Te\nEMm0NKQ8fTwWo6RgGeDAJJdEOE4r2VM0dNu5KxCYlTz/aMfsqeoO0zJsFBmm\nF9ct6lipFxDmu3uI0zhmY35SjBFlGJr8cWM2hm72Ctu4qEOJ18ijmPrEZrU8\n90Et7pIpF4Nh3d0baLdrf68HU0+JOXT1XHajAAeoqgWeuoBA6ZCV2clWQGG3\nwGrA\r\n=2xLR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQClo8vEOWmTSTqOxKJ9FK+kSu6+s6qmRv3CybkDLr0vOwIhAKibo/5BHC9GoQqbBdqfJjG7xhCJpB+haJ6rV/egWvZ3"}]},"maintainers":[{"name":"ineo6","email":"arklove@qq.com"},{"name":"xiaowanzi12","email":"xiaowanzi1226@qq.com"},{"name":"yangtuan2010","email":"yangtuan2009@126.com"},{"name":"ypeng1991","email":"yipeng@unovo.com.cn"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.0.9_1556104055407_0.7739338971863099"},"_hasShrinkwrap":false},"0.0.10":{"name":"@unovo/taro-component","version":"0.0.10","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.26","@tarojs/components":"1.2.26","@tarojs/rn-runner":"1.2.26","@tarojs/router":"1.2.26","@tarojs/taro":"1.2.26","@tarojs/taro-alipay":"1.2.26","@tarojs/taro-h5":"1.2.26","@tarojs/taro-swan":"1.2.26","@tarojs/taro-tt":"1.2.26","@tarojs/taro-weapp":"1.2.26","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.26","@tarojs/plugin-csso":"1.2.26","@tarojs/plugin-less":"1.2.26","@tarojs/plugin-sass":"1.2.26","@tarojs/plugin-uglifyjs":"1.2.26","@tarojs/webpack-runner":"1.2.26","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.26","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.26","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"37737339641bcd948fb02f973a79fffb4191e013","_id":"@unovo/taro-component@0.0.10","_npmVersion":"6.4.1","_nodeVersion":"10.15.3","_npmUser":{"name":"yangtuan2010","email":"yangtuan2009@126.com"},"dist":{"integrity":"sha512-MF+Eu2CZZj6R5RLN0uuFvicCNvVtYVHflRGMsqnFYxnDI+7EXIuI9DOcl6PfOX1fJoJmHHsL2IsPU4KBHJtMtg==","shasum":"8ee80d2bacef44c4a143fbc560d2c1f995d35a5f","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.0.10.tgz","fileCount":51,"unpackedSize":417969,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcwVCKCRA9TVsSAnZWagAA+q4P/1VgsqHXjYW4jVpE4j87\n4TADNuwIHkd/pwKzUsDzyvEXKr3OTUr8AeBiQJQ1IekntBIkAT/IYXeHZ/H7\nH7paAFz9+H2JSS/0zDuiNtnGfYw+z1dFwR14+MXr9jDqbwDDnAk/CYPyMJ6j\nPsbYzZcdBSGhIQw1Y+D3h7OaTIg2JUitDK/+YhcjIvERLVNmkw3jYftqIXNN\n0YiX13IKZF6Bhoc+Yi7QFHqii+5iG35+9WPvnuaTxftShZupLmPs1oMzzk4v\nuh/PM7sK59LTFVy8SGpbOUNTMMYDAMPdmutzu483cEpxEySxzDYq4S753BlN\n/A6u8Q8NuKKQPe2Q58xICFyL8fC8zAt35S21/LGCZLAp3aVZY1Wrslb4GxAA\nO4QjCiOIpXC5vDRdiGj2nJ4+wearNjsqT3NwAReAjjPM06vr0OUhaaJa8LFy\nyABhrL31ko8fAlxzCrXhLgx0brmRZahi4gltzh4R/441OfKIDL3VH84tmyy8\nH6pAEO170Y51ar6mLlsCUgr4qijY8lgwGQT7zRqtdgrOvmvd4ibD7QfJzjZm\nNfJuH9Jx+FkLWWuqQ2rL6+H/e782ylH/UXpu+221cmEd11+HiAUl0nKu9MwU\n3JeSMsin8QHwAf4Bp34Xi7mZb98x7BKW6gWdzl9AM/1djxC5x1ojKRRr5eA0\nqSWh\r\n=8QNF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDouTl2t5rxnax4XaYLuz7xBZySA3/YfUo2DaG8KBNN2wIgcFNuA5W7Jj3Z2Uft36M0SuL0OcrLouCB8ALbM83Z9qM="}]},"maintainers":[{"name":"ineo6","email":"arklove@qq.com"},{"name":"xiaowanzi12","email":"xiaowanzi1226@qq.com"},{"name":"yangtuan2010","email":"yangtuan2009@126.com"},{"name":"ypeng1991","email":"yipeng@unovo.com.cn"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.0.10_1556172937867_0.47849093015763944"},"_hasShrinkwrap":false},"0.0.11":{"name":"@unovo/taro-component","version":"0.0.11","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.26","@tarojs/components":"1.2.26","@tarojs/rn-runner":"1.2.26","@tarojs/router":"1.2.26","@tarojs/taro":"1.2.26","@tarojs/taro-alipay":"1.2.26","@tarojs/taro-h5":"1.2.26","@tarojs/taro-swan":"1.2.26","@tarojs/taro-tt":"1.2.26","@tarojs/taro-weapp":"1.2.26","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.26","@tarojs/plugin-csso":"1.2.26","@tarojs/plugin-less":"1.2.26","@tarojs/plugin-sass":"1.2.26","@tarojs/plugin-uglifyjs":"1.2.26","@tarojs/webpack-runner":"1.2.26","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.26","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.26","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"e7b0b8ad8d3c3e1da59b4595d4adc439a71a3b0e","_id":"@unovo/taro-component@0.0.11","_npmVersion":"6.4.1","_nodeVersion":"10.15.3","_npmUser":{"name":"yangtuan2010","email":"yangtuan2009@126.com"},"dist":{"integrity":"sha512-qUQ8srYNQItqP14mfcoIFQvsQhYIl6pZudhBKKqeEOWWEfRpQyvpVfv50rQZwRsMVAK7k+c7EW+53dTzNwOMVA==","shasum":"d9d9859f66d10dc64c5bc03cd12c0e6df97f613a","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.0.11.tgz","fileCount":51,"unpackedSize":418219,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcwVZ/CRA9TVsSAnZWagAAzCsP/2YaApKb+qLt5i5oxr2S\nZfwVBb9niocmX6nybxM/4ochTzt+OI1kRNvsKNLM+9vsHHgPYnIkMAhT5ZHd\nRHzZZim6oyYTFH0ytyyEeShX0ftRirSZkt/43cpbiw/GD5hV870ZaXKZ69cH\nvEG0a3GWCjxl41zf5XwsNZcyBqoshG607HVwYjtoHXRP5KnTgmnIPycH0Ee7\nlMkommTtvd25PU2hjE+sfE5iD4DGxZBSV7i5C2jDGSC5H+9V083Uc9coWFM5\nLAMbT0N6L8duhe+q4dPxQtnWyu3Q9uhC2cw7SBjoiOqViUwyAH13RJpsowBS\nqrSp0zTQmmYjcuiy+jp/OZJvVwBjtB6JIJnTjyHvduZns+Jx3PSuCNvQscDm\nsU+xkBuFp8+iI1fV2Ye5Zk7RQ90LWxiqoGSqhfPqHltHo9/xzncI21T3BT1o\nKiUQ/t8tsgC8c8gXK4uFRBzmTjlyRwKzaHpX9BKZKs53CkKQ39KLElzx17a+\nHx4w53ncg8/l/5WbJBzB3+NEwHImddhYnjb9AgvsVgdXX1HJqCR1xdx2zKPd\n2WZbLNvMPR96bXG3fsXwmvik7AnuVszACR36slizaLeFW5bvH/vdIOsQC1Q4\nkwTXpiw9QOkwwDaRI5RNGjKu4JlR9ybHFwZLe1qsUFWIT9Rg4KzZZIZ7j1/V\nf/zp\r\n=AKz8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEaskGJQg7xUKug9Vvg1DTdznl9TLuMUZ35szGTFGtL3AiBtTO4eSLdsGNPcIga2AT2H/MjiPAYyaNAVYFpYBYPW9w=="}]},"maintainers":[{"name":"ineo6","email":"arklove@qq.com"},{"name":"xiaowanzi12","email":"xiaowanzi1226@qq.com"},{"name":"yangtuan2010","email":"yangtuan2009@126.com"},{"name":"ypeng1991","email":"yipeng@unovo.com.cn"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.0.11_1556174462419_0.4232164677342001"},"_hasShrinkwrap":false},"0.1.0":{"name":"@unovo/taro-component","version":"0.1.0","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.26","@tarojs/components":"1.2.26","@tarojs/rn-runner":"1.2.26","@tarojs/router":"1.2.26","@tarojs/taro":"1.2.26","@tarojs/taro-alipay":"1.2.26","@tarojs/taro-h5":"1.2.26","@tarojs/taro-swan":"1.2.26","@tarojs/taro-tt":"1.2.26","@tarojs/taro-weapp":"1.2.26","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.26","@tarojs/plugin-csso":"1.2.26","@tarojs/plugin-less":"1.2.26","@tarojs/plugin-sass":"1.2.26","@tarojs/plugin-uglifyjs":"1.2.26","@tarojs/webpack-runner":"1.2.26","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.26","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.26","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"6b2a411e5ca5b80d87c9432e84a6f4e65d889ae9","_id":"@unovo/taro-component@0.1.0","_npmVersion":"6.1.0","_nodeVersion":"10.4.0","_npmUser":{"name":"xiaowanzi12","email":"xiaowanzi1226@qq.com"},"dist":{"integrity":"sha512-gkxabYq0DK01LsxF3V5R1cQrKzjfJdKgQijhvf+XiwkJj2zSUuMYLBl2EJzEOpyAkW5rTWacUViBRNMuzJZGDA==","shasum":"57c6edb442983c07447e64f80146eeeaae2f842f","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.1.0.tgz","fileCount":57,"unpackedSize":422638,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcwmfMCRA9TVsSAnZWagAAVUkP/j+Rc7hxdKcS6j76GiNl\nkKznjpT6vai9FLuaVY9BXuSWxw+iy6SseNHdbZpFkP6CdagzrDblzeOijKUV\nnlHA0hu1nuCxReYvmTOeNWjIX0UuvoJT2JJa6a2yv5BLeGn0GM6rfc7uRswD\nGEtbAAYGG2Sbr8pcIUUNSTGHaNnF/KLkhQ0N3U1x+0czs7keNH2p5rzsas2l\n4LL0rmWR6K4xaXinBZrMrvGc41ZhMh3i/R/0zK9N/PZvx/ak2IhEy9o3Q+so\nt/9IB5/V+NXDLinZDUkp3EB9l3c+qeprA4S2LzuKoCoKSUFLihTLXHZ8tX4S\nEB7GYuTS+4jGXPCvqbbzOZb0VvW6kLTOnox5htL0jj6BETgwTsgyDvLKuPKJ\n7FJ4D/OQhTU73Tg+6H9ZaZQrMIA4QC5xln9UGqP40t5+hvb1ZPeILK9ffQLh\nnBcxezXLdip+7dIl6iENCUv8zdBEURJj4kDpuOwMmDhUYai0t2X59g1CAqpU\nqqCHG0fDiQMVS/rC09OsltdUQUjP2LiOXGWEYdyl+tYwNucWu581axJPl6oB\ncXV7UlLQX2jkhYKzt+dwPEJlFFz0z3p5ut+wnCAYLPKDqOxmpBAevNeN9XG5\nN+ArbArHWwaFT2d0hlZ6r8XjTeuySjwwvdiggeNQZMSy9jeZ+JsQPtrOKav6\n8jMD\r\n=rqb6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGAClbmxAKAT1UiNIXWg1NbEf/2f4dfw0Ox8tXPKMjoWAiBkDQ326GLAvt7nU6ZMv6hVbClKpDlfqGrZio6ehZ8Hmg=="}]},"maintainers":[{"name":"ineo6","email":"arklove@qq.com"},{"name":"xiaowanzi12","email":"xiaowanzi1226@qq.com"},{"name":"yangtuan2010","email":"yangtuan2009@126.com"},{"name":"ypeng1991","email":"yipeng@unovo.com.cn"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.1.0_1556244427669_0.7999614447849013"},"_hasShrinkwrap":false},"0.1.1":{"name":"@unovo/taro-component","version":"0.1.1","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.26","@tarojs/components":"1.2.26","@tarojs/rn-runner":"1.2.26","@tarojs/router":"1.2.26","@tarojs/taro":"1.2.26","@tarojs/taro-alipay":"1.2.26","@tarojs/taro-h5":"1.2.26","@tarojs/taro-swan":"1.2.26","@tarojs/taro-tt":"1.2.26","@tarojs/taro-weapp":"1.2.26","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.26","@tarojs/plugin-csso":"1.2.26","@tarojs/plugin-less":"1.2.26","@tarojs/plugin-sass":"1.2.26","@tarojs/plugin-uglifyjs":"1.2.26","@tarojs/webpack-runner":"1.2.26","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.26","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.26","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"9bdf91d90388189f1c20b3310518ecc0708a9c99","_id":"@unovo/taro-component@0.1.1","_npmVersion":"6.1.0","_nodeVersion":"10.4.0","_npmUser":{"name":"xiaowanzi12","email":"xiaowanzi1226@qq.com"},"dist":{"integrity":"sha512-7+dYLqqsk1JfjcWUVcz6mkQ5+0AX/wQxjnCq1hrWj/9wMb60HIx98I6vOa3r3poCL/+YgPyKg590XRW+3YOTCw==","shasum":"37cc40cb04ffe197c1ecf54ec96a7f5504d6d586","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.1.1.tgz","fileCount":57,"unpackedSize":422581,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcwp4sCRA9TVsSAnZWagAAlrEP/ApwmH0fFXKHWl7bd48J\ntA+FqTiXozhX6qpip/7iyTBuvQK114tiHxIia6tRqKtarlzCRhfwWyNxUW3Y\n7rQtj0O4xLJmHQsN2cDR8AhM3+suRPjvjbTB/cMDL1111B9UL2PD6MDm/7/v\nQE2txgvy3SVtnN4fm2D2uANAbSonK6r/Qnr4TjiBxFeYyelOhquzGjBWfD+C\nL4IQj3MILpmGCZz57N5e/SY3zrIoHQRyyReNmVOLV/qRs90RommkejXXStcG\n7ionwP1hR4VgtwngT95/RVbwpxETsCFVmqDJCS8c/+VXZDz4hRccgAVwyzAG\nLQHk4/HOXc3HNZJqtPajJVKQXszs2pBx3R3Z6XXlmwHm0vL7VHrFLPiWsepf\n3Blk7a9+VBX096YBkRyPlTbjo24vjxQPiYmOpf53FDXfMiZtgJUjoCtwzucR\nn0lGxNqA/KS4JKHeT8GyooCX4osDCjNgGSaV8hgKH+/L8Frw0AK7kfQ6BESx\niOFN8citqU2jM94ATIV4c+2hwhfu94DfqYbx68ygXsIWEbAjbG+IXR3knd5K\nVldgsj2QrrI/EdnOi8wsGUv9cmno5eMLnT5VQhOrDADP5j8+f7Au6XarKuN9\n6jBPs5E05QJc1zv6fSaLFK3Efmk36Jb56TB34FB+gZJ1PvQayHNfHfImAwdy\n8usT\r\n=bJk2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD0lbT+iBGNmKJuxp9lzkl3bKJ5Xkz7oYjC1iqDTb68uwIgbLZVIq+/SnsWclNxho9htmpKL4LzjVd85qXhB0JGAGM="}]},"maintainers":[{"name":"ineo6","email":"arklove@qq.com"},{"name":"xiaowanzi12","email":"xiaowanzi1226@qq.com"},{"name":"yangtuan2010","email":"yangtuan2009@126.com"},{"name":"ypeng1991","email":"yipeng@unovo.com.cn"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.1.1_1556258347414_0.22841971366120317"},"_hasShrinkwrap":false},"0.1.2":{"name":"@unovo/taro-component","version":"0.1.2","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.26","@tarojs/components":"1.2.26","@tarojs/rn-runner":"1.2.26","@tarojs/router":"1.2.26","@tarojs/taro":"1.2.26","@tarojs/taro-alipay":"1.2.26","@tarojs/taro-h5":"1.2.26","@tarojs/taro-swan":"1.2.26","@tarojs/taro-tt":"1.2.26","@tarojs/taro-weapp":"1.2.26","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.26","@tarojs/plugin-csso":"1.2.26","@tarojs/plugin-less":"1.2.26","@tarojs/plugin-sass":"1.2.26","@tarojs/plugin-uglifyjs":"1.2.26","@tarojs/webpack-runner":"1.2.26","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.26","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.26","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"20f275a1a6a5d59889232532e20ead277a047235","_id":"@unovo/taro-component@0.1.2","_npmVersion":"6.1.0","_nodeVersion":"10.4.0","_npmUser":{"name":"xiaowanzi12","email":"xiaowanzi1226@qq.com"},"dist":{"integrity":"sha512-XR3bN/4gfjZicrS+AobkyHTyLsyvHBIHwEnwdQCkTPNTq5Ty5q/C2hItJ0toLOsA2D9WBrylGe/lWw2+MT3Sew==","shasum":"1cdec108330e0060876f8ffb6fb6edb0d9d48cae","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.1.2.tgz","fileCount":57,"unpackedSize":422398,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcxk6sCRA9TVsSAnZWagAAtlEP/jcEKql6GMLSS1v7M6GV\nlTETQOaYgidpu10TAHCW+hTTvhHqBOsZqd5Oo6nSRYo7y3UOE2Z+GvCIoAY5\ng8PsmLHG9kPmjKqdouV8xpjCxFVkFo9aHdzQlNNxEUfJa1nD2myk/uJN5W+G\nKX15awspIcSbIpRSvbdgqMxwlHl2cH0pRNk8uP4RvyKaBebAaW8XrsAkVhx4\nwf7IoAdT6gii9zkUZuy2SfzdLQp0EuQqGdv14ElLsXQ0zY78UVI01zmNd1nw\nXo7fSEH2E8RjCONlGCzO+GokLcpdobABXicdOWKkQSoymXq/uRRFlLSXiERp\nPXNl4NY5u4zz57PuK0sWYxcixxyU1KcPm7+3a1mYYX3B0DGhonnA+/rZb8ic\nkDzBZ3M5L9eMOtJizGeMi6nLoxEJg/FUHJ86TdVQn078pWzHN9giudF48gIM\nSLXt2or+E3F5cWj8u4ND+UELj23+xrLqHsdB0PqCrsE2ZRUAMn40iSJlLs7i\nzai3rubGMkOBwD96fIkkcd2RE6HBhswf2WdqqELxpzFK4V/tGbqbBxmWnjHi\nPlxDeRD2qnCxBIsrUzz4xHb1/YK7TKgJid6mBcJW/xCzA5//W/2XbYQRZbta\nNiOJOplbEw8H4lMOK0OG2moJUdQ3qTTHhXzxWmK+dfCzMWwMAF8+BqahADfq\n9F0J\r\n=qg4Z\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDYXg13c6ym+xgl4PQvrBeonMmLCqFFVMjNKXQYdNDJ0gIgMEPhjd7gY6I5XjS+AcK+6MJH5UEi7dOiXqiqmVnnR8Y="}]},"maintainers":[{"name":"ineo6","email":"arklove@qq.com"},{"name":"xiaowanzi12","email":"xiaowanzi1226@qq.com"},{"name":"yangtuan2010","email":"yangtuan2009@126.com"},{"name":"ypeng1991","email":"yipeng@unovo.com.cn"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.1.2_1556500139301_0.8874685745317938"},"_hasShrinkwrap":false},"0.1.3":{"name":"@unovo/taro-component","version":"0.1.3","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.26","@tarojs/components":"1.2.26","@tarojs/rn-runner":"1.2.26","@tarojs/router":"1.2.26","@tarojs/taro":"1.2.26","@tarojs/taro-alipay":"1.2.26","@tarojs/taro-h5":"1.2.26","@tarojs/taro-swan":"1.2.26","@tarojs/taro-tt":"1.2.26","@tarojs/taro-weapp":"1.2.26","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.26","@tarojs/plugin-csso":"1.2.26","@tarojs/plugin-less":"1.2.26","@tarojs/plugin-sass":"1.2.26","@tarojs/plugin-uglifyjs":"1.2.26","@tarojs/webpack-runner":"1.2.26","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.26","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.26","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"bf78a6b8c1368f07e1f25450492bff801f74fc6c","_id":"@unovo/taro-component@0.1.3","_npmVersion":"6.1.0","_nodeVersion":"10.4.0","_npmUser":{"name":"xiaowanzi12","email":"xiaowanzi1226@qq.com"},"dist":{"integrity":"sha512-6Z7JM1XsTmfvrEV8Hy63mJr5rmWlv9ovS4meP5IZewRnhTP27Oo0zEm60E8qHwxReiyM0aJO8aCRX7QGJUySEg==","shasum":"7b55212e967424f4434c2ee5e68d4a5c07ef685b","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.1.3.tgz","fileCount":57,"unpackedSize":422398,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcxqGSCRA9TVsSAnZWagAA4BoP/RctHxw0t8eAMMoOouW8\n/O9nteOvX0Isso7yLvSgGhlA2Har68jo4b2rf2QKtM6JG0ZG7NIuOjXmyNM9\nnb664LPIycUBwCjHsl+nBy4o6QShR32bnX7yWmFIyA/fyVkEZsnkQAAe/otd\nsDSgGsYoemlT4nZ+2RS3rcxCXfUGTZUVg2KTGPJSJvkx4fCMcQQWpwgpNZXB\n5BoN0dVLDnjAlI76wiYxHetMPEv4lTykA99uqVy58lZDW8Fq4u3CY92gg5l0\nxOtKZ3fJ58siDtjMsQNR/AUdr65sduA9U6PL9fATOrGaTWj3ZpEfVs2uJEe4\nRwXaMbnoorMupPJgo5TMQBloviyKFsk7fOX2u6zp8FswUAz4zVWZqg1Tm5/l\nZlm46uBROivWdIN4sSz3iIo3Xx/IzJotzWjHbYCiTIlYJaYtBb2i/hZyE2v9\nsvQCiiAd/GF4982CvLKqdXE0IAUekrSlJyBvR4wFLML8CNw3SgmytliN8gNd\ntr4Td3ZTz0sBeGxH4wu0dEdcGp5bbCG2YbkTWwo2LNbCFfqb+UQI84CCPigb\njeqGUkT85Bheu2bzQ3ivRjBrpN7G16R+WV0DSgdiholhx8zCsIimhU3i2WAm\nMTiURXRyh8Aqs/DB1obxaHHlPzK5MY2PECgog6Vnk2tSr/3IrUCw14eHgis8\nbR0K\r\n=Plji\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEtqKzhDFAX3KvWttpBfM3MEEMV4NHf+/Z2nqyEpKJmwAiEAuhtBgDZnD9QbCZimo54A1SBWp8sWuRVR5RAI9kuj+UA="}]},"maintainers":[{"name":"ineo6","email":"arklove@qq.com"},{"name":"xiaowanzi12","email":"xiaowanzi1226@qq.com"},{"name":"yangtuan2010","email":"yangtuan2009@126.com"},{"name":"ypeng1991","email":"yipeng@unovo.com.cn"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.1.3_1556521361152_0.6677984154518677"},"_hasShrinkwrap":false},"0.1.4":{"name":"@unovo/taro-component","version":"0.1.4","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.26","@tarojs/components":"1.2.26","@tarojs/rn-runner":"1.2.26","@tarojs/router":"1.2.26","@tarojs/taro":"1.2.26","@tarojs/taro-alipay":"1.2.26","@tarojs/taro-h5":"1.2.26","@tarojs/taro-swan":"1.2.26","@tarojs/taro-tt":"1.2.26","@tarojs/taro-weapp":"1.2.26","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.26","@tarojs/plugin-csso":"1.2.26","@tarojs/plugin-less":"1.2.26","@tarojs/plugin-sass":"1.2.26","@tarojs/plugin-uglifyjs":"1.2.26","@tarojs/webpack-runner":"1.2.26","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.26","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.26","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"d3edc5330fa97de9c77008bdfe4997e02c2bc8f4","_id":"@unovo/taro-component@0.1.4","_npmVersion":"6.1.0","_nodeVersion":"10.4.0","_npmUser":{"name":"xiaowanzi12","email":"xiaowanzi1226@qq.com"},"dist":{"integrity":"sha512-ffLjLptoPLfd8RhrQCFt98StAD4pJqhOpez3W8r9h4MOwB5meleppxhNGD4hwSytZ9qIRhIZLW7Bxtp9lxv95A==","shasum":"3f50da6809cac692b73fc10bf31b24674765c17e","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.1.4.tgz","fileCount":57,"unpackedSize":422439,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcxsqwCRA9TVsSAnZWagAAdNkP/Rnz1Fu+yquuXvMTvgN7\nIdiJpLEiBtXOnF28f3ZanO5aKfdy8kqZDzBBEwMU9L2shUs6M/B0Eg4+I9DK\njnXQFcKnb24rfw63lovCXQ0MDjA6sa5Ddh3TSfX4KWHT3wXM2i0d2HDt+tXv\nw95R2DyE0xgya4oAdG0lG1u1Ik34zIEUDNkQYsQcOsSlzRpcIxuZk7lSzhFk\n6rU7xLU9aeJScIyP8i88CkKFr4sFCsJh3xWLqxryP8+LD6lIUtQSPTBSla4z\n8nhCpWp0zNbKlHBYw62w1zlC9pcJfS1Vh2CeWivS3Sy/fKyg2ufD7u9nqaEG\nwWwxMeEQMTUgaUlFn5WVQnre0o5xnZIhD7eBvGkbrtBGFcFWBrPJ10UEPwVK\nxbOJIBGBhoALwzi75GWdef+ecnZKRYMYkINFxEPgTHf3Xnu7eFDNSmO03rjs\nAZNCxCeWBCUO5KIloh6QP973TRdlN30+7XbaNpSbI8O78R9b8wSHETFFzD8l\nCfbY3Jfu/BQ9AYAERdF4dxPEr6cy7VkXXvJi9YKqwxUTEkXbSZfIsisb/EO8\nYND8jdlBDbA9OJCRxqu+0nDd+77VHq2+kRxoeVKZJpTpUkytK8OAbYMx9LSp\nglt8QF/okHgn2le9s3EyALOtLTK3TjNI9/5jwPJ1bUVsXFrNPjmqtSAvQk6B\ny1ER\r\n=65m4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDRWyrK4M5apXzVsguBqha6ps3xP0D87gU5z1u53lPLeQIgOhlftDOcAMcjFluyU8Cu1QQuqQXxiEFfwjjXCkiEuX4="}]},"maintainers":[{"name":"ineo6","email":"arklove@qq.com"},{"name":"xiaowanzi12","email":"xiaowanzi1226@qq.com"},{"name":"yangtuan2010","email":"yangtuan2009@126.com"},{"name":"ypeng1991","email":"yipeng@unovo.com.cn"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.1.4_1556531887739_0.2729142876262043"},"_hasShrinkwrap":false},"0.1.5":{"name":"@unovo/taro-component","version":"0.1.5","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.26","@tarojs/components":"1.2.26","@tarojs/rn-runner":"1.2.26","@tarojs/router":"1.2.26","@tarojs/taro":"1.2.26","@tarojs/taro-alipay":"1.2.26","@tarojs/taro-h5":"1.2.26","@tarojs/taro-swan":"1.2.26","@tarojs/taro-tt":"1.2.26","@tarojs/taro-weapp":"1.2.26","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.26","@tarojs/plugin-csso":"1.2.26","@tarojs/plugin-less":"1.2.26","@tarojs/plugin-sass":"1.2.26","@tarojs/plugin-uglifyjs":"1.2.26","@tarojs/webpack-runner":"1.2.26","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.26","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.26","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"d61189afad799dac312bc0a7e2c47a0b7a60a167","_id":"@unovo/taro-component@0.1.5","_npmVersion":"6.4.1","_nodeVersion":"10.15.3","_npmUser":{"name":"yangtuan2010","email":"yangtuan2009@126.com"},"dist":{"integrity":"sha512-l6ZhQ7MUdIiud510UzrBIAVyKdmSyx7Rm7zrMvqxAb8+Hh+Ow1QU6jMGMKkQ7Wvzt/YKUmybgjbp8aSOmJNlAQ==","shasum":"101bb926e74fbe88973e79f351fd766b80496af3","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.1.5.tgz","fileCount":57,"unpackedSize":422954,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc75LTCRA9TVsSAnZWagAAGXAP+wUmcxyeAgNfzFsyXU7g\na600gpFH8EfurgQ7qp2mfs5JAjfXOSXHp37qBZiI/1WyMqdJsFCupkzZFbXo\nIa+J0GHfBToXJBGiQpy6wH5pgZqBdnBnol8CZYIvTUsok8mbAP1/QPwgAycL\nbDyI+UbwiNhuIvnTw92d4rjJut0Wu6VFrWh6MC/7//Qe9jAU9KV3Sduv5M1B\nvGL+vZJn0FMha0nBdajbZ1Lc7NUa5whl5/dJi+hKSkhaF/FnyaKvFJ3g6isc\nS9GKgIhz5YKyEoQt317OIm5XYCB7APIf7JxwvOBxED+rsUhNKr2mbdVUDQ/x\ndRJP6btejki5sZDhuzXw4U+ecHnmYUoXln55s+FNro/Nzkj4AuJHPOHQs+ve\nrXeY/7kZBR1vUyQUgjJTtfKMQgWND3ZIW3Mk1obamlKlFVm69BctQW8O++FH\nShSigPGCuCFAYWx24O82CKzFAde/wLUfY7y/GumpkSX5o7EoNxlreEt0FOB+\nCB0bo57vf9bMlbmzdubn6LW8sskrK/+h8LUN+N9yIVU1qPFqEHiN6MLJC32v\nZkm1UVx9FWeFLw7K0BnwqYzV2l9QsJIg/n5X6NPB19bodGkJE5NMSsPdkHqu\n4Q+A0eYJdfPFkNvw4lMMvikzqoGvHk/ua6wEm6y6+G4J7UfpBJw5m2ChnP35\nImc+\r\n=eoqg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCDT74YJoUFIgcdTyV1AfMzLUYqcWMoUx59yA22mQ4F1wIgRkkTa3fglFPQcSMRBKzy92FsblRZA2QS4o5SW5RLiQk="}]},"maintainers":[{"email":"arklove@qq.com","name":"ineo6"},{"email":"xiaowanzi1226@qq.com","name":"xiaowanzi12"},{"email":"yangtuan2009@126.com","name":"yangtuan2010"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.1.5_1559204562287_0.2536081157962151"},"_hasShrinkwrap":false},"0.1.6":{"name":"@unovo/taro-component","version":"0.1.6","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.26","@tarojs/components":"1.2.26","@tarojs/rn-runner":"1.2.26","@tarojs/router":"1.2.26","@tarojs/taro":"1.2.26","@tarojs/taro-alipay":"1.2.26","@tarojs/taro-h5":"1.2.26","@tarojs/taro-swan":"1.2.26","@tarojs/taro-tt":"1.2.26","@tarojs/taro-weapp":"1.2.26","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.26","@tarojs/plugin-csso":"1.2.26","@tarojs/plugin-less":"1.2.26","@tarojs/plugin-sass":"1.2.26","@tarojs/plugin-uglifyjs":"1.2.26","@tarojs/webpack-runner":"1.2.26","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.26","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.26","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"25479c2af24f89e7b2450a9099fc2875f089ef12","_id":"@unovo/taro-component@0.1.6","_npmVersion":"6.4.1","_nodeVersion":"10.15.3","_npmUser":{"name":"yangtuan2010","email":"yangtuan2009@126.com"},"dist":{"integrity":"sha512-rhJRBYP1iWENFk9C1015Juzg3LxQ5JxVcIkUzKJPpSTC807v3Yg+5FukxvjNQFGkYLPyYISZmP/TUoGCZ3VPoA==","shasum":"f54c9bbc98b2e31378fd74d6ba0fa065b6656bee","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.1.6.tgz","fileCount":57,"unpackedSize":423339,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHbpJCRA9TVsSAnZWagAAxmUP/RdmLa7c++FiEg6jRKmu\nkzjCyzVCANZw4wQ1YeF8OmL9cPJGsTwHx1BBLRpLiW26rW66cRmxLO6T3ydZ\nS+EO6qe6QziA9dfURZghpC/NAjOpA6Cd/EE6mak04aBXbnBKXy4wguM/VkDC\nOIqdgcrpQecTRzFAi5L1lTdq6jKQysIK49NIGcQnDQMTEMj4944Lyu1DeOkr\ngJz5cTQqGUvUkPVjh5UDVryl+A7eGiB0Z5j2wFuj0PDrdeGozycx0w0riNTX\nSaZnqloFCYjji4ZHfkiyNTxwTOkdE/OHgZ+YFz3AKTRvVwQ5NKSIIxLUxwG0\nbJQkV/WNW/INtpQjXTU2GF/LjH/0UB42BGeJ1/80deGzkip1klqcJaa6i3UC\nj/oOg5mMkYm3UACYdV8mDsDayebCEYNJVILpOtaAancPCsoGCqUiOr2VUJlh\n/1Xrn2F4hxwVZaOHzyR95di7PxHBXVopTGL3pzl7ilkAZ+0JdBomGAqs7Qt8\nOiHLT8Ok7kl+0r+J8lmuAMwerxiYYPJ5sdsudjHWTgY7RV/1y4bXMEHsNwvm\n2agrsNGEEzlyXGkTbFSEdWAYX7JKcPpr+ixOZ2E7Uf+u+Ep04lZsPrUW7gP5\nWRT8t9Apsn8Xoe6YYRNXaZ5D83/z+GHsuwjPMRjbkt9ImSgr/gmRkTYBDfpl\nlNqB\r\n=aybf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC0zQ0UPXPK2XXngpSjr8XSSHPtaB8p9H2U1K7ztrI1EgIgMEvpAbfjDQj4ZTuhuf0vjutQIDY7to32BiJZUGHYqQU="}]},"maintainers":[{"email":"arklove@qq.com","name":"ineo6"},{"email":"xiaowanzi1226@qq.com","name":"xiaowanzi12"},{"email":"yangtuan2009@126.com","name":"yangtuan2010"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.1.6_1562229320579_0.027452824404240905"},"_hasShrinkwrap":false},"0.1.7":{"name":"@unovo/taro-component","version":"0.1.7","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.26","@tarojs/components":"1.2.26","@tarojs/rn-runner":"1.2.26","@tarojs/router":"1.2.26","@tarojs/taro":"1.2.26","@tarojs/taro-alipay":"1.2.26","@tarojs/taro-h5":"1.2.26","@tarojs/taro-swan":"1.2.26","@tarojs/taro-tt":"1.2.26","@tarojs/taro-weapp":"1.2.26","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.26","@tarojs/plugin-csso":"1.2.26","@tarojs/plugin-less":"1.2.26","@tarojs/plugin-sass":"1.2.26","@tarojs/plugin-uglifyjs":"1.2.26","@tarojs/webpack-runner":"1.2.26","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.26","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.26","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"4f801b9869ba3b75360c5c80453f36e76eb7ff5a","_id":"@unovo/taro-component@0.1.7","_npmVersion":"6.4.1","_nodeVersion":"10.15.3","_npmUser":{"name":"yangtuan2010","email":"yangtuan2009@126.com"},"dist":{"integrity":"sha512-T6eDYYgH2ASSPWVfenGT/4Xbbr4P0DdWURTCs9fSNRfoarN0SxV/hHfuUgY4bshoUKBZGOoIDQC3LQGEjDHEUA==","shasum":"558d08200deac66bffda5021000d579e2c80bc68","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.1.7.tgz","fileCount":59,"unpackedSize":424818,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSQ82CRA9TVsSAnZWagAAZ/IP/j3+Gb5YLH3iuFerrUus\nf65P0gczsSa1lfD3oBlkdfqePSDUnTXfgI+gF4Be+WBa15Wkp1UfVCfX1uDG\n721Ffuy0rvpyepxqtylj+DcZ5jB8rgmz+WhzBX+ZSIiTd4uOh7GCkoLsr9TQ\nxS4SwLqx3o1aREnCwOZl5iT9oCP6fWkIUq6PSPRJLw92kJ75u01Le22DQeX0\nFajtnc2w2AYxlaeqJyz6cTYX9aCEGolszdMAuQezg1OH0DdYWVpnRPYmaxI8\nj0N51l9SNBCqf4PUOMhcxDW5fak+37H13BCIR0zq0BcJLcb1fR8bkH0Tu4Ge\nhAOq78llxavBgNfsKWctjNj1IsNmobI+kc7BeGOoXGVaQLcUzrXykWGthT19\nmiYFJSGjQHnDG1cBHJfdUXp2k7K6Ot3tmwfd4NUjv8kpHGlb/tYFXgKybEuJ\nemBxv8vimyxTYJbtLId01fhWh0MJ6+Ffn9FAWFkSWcgtQpwBYzfev06XCIpw\n8JhjAv9AlcDG7J6u+8gC/LyhpDCjWmnx99wxz80dl0AMY/oTnAox46b8tRhZ\nARLVTn1NQYbxCyzvJaBc8MICU6+3lPxQ/jo991yd33Uq9/Xv+NIEQ2nDBh1n\nQtS35e8z7BHNW+SNokgHGD8hlxxckktz/9wOKXSWCukFAv4RW+5bnlxx0Fje\nedsX\r\n=03nD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICvwaRw4fTRWMK+wqyiODQ5um5rQqci87ZbZHIr8PHZfAiEAtKUjvcgXVEjwN3f5lUxhu72yxECO8pByWVk+2gyjruM="}]},"maintainers":[{"email":"arklove@qq.com","name":"ineo6"},{"email":"xiaowanzi1226@qq.com","name":"xiaowanzi12"},{"email":"yangtuan2009@126.com","name":"yangtuan2010"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.1.7_1565069109934_0.6582644058487956"},"_hasShrinkwrap":false},"0.1.8":{"name":"@unovo/taro-component","version":"0.1.8","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.26","@tarojs/components":"1.2.26","@tarojs/rn-runner":"1.2.26","@tarojs/router":"1.2.26","@tarojs/taro":"1.2.26","@tarojs/taro-alipay":"1.2.26","@tarojs/taro-h5":"1.2.26","@tarojs/taro-swan":"1.2.26","@tarojs/taro-tt":"1.2.26","@tarojs/taro-weapp":"1.2.26","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.26","@tarojs/plugin-csso":"1.2.26","@tarojs/plugin-less":"1.2.26","@tarojs/plugin-sass":"1.2.26","@tarojs/plugin-uglifyjs":"1.2.26","@tarojs/webpack-runner":"1.2.26","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.26","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.26","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"c0dc875b578107824810b8f8a13a20f8d67e1493","_id":"@unovo/taro-component@0.1.8","_npmVersion":"6.4.1","_nodeVersion":"10.15.3","_npmUser":{"name":"yangtuan2010","email":"yangtuan2009@126.com"},"dist":{"integrity":"sha512-jMLlqX9bqf5Q5BXdvuEfcd0Nqg6fi/ARY62i6iVrLD7olyiDHIaDB+JnZPLOlwhVSuTJI28Fb1zOxdv5xhBgSQ==","shasum":"b535d588698be2f15c00b79608e209c6242e86c4","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.1.8.tgz","fileCount":59,"unpackedSize":425984,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdURG9CRA9TVsSAnZWagAAirIP/jcA9XfBTOEaarp39Gq0\n3Jiwdbs9R7MIMp6GoiIWhpJaklLVqUej1C2df7t9XlnDq7JEISVHHsmUAXHb\nqX10ljh4WKapc2wOFjo2eNtPi9gzepFOfZe4BYuZPtD7LpnkZtHNwwkgqZEo\n+XMQ0GdlXaZDy+3PfMnS1r4woOhFXfJykUsiMLJeSsSw23blgynh3cqVpTav\nL17bsPC/zhzMfjeHxwKpX8ADdnGJJygIG8DsYU3mA+JrsptC+c6QCt9vizBk\ncgmlUPPpfc6ENV0ivbcQFyyzRBk4U8JFKYHd7Qjqwru+b/g2+s5jrpDrDKMw\n85rwFJZbPXW0NF93U5yK1p2TrFHhTPHMrOyu1Vj7Og/rSxwAp2Jbnay9T2qp\nUELrxkJrHTVbfWhXe922Mi81ZxXxok6j3rlh/wdPbeKOALBc9lKTLZWo2dGI\nfdimKiO8i0oMhcEUa89ntB23QuY2p17k6tJK6kaQpwAJm5PxrqUbCDMt0Mfh\nh9S2O1rbtPMZIAPWnadEkFQcoVq3hTEwNT9uu+4fstwh7lTk4JJAgYf6TNgQ\nzb68UALNq96zBWCWR23c+1dr3w2EXE1DVFgv9c350QjgsAJK9AaiB1pVIEjI\nTkHxqUm9bktBgCA2ZGQ50nXXYb8+qv/lbUcqFv/aLM9lg7Tfsws2HxASIgHE\nkfRQ\r\n=5rqR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDIAj3cwwU56d6bSu9KLaxx/W99YWWVh+P3xvmyq7kTrgIgbiQx20gu5Y/YR3RtfHrLUQLljSSDXpEEhau2xckWGKQ="}]},"maintainers":[{"email":"arklove@qq.com","name":"ineo6"},{"email":"xiaowanzi1226@qq.com","name":"xiaowanzi12"},{"email":"yangtuan2009@126.com","name":"yangtuan2010"},{"email":"keep_rock@163.com","name":"yuxiaoqinglan"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.1.8_1565594045263_0.6299728013326082"},"_hasShrinkwrap":false},"0.2.0":{"name":"@unovo/taro-component","version":"0.2.0","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.26","@tarojs/components":"1.2.26","@tarojs/rn-runner":"1.2.26","@tarojs/router":"1.2.26","@tarojs/taro":"1.2.26","@tarojs/taro-alipay":"1.2.26","@tarojs/taro-h5":"1.2.26","@tarojs/taro-swan":"1.2.26","@tarojs/taro-tt":"1.2.26","@tarojs/taro-weapp":"1.2.26","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.26","@tarojs/plugin-csso":"1.2.26","@tarojs/plugin-less":"1.2.26","@tarojs/plugin-sass":"1.2.26","@tarojs/plugin-uglifyjs":"1.2.26","@tarojs/webpack-runner":"1.2.26","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.26","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.26","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"f492ba0289263a386de1166127084f3591a10404","_id":"@unovo/taro-component@0.2.0","_npmVersion":"6.4.1","_nodeVersion":"10.15.3","_npmUser":{"name":"yangtuan2010","email":"yangtuan2009@126.com"},"dist":{"integrity":"sha512-4QlrOYWitsOcgyx1hIf6L83A1EHKDN/p5S1CTkRw5dE/lSnbM10l+yoAV8jzwthYzURkVfiUVJZSlnVkKgbngA==","shasum":"654816e1f562d76a434529406128cd1be535f53a","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.2.0.tgz","fileCount":59,"unpackedSize":427408,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUntGCRA9TVsSAnZWagAA5QgQAIRxZCyGnsEcxNR9KAcv\nzRPwJRS69Wi1JfvzLxluo5QccfpU0poM4pONZohRPX5vt65MnD7xEfm4WfhL\njafLTKx6UHYbScPPtC3cGpKerRuZ9EQGVEmvlk6kQ2b2ISB7kSZu8jyucRXT\nvsHXmnHqnHzn6we4k9cSgY0I2HpMDVD7JRrlfbJ1L70EWSCyi6bELc+M4XmR\nBvtazRKjkjp21rcGoaU0V1Vg8DPfg5AAegZB+gtkHUjCKjNhmyECCHaI9oSE\nd1Ke1KtkPHd1uQCKq4h6pz3/Ug/YmxX5kJ79PrTV8cujEVjwGqvM5UrTpnZ8\nb77wo2KH2HSNjyZEEBcHhfIoJs2zmKcsU/0DFWkB2j15PEh2gtD8ntj/0C3O\nYzSx+TvAEswCCJUh/sGTQTpzkAdblISZH6NJVBk+CcNri5F5wopaT3tZO2XA\nrZNvMdJTbQIRpTtrPJyXrPuiti225pZbuDgLOJjnR0Mcw/Qsa33ssi3EF/Bu\neUBsXZpwGnsFYWu6qYloYc5cNSdwrSuxSKeNhGb9huHGiX863e3rLTUznfn4\n5BGQXASNuAKd2qhl0HuUrQzg/9CkoOGzdtDBMVrZqJTtwgZk+c5aYIhWjVd0\nvXGvzbtNHlY91+tLhBnqNrf8Fmxx0Fv92FPWp7e0O7MfOoFEiIqh0ai4R6N/\neAxz\r\n=jxQm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH4KJGoyQANyCOhgPUD7l9TLu4SwxNmaFb1zWGe7acmiAiEAuZ8TM0xTyWkOXpy6K8c0WW4Sxgr7GBESMH0vSM7T5yQ="}]},"maintainers":[{"email":"arklove@qq.com","name":"ineo6"},{"email":"xiaowanzi1226@qq.com","name":"xiaowanzi12"},{"email":"yangtuan2009@126.com","name":"yangtuan2010"},{"email":"keep_rock@163.com","name":"yuxiaoqinglan"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.2.0_1565686598162_0.5981321220545266"},"_hasShrinkwrap":false},"0.2.1":{"name":"@unovo/taro-component","version":"0.2.1","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.26","@tarojs/components":"1.2.26","@tarojs/rn-runner":"1.2.26","@tarojs/router":"1.2.26","@tarojs/taro":"1.2.26","@tarojs/taro-alipay":"1.2.26","@tarojs/taro-h5":"1.2.26","@tarojs/taro-swan":"1.2.26","@tarojs/taro-tt":"1.2.26","@tarojs/taro-weapp":"1.2.26","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.26","@tarojs/plugin-csso":"1.2.26","@tarojs/plugin-less":"1.2.26","@tarojs/plugin-sass":"1.2.26","@tarojs/plugin-uglifyjs":"1.2.26","@tarojs/webpack-runner":"1.2.26","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.26","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.26","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"d73e14cc5b5532ad59e76eb618cbf7a91d88e5dc","_id":"@unovo/taro-component@0.2.1","_npmVersion":"6.4.1","_nodeVersion":"10.15.3","_npmUser":{"name":"yangtuan2010","email":"yangtuan2009@126.com"},"dist":{"integrity":"sha512-QwpWcI6M7pCOHwlBc50ZYbwGNt3eM7irFcQPENC8Ng/a/6sU9UgShbKiWeexbEYBAsMSs7cAc/xUWe6zEJ6x6A==","shasum":"ca91ae77b207e4ad9ae982e45e758249410c91f7","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.2.1.tgz","fileCount":59,"unpackedSize":427718,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUoVSCRA9TVsSAnZWagAATXAP/2buo+TBZmOOZaRnEgAF\nv+mRqA/sCqc4v/eQjxfAPRf0XIlD/0CYuFl+qLZJ0y/8aQw8P+pwk2+vj3wC\n0W172/7KTjq1UYGPGYNz7AJLE2CyWra4b8kH3L8kjK/08kKgrEIlQGwgaUYQ\nd6N1yYJ4lIhWlRSaWIrFroop3JlmL/Az0NAjyHMwDxdKebTnXs3tQmSzNxJz\njiRS9jveFkcfk55A6YkzLNBRpUJfK37y+H7cYHbYbn7KhQT1GWLfIIQ2FvWH\nW4QgMxVwRvqOA+Mz+rZTFI8V9U8mElRhW3OIrUHIvkpY5SHyYklF18PQ1CZO\nb9vg4XASYKOShKq6cqErWebQc56kVtbWfAFY3uOSpTWu8HFun47YsHR66D2+\nZTgOczxQpQWY6mXxKjieJxjLzsSzg8x+2wMwjiTS9ziIUaepCCzcTL+HmMYr\n+H8uzNAhoCt3tYmhqI8Zhhpe00Gbx9Ns26hW40IaBClUuGgjRwWOkXG/6gjK\nQqPCpR+MGennFGtgkINpi2qSr7CPcY8+9tIzZmbSWtjDaXr5/WTB2JToT7S/\nfI0ofvfLTS69K++DUQyEIT+sffiWTrVQ5NPzSzZraM6x69yMapg7ftxOgrZQ\nOPBrTjxcJ2mUqgDP6y86eIfQPlOvCoFA3fXySHil/oIsIXfmyn4XmDOBPtQV\nPD+f\r\n=GOpD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGdw3ZTNkhOzkGc42tOyDZJoJzZSpbP6U4SztHTf6bihAiEA1K2v7PcN8zbDMikIjGWZionpIhTiI0C65SqUdGk8afM="}]},"maintainers":[{"email":"arklove@qq.com","name":"ineo6"},{"email":"xiaowanzi1226@qq.com","name":"xiaowanzi12"},{"email":"yangtuan2009@126.com","name":"yangtuan2010"},{"email":"keep_rock@163.com","name":"yuxiaoqinglan"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.2.1_1565689170035_0.04015315546910392"},"_hasShrinkwrap":false},"0.2.2":{"name":"@unovo/taro-component","version":"0.2.2","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.26","@tarojs/components":"1.2.26","@tarojs/rn-runner":"1.2.26","@tarojs/router":"1.2.26","@tarojs/taro":"1.2.26","@tarojs/taro-alipay":"1.2.26","@tarojs/taro-h5":"1.2.26","@tarojs/taro-swan":"1.2.26","@tarojs/taro-tt":"1.2.26","@tarojs/taro-weapp":"1.2.26","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.26","@tarojs/plugin-csso":"1.2.26","@tarojs/plugin-less":"1.2.26","@tarojs/plugin-sass":"1.2.26","@tarojs/plugin-uglifyjs":"1.2.26","@tarojs/webpack-runner":"1.2.26","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.26","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.26","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"0efb72eb7377ea0ff24b1e23e2d72fbf5ed552a7","_id":"@unovo/taro-component@0.2.2","_npmVersion":"6.4.1","_nodeVersion":"10.15.3","_npmUser":{"name":"yangtuan2010","email":"yangtuan2009@126.com"},"dist":{"integrity":"sha512-lVdJfK8z6qE+ZuxPiEaWJBilfEAlt1onU3gstAt4daFeulliXWPF1+eH+msIiPxu+Qvtoz1tVvtFSi59Oom32Q==","shasum":"390239ce8b9953b38d2d74a7824e7e0bc496bdc1","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.2.2.tgz","fileCount":59,"unpackedSize":427774,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUozICRA9TVsSAnZWagAAQJ4P/2As68Ha7q4r8jwURRco\ngyg6hKY6DZPK1YwOC99cWwm0cqe9c3Qy5Lvx2F03wijnKTkHveTvzKQFIx8Q\nzzKxeEEC/9caOMKLwen5RiYVRhYPE6OnLTMajp9RD0qOnvSOUlxy1mn1C7P7\nJ3VpLOgBoVNAHLUo5jhIxlWQ07OCfVpubw4z/8dVgmHUzVVbqFuYC0YmOth9\nAgtcbmpENQOJ6013+H8Sn2JPT9ovEe21FqeakAUBkGvV05rd4uJgt+U44c45\n4ajkhkiOg4l2698wBcuMIaFVfcV/00qCRJ6gv4x8lycOM223bsyywuiPAMqv\n2zBCSohvadbrjYm8Y2fdYtYs2d9Nik9MoUOwu2SocgH1V0MBa+styItgtae7\n/M7mATkwj2fx8fRYERykayqj3wDmtrHbe8hOoG6d9BKbQ9moPkyrAivI+4h0\nLYkBoe0B5d0qEvm4b/STIHfRP5FOBBX+egVX6Im8JbkBwuCqZvr4l7GnLveW\n8NNctAokzTQfItxchW9ZJ0cgxJYLRUALTDesz1a9iyIaUtJg3RxO5ACXJAUj\nwAwVaBeyhLrOxz/+CzjFbdn73rRR1nLkKXm9DJXw5Mf+sk0wyyZOE+V4Fg1r\n2AyT+8buC0aPdhCx36ryTxUwYlB4NXjbTbjAr+wvJScq+2PBlak7OP9lsp0b\n2pSH\r\n=6bmA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICv7HmFLeOaEozNDKyoFUwxt22HVwXmmJDv1RV8Paau4AiEA0QQTPItiPzOyqim0d27kmP1RBhy/aFoChGwrcedFO8g="}]},"maintainers":[{"email":"arklove@qq.com","name":"ineo6"},{"email":"xiaowanzi1226@qq.com","name":"xiaowanzi12"},{"email":"yangtuan2009@126.com","name":"yangtuan2010"},{"email":"keep_rock@163.com","name":"yuxiaoqinglan"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.2.2_1565691079994_0.7816726434655037"},"_hasShrinkwrap":false},"0.2.3":{"name":"@unovo/taro-component","version":"0.2.3","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.26","@tarojs/components":"1.2.26","@tarojs/rn-runner":"1.2.26","@tarojs/router":"1.2.26","@tarojs/taro":"1.2.26","@tarojs/taro-alipay":"1.2.26","@tarojs/taro-h5":"1.2.26","@tarojs/taro-swan":"1.2.26","@tarojs/taro-tt":"1.2.26","@tarojs/taro-weapp":"1.2.26","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.26","@tarojs/plugin-csso":"1.2.26","@tarojs/plugin-less":"1.2.26","@tarojs/plugin-sass":"1.2.26","@tarojs/plugin-uglifyjs":"1.2.26","@tarojs/webpack-runner":"1.2.26","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.26","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.26","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"cc1651ffd1100fb2efa16ad0e7234e8cb08d21a6","_id":"@unovo/taro-component@0.2.3","_npmVersion":"6.4.1","_nodeVersion":"10.15.3","_npmUser":{"name":"yangtuan2010","email":"yangtuan2009@126.com"},"dist":{"integrity":"sha512-P7wRXP1MvbqFua6U5fpLvIpHS12/xItw32iveTT+mXuT1KRAP9B6RlJRAIduCyVmhco3PQpGgdnFEKibaZl9zA==","shasum":"1904aafd0f519dd762379287e518f12c3b54e3ac","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.2.3.tgz","fileCount":59,"unpackedSize":427849,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdU3y4CRA9TVsSAnZWagAAO6cQAJkVbK0FSILREWQAC71W\nU5bgrizSHf1dkSlWpxlYdXQZrmCeDPL6kUTYT4YFMtd46wOG58wldM1O0cET\naKsQAGnRvJzMM4mE9cCNhwQ5K0rR4OmX9uohYLVV84uKCG55cxDAozCMcMAo\nSKq0L43aGoSZ2K2TmAUXYUSE35NCJZAa6VoOeXAJ/dyzvCzIubl28ZDo061P\nOs9ephmU3HzYLbekIcEbpEHToH/H8+tvP4M0iTNv2tF0p/j1djYS9sJdLJxy\n838uwExFBvkp4zV2TUpJ2+J6kPhNWNj9I1gMTiKQGEhtS9zeswOAIv8+LdZy\nIZjlbDVb9bkt1k8VEka5ppzGDhH+YUBY/m2wtRm+TlC1rhigygjcMHtwGEPH\ngbkym1JLu6TUSbu42qTeIavkow0PHyndklA8f0ZmNDuVF6LxZqhM/RyIjcug\npUBNs9tFp43Sw8B9Bgu2N+iUtjdjsP0bbm5MUQkLkrv1o+I8phYx2OKvaPpV\nLqlfPjlH6faVYmOX5ZUEzQyZfXFiFYDhZx2c9/hYE2cTyunbZdnuW2YxqoOa\nEEQNZebsm0zntMh6K0FcZJITNcsX8/Hehaf278Ldp/n80PV0cZxfgJNvNofA\n0QHWIyX8rWm9B5YeNvgUzzAv4s22lpOBhXdpGvwlgSjwUdcf02PJkbc2mXc+\nUXye\r\n=O0hI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHR1wlqsSGjg8GuhNMYJEzlOP+sV2S1SYYYmMmt7swzbAiEAm0ktwpQngZ7MiEXchPcCFnywJC45tYNVd0KYPNuSgTw="}]},"maintainers":[{"email":"arklove@qq.com","name":"ineo6"},{"email":"xiaowanzi1226@qq.com","name":"xiaowanzi12"},{"email":"yangtuan2009@126.com","name":"yangtuan2010"},{"email":"keep_rock@163.com","name":"yuxiaoqinglan"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.2.3_1565752503100_0.5567428286686944"},"_hasShrinkwrap":false},"0.2.4":{"name":"@unovo/taro-component","version":"0.2.4","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.26","@tarojs/components":"1.2.26","@tarojs/rn-runner":"1.2.26","@tarojs/router":"1.2.26","@tarojs/taro":"1.2.26","@tarojs/taro-alipay":"1.2.26","@tarojs/taro-h5":"1.2.26","@tarojs/taro-swan":"1.2.26","@tarojs/taro-tt":"1.2.26","@tarojs/taro-weapp":"1.2.26","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.26","@tarojs/plugin-csso":"1.2.26","@tarojs/plugin-less":"1.2.26","@tarojs/plugin-sass":"1.2.26","@tarojs/plugin-uglifyjs":"1.2.26","@tarojs/webpack-runner":"1.2.26","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.26","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.26","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"e2c4f005305a15a7ecf03a5d267afd0f91c09f1c","_id":"@unovo/taro-component@0.2.4","_npmVersion":"6.4.1","_nodeVersion":"10.15.3","_npmUser":{"name":"yangtuan2010","email":"yangtuan2009@126.com"},"dist":{"integrity":"sha512-30EqF4UXEtW3ai5G/NPCBSyaJ1vTMYD+TlQmMj8zo7QqLwIkI4HKPrOKTGomGwdaNIZUfY8rZvISvmoeQEgoyA==","shasum":"2af8409e967f060880925a9d8ca95a812c8eed0f","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.2.4.tgz","fileCount":59,"unpackedSize":428020,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdViGICRA9TVsSAnZWagAA9H8P/A3ZkBDpF5mdLknApaVp\nPSjy5DJ4g+ZiW45bQi3WPG2zWQQMhLPLa4WUxXECZtI2C2jxDNNXQbibCRY0\nYl2iCDajUBB8SJ2f7bfhxJHuKeCZ9/TIRXqhPWiGPyGySrwwEoOs+ZQTyH/S\nStaHQcVScqGjBQv5VPcp/gLWB3WNfB1Vv+6hG3QFgbRaHRxoqTUs/XIbnzSm\nnmOwKYcLKDMlwypNdbxm1xOA6rJeOcySvG7t9JHJgPDgGS4keTTylgb07S4R\nkY3pbssZ6ThkxXpLZ2Nqzu+jFvOsx1uOiXWjN0pMeSwaLskAYU5KLCfZ74id\nXoQpCx194JmvpHd1E2W8R0rcuk+WGfELf4u2VBHieucFpxVO75BB1/X6xiko\nnDBcGsmYW6WLJNRjj1wJyddDSgPZ4Mncu3Y7PQigRzRuz1q4A9kI7to7xB0A\nQ/zlnq5ECR9BGArIw1s/x6LSAIWJYs9zaORgpXhWNpmxLqyZmBJUckl8af8w\nfVVzGnxhWcCGcdOtSJNBNBPigUj9ZjBeYZ3txUKUg9j66/6Yba+uX86w7DTd\nInu8rbW9N5bJQCo14mdMEcz1zn6Knf7LcR6fMPbQIbK3CfH+upI4+L74KK3X\nFlql3DsEABhzXK+oDwf/pgO4Xe9LLR2Tvh1PdtHHQjMQqkFCNKXfecQmvCww\n71jA\r\n=i9ma\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDuEb01RRPA2aECebAFjjEC1P/wLPSz3FOGCHvjQvxDJAiBRWJWEI8bCJfQgOAQpJ0fqK7mEdYUXpcxgKmBZenmhSg=="}]},"maintainers":[{"email":"arklove@qq.com","name":"ineo6"},{"email":"xiaowanzi1226@qq.com","name":"xiaowanzi12"},{"email":"yangtuan2009@126.com","name":"yangtuan2010"},{"email":"keep_rock@163.com","name":"yuxiaoqinglan"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.2.4_1565925767230_0.5935300111522235"},"_hasShrinkwrap":false},"0.2.5":{"name":"@unovo/taro-component","version":"0.2.5","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.26","@tarojs/components":"1.2.26","@tarojs/rn-runner":"1.2.26","@tarojs/router":"1.2.26","@tarojs/taro":"1.2.26","@tarojs/taro-alipay":"1.2.26","@tarojs/taro-h5":"1.2.26","@tarojs/taro-swan":"1.2.26","@tarojs/taro-tt":"1.2.26","@tarojs/taro-weapp":"1.2.26","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.26","@tarojs/plugin-csso":"1.2.26","@tarojs/plugin-less":"1.2.26","@tarojs/plugin-sass":"1.2.26","@tarojs/plugin-uglifyjs":"1.2.26","@tarojs/webpack-runner":"1.2.26","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.26","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.26","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"89a78f9d002f4c499568806d4845bd64a2a37971","_id":"@unovo/taro-component@0.2.5","_npmVersion":"6.1.0","_nodeVersion":"10.4.0","_npmUser":{"name":"xiaowanzi12","email":"xiaowanzi1226@qq.com"},"dist":{"integrity":"sha512-/pIwY5ufEcPStR0gXWrnz5qNNFhQfwxQa/qz5yGkMykb423dHtDD6WBGZa2A253ejSOX7HA905C2lpMmS2fa2A==","shasum":"e27a6dbf33351a8a018307bd60fa8555f9ebd82a","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.2.5.tgz","fileCount":59,"unpackedSize":428012,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdi0aHCRA9TVsSAnZWagAA8g0P/20yJ5slFrPb8TTulQ0D\ninGxg9vVvDfpRnT/cp+af5Oyzvz0lljSa3ubCesxeSED9oNQPre7KIQe5iRF\n+3LrQgY0bY2UJQDNoYcyIwuLy4o01owDByTMpKjHZXfHJ5tSeJa8WLWuAZl8\nXBkmFr8lKVjyUx3SE7X7qL9rXxGsEY7VVqS16exR2mBd+HpwzbJHmo02+0fH\nLtCo7P8e9CrguMNEuXcHnkk/tchqIVcHYS1nIzhq0hXp3k/KVfG1rKCBrbr3\n024c7JQmb41wxNPANsLEbwJEFG1VOxizyzceBLB0Rw80U8JuPhWGOwYJXodF\nVWA1DzjmNYI6chLbgi+GUaRqAXa3nt4azdCgTnLAUOUyhVH1mU63xtChfwA+\nPdwkYemwQz+NJXshTUp5gpqIONmtx46VKEddpheOvnZYmY0HvP65rOm5Q+mU\nmlnhO3mrS+ZfCVEPyfc1uJb62jXoOovW4eUkpLYO+g5POIFxc9Nu0Ijh14Lf\n2s54dtN0wfaMy40AcpPqcK9lXEmcmHYu4qnSGmaSCotVvXyHwwS1a3F8Pn9+\ngUOI77jhenmu/CCF+DXWwV+t7V1B0ceX2UHPdSrhNgOWTmOZEib0mrHcDIqI\njww1aIVMFXwQGmnI7hqoSwOlkBknmAIf3CZqy1K5bedsxtGq+NCari25s+rF\nEYKz\r\n=d+me\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICZVbvGIvDgNA/uS0ZowiF+izv6JHqq8LBZNztnGFhNDAiB1kBJdJ05hvlUK4lzJurPoxxDowLzBQPLheQNE5lQBIA=="}]},"maintainers":[{"email":"arklove@qq.com","name":"ineo6"},{"email":"xiaowanzi1226@qq.com","name":"xiaowanzi12"},{"email":"yangtuan2009@126.com","name":"yangtuan2010"},{"email":"keep_rock@163.com","name":"yuxiaoqinglan"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.2.5_1569408647363_0.032457111230218105"},"_hasShrinkwrap":false},"0.2.6":{"name":"@unovo/taro-component","version":"0.2.6","description":"基于taro的小程序组件","main":"./src/components/index.js","scripts":{"build":"cross-env NODE_ENV=production PRE_TEST=test npm run build:weapp","prod":"cross-env NODE_ENV=production npm run build:weapp","build:weapp":"taro build --type weapp","build:swan":"taro build --type swan","build:alipay":"taro build --type alipay","build:tt":"taro build --type tt","build:h5":"CLIENT_ENV=h5 taro build --type h5","build:rn":"taro build --type rn","dev":"npm run dev:weapp","dev:weapp":"concurrently \"npm run build:weapp -- --watch\" \"npm run static\"","dev:swan":"npm run build:swan -- --watch","dev:alipay":"npm run build:alipay -- --watch","dev:tt":"npm run build:tt -- --watch","dev:h5":"CLIENT_ENV=h5 npm run build:h5 -- --watch","dev:rn":"npm run build:rn -- --watch","static":"http-server ./public -p 7881 -s","notify":"node ./robot.js","deploy":"mini-deploy"},"repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next","access":"public"},"author":{"name":"unovo"},"license":"MIT","dependencies":{"@tarojs/async-await":"1.2.26","@tarojs/components":"1.2.26","@tarojs/rn-runner":"1.2.26","@tarojs/router":"1.2.26","@tarojs/taro":"1.2.26","@tarojs/taro-alipay":"1.2.26","@tarojs/taro-h5":"1.2.26","@tarojs/taro-swan":"1.2.26","@tarojs/taro-tt":"1.2.26","@tarojs/taro-weapp":"1.2.26","classnames":"^2.2.6","dayjs":"^1.8.9","nerv-devtools":"^1.3.9","nervjs":"^1.3.9","query-string":"^6.2.0","rc-select":"^9.0.2","taro-ui":"^2.0.2","we-validator":"^1.4.2"},"devDependencies":{"@tarojs/plugin-babel":"1.2.26","@tarojs/plugin-csso":"1.2.26","@tarojs/plugin-less":"1.2.26","@tarojs/plugin-sass":"1.2.26","@tarojs/plugin-uglifyjs":"1.2.26","@tarojs/webpack-runner":"1.2.26","@types/react":"^16.4.8","@types/webpack-env":"^1.13.6","babel-eslint":"^8.2.3","babel-plugin-transform-class-properties":"^6.24.1","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-jsx-stylesheet":"^0.6.5","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","concurrently":"^4.1.0","dingding-robot":"^0.3.1","eslint":"^4.19.1","eslint-config-taro":"1.2.26","eslint-plugin-import":"^2.12.0","eslint-plugin-react":"^7.8.2","eslint-plugin-taro":"1.2.26","http-server":"^0.11.1","mini-deploy":"^1.1.1","cross-env":"^5.1.3"},"readme":"# 小程序开发说明\n\n微信小程序 Taro 框架\n\n官方文档：[https://nervjs.github.io/taro/docs/README.html](https://nervjs.github.io/taro/docs/README.html)\n\n## 导航\n\n- [开发基本规范](#开发基本规范)\n  * [目录结构](#目录结构)\n  * [文件命名规则](#文件命名规则)\n- [脚本书写规范](#脚本书写规范)\n  * [组件的自定义事件必须使用 on 前缀](#组件的自定义事件必须使用-on-前缀)\n  * [事件处理函数统一使用 handle 前缀](#事件处理函数统一使用-handle-前缀)\n  * [动态className命名统一采用classnames第三库进行](#动态className命名统一采用classnames第三库进行)\n  * [页面的state声明尽可能添加注释](#页面的state声明尽可能添加注释)\n  * [页面的入口文件统一添加@fileoverview注释内容](#页面的入口文件统一添加@fileoverview注释内容)\n  * [功能脚本的import名称统一使用首字母大写](#功能脚本的import名称统一使用首字母大写)\n  * [import的书写顺序按NPM库、功能脚本、组件、样式依次进行](#import的书写顺序按NPM库、功能脚本、组件、样式依次进行)\n  * [错误提示使用规则](#错误提示使用规则)\n- [开发注意事项](#开发注意事项)\n  * [微信小程序调试需要关闭的项目设置](#微信小程序调试需要关闭的项目设置)\n  * [微信自定义组件的注意事项](#微信自定义组件的注意事项)\n  * [向组件传递jsx内容的props命名必须以render开头](#向组件传递jsx内容的props命名必须以render开头)\n  * [无法使用无状态组件或者jsx定义函数拆分页面模块](#无法使用无状态组件或者jsx定义函数拆分页面模块)\n\n## 开发基本规范\n\n### 目录结构\n\n```html\n├── config                  # 配置目录\n|   ├── dev.js              # 开发时配置\n|   ├── index.js            # 默认配置\n|   └── prod.js             # 打包时配置\n|   |-- env.js              # 环境配置\n|-- dist\n|-- node_modules\n|-- src\n|   |-- actions                 # 接口目录\n|   |   |-- actions.js          # 接口请求的汇总文件\n|   |   |-- request.js          # request请求方法的封装处理\n|   |   |-- requestIntercept.js # request拦截配置\n|   |-- components            # 公共组件目录\n|   |   |-- Comp              # 组件按目录分类存放（同一种类的不同组件建议统一归类）\n|   |   |   |-- index.js      # 组件的入口文件\n|   |   |   |-- index.less    # 组件的样式文件\n|   |   |   |-- README.md     # 组件的说明文档\n|   |   |-- Form              # 表单类组件（组件归类示例目录）\n|   |   |   |-- Field         # 字段输入框（目录）\n|   |   |   |-- FieldGroup    # 字段输入框组（目录）\n|   |-- images                # 图片目录（图片文件必须按目录分类存放）\n|   |   |-- icons             # icon类文件目录\n|   |   |-- xxx               # 其它类型文件目录\n|   |-- pages                 # 页面目录\n|   |   |-- home              # 为每个页面分配一个目录\n|   |   |   |-- modules       # 页面下的子组件\n|   |   |   |   |-- CompA.js\n|   |   |   |-- index.js      # 页面的入口文件\n|   |   |   |-- index.less    # 页面的样式文件\n|   |-- styles                # 样式目录\n|   |   |-- _mixins.less      # 基础的变量、混合声明\n|   |   |-- common.less       # 公共样式\n|   |   |-- icon.less         # 图标字体\n|   |   |-- taro-ui.scss      # 第三方库样式引入\n|   |-- utils                 # 工具函数目录\n|   |   |-- constant.js       # 常量声明\n|   |   |-- util.js           # 工具函数\n|   |   |-- dict.js           # 字典数据\n|   |   |-- globalData.js     # 全局数据管理\n|   |-- app.js                # APP入口文件（等同于原生的app.js、app.json和app.wxss）\n|-- package.json              # 项目的package配置\n|-- project.config.json       # 小程序项目配置，[参见详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html?search-key=%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE)\n```\n\n### 文件命名规则\n\n- **图片文件：**\n\n图片文件统一放置在 `images` 目录下，并按文件夹分类存放，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`images/icon/icon-error.png`、`images/icon/icon-error-large.png`等。\n\n- **公共样式**\n\n公共样式统一放置在 `styles` 目录下，文件统一以小写字母命名，多个单词以横杠(-)连接。\n\n例如：`styles/common.less`、`styles/icon.less`、`styles/taro-ui.less`等。\n\n- **普通脚本:**\n\n普通脚本统一采用 Camel（驼峰式）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`util.js`、`globalData.js`等。\n\n- **页面文件：**\n\n页面文件统一放置在 `pages` 目录下，且统一采用 Camel（驼峰式）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`pages/home/index.js`、`pages/detail/index.js`、`pages/searchResult/index.js`等。\n\n- **页面组件：**\n\n页面中的组件抽离统一放置在页面所在目录的 `modules` 目录下，且统一采用 Pascal（首字母大写）的命名方式，文件以 `.js` 作为扩展名。\n\n例如：`pages/detail/modules/Slider.js`、`pages/detail/modules/Map.js`等。\n\n- **公共组件：**\n\n公共组件统一放置在 `components` 目录下，且统一采用 Pascal（首字母大写）的命名方式按目录进行管理，入口文件以 `index.js` 进行命名。\n\n例如：`components/Panel/index.js`、`components/SearchResult/index.js`、`components/LoadingMore/index.js`等。\n\n## 脚本书写规范\n\n### 组件的自定义事件必须使用 on 前缀\n\n准确的来说，父组件要往子组件传递函数，属性名称必须以 `on` 开头，这是由于微信小程序的组件化实现不能直接传递函数给子组件，在taro中是借助小程序组件的[事件机制](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)来实现这一特性的。\n\n详情请参见 [官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E7%BB%84%E4%BB%B6%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E5%B1%9E%E6%80%A7%E5%90%8D%E4%BB%A5-on-%E5%BC%80%E5%A4%B4) 。\n\n```html\n<LoadMore\n  onComplete={this.handleMoreComplete}\n/>\n```\n\n### 事件处理函数统一使用 handle 前缀\n\n```js\n// 跳转至详情页\nhandleNavToDetail = (id) => {\n  Taro.navigateTo({ url: `/pages/detail/index?id=${id}` })\n}\n```\n\n### 动态className命名统一采用classnames第三库进行\n\n有关 classnames 第三库的使用，请参见它的 [官方Github](https://github.com/JedWatson/classnames)。\n\n```js\n<View\n  className={classnames({\n    'order-list__item': true,\n    'order-list__item--first': index === 0\n  })}\n/>\n```\n\n### 页面的state声明尽可能添加注释\n\n```js\nthis.state = {\n  // 列表数据\n  listData: [],\n  // 头部筛选定位样式\n  listFixedStyle: '',\n  // 工单状态\n  workOrderStatus: '',\n  // 工单记录的数量\n  orderCount: '',\n}\n```\n\n### 页面的入口文件统一添加@fileoverview注释内容\n\n该注释内容主要描述如下信息：\n\n- 该页面时一个什么样的页面\n- 该页面的开发者是谁\n- 该页面url传参是用来干什么的\n\n```js\n/**\n * @fileoverview 工单详情\n * @author 阳团\n *\n * this.$router.params\n * |-- orderId     工单id\n */\n```\n\n### 功能脚本的import名称统一使用首字母大写\n\n```js\nimport Dict from '../../utils/dict'\nimport Util from '../../utils/util'\nimport Actions from '../../actions/actions'\n```\n\n### import的书写顺序按NPM库、功能脚本、组件、样式依次进行\n\n为了便于import导入语句的阅读，不同种类的导入代码之间空一行，示例如下：\n\n```js\n// NPM库\nimport Taro from '@tarojs/taro'\nimport {View} from '@tarojs/components'\nimport classnames from 'classnames'\n\n// 功能脚本\nimport Actions from '../../../actions/actions'\nimport Util from \"../../../utils/util\"\nimport Dict from '../../../utils/dict'\n\n// 组件\nimport ListScrollLoad from \"../../../components/ListScrollLoad/index\"\nimport ListStatus from \"../../../components/ListScrollLoad/ListStatus\"\nimport Field from '../../../components/FormFied/Field'\n\n// 样式\nimport './index.less'\n```\n\n### 错误提示使用规则\n\n表单校验的错误提示，采用顶部通知的形式，我们统一使用 Taro UI 的 [AtMessage 组件](https://taro-ui.aotu.io/#/docs/message)来进行实现。配合WeValidator使用的话详见如下代码所示：\n\n```js\n/**\n * WeValidator全局配置\n */\nimport WeValidator from 'we-validator'\nimport weValidatorRule from './utils/weValidatorRule'\n\n// 表单验证-全局配置\nWeValidator.onMessage = function (data) {\n  Taro.atMessage({\n    type: 'error',\n    message: data.msg,\n    duration: 2000,\n  })\n}\n\n// 表单验证-自定义校验规则\nweValidatorRule(WeValidator)\n```\n\n```js\n/**\n * AtMessage组件的页面配置\n */\n\n// 导入 AtMessage 组件\nimport { AtMessage } from 'taro-ui'\n\n// render函数\nrender() {\n  return (\n    <View>\n      {/* 在render中引入 AtMessage 组件 */}\n      <AtMessage />\n    </View>\n  )\n}\n```\n\n而其它提示，我们统一封装在 `utils/tips.js` 文件里头，使用详情如下：\n\n```js\n// 导入 Tips 封装工具\nimport Tips from '../../utils/tips'\n\n// 一般提示\nTips.info('一般提示')\n\n// 一般提示&隐藏时回调函数\nTips.info('一般提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 成功提示（接口请求成功）\nTips.success('成功提示')\n\n// 成功提示&隐藏时回调函数\nTips.success('成功提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 失败提示（接口请求失败）\nTips.fail('失败提示')\n\n// 失败提示&隐藏时回调函数\nTips.fail('失败提示', () => {\n  console.log('隐藏提示框')\n})\n\n// 如果上面三种场景模式不能满足需求，就用Tips.toast()来完成\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间\n  duration: 3000,\n  // icon类型（同wx.toast)\n  icon: 'success',\n  // 自定义图标的本地路径（同wx.toast)\n  image: undefined,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 提示框不自动隐藏\nTips.toast({\n  // 提示内容\n  message: '提示内容',\n  // 持续时间，设置为0表示不自动隐藏\n  duration: 0,\n  // 提示框隐藏时执行的回调函数\n  onHide: () => {\n    console.log('隐藏提示框')\n  }\n})\n\n// 手动关闭提示框\nTips.clear()\n\n// 加载提示\nTips.loading()\nTips.loading('加载中')\n\n// 加载完成，隐藏加载提示\nTips.loaded()\n```\n\n## 开发注意事项\n\n### 微信小程序调试需要关闭的项目设置\n\n- 需要设置关闭 ES6 转 ES5 功能，开启可能报错。\n- 需要设置关闭上传代码时样式自动补全，开启可能报错。\n- 需要设置关闭代码压缩上传，开启可能报错。\n\n### 微信自定义组件的注意事项\n\n- 微信组件不支持传递函数，只有自定义事件。\n- 组件之间传递对象为值的拷贝，而非引用。\n- 在Form组件的onSubmit事件中，无法收集自定义组件中使用的表单控件的值，需要通过自定义组件的 `behaviors: ['wx://form-field']` 设置让自定义组件拥有类似表单控件的行为，这样才能被父级的Form识别。\n\n### 向组件传递jsx内容的props命名必须以render开头\n\n在微信小程序中，向组件传递wxml内容是通过 slot 的方式进行的，而 Taro 在实现这一功能时必须给 slot 取名，所以要求必须以 render 开头，这样便于识别 slot 命名。\n\n详情请参见：[官方文档](https://nervjs.github.io/taro/docs/best-practice.html#%E6%94%AF%E6%8C%81-props-%E4%BC%A0%E5%85%A5-js)。\n\n```js\nclass Dialog extends Component {\n  render () {\n    return (\n      <View className='dialog'>\n        <View className='header'>\n          {this.props.renderHeader}\n        </View>\n        <View className='body'>\n          {this.props.children}\n        </View>\n      </View>\n    )\n  }\n}\n```\n\n### 无法使用无状态组件或者js定义函数拆分页面模块\n\n我们在进行以 React 开发的项目中，可能会使用 `无状态组件` 或者 `jsx定义函数` 来将页面的结构进行拆分，而不是以组件的形式进行拆分。\n\n但是到了 Taro 这里，由于编译的局限性：\n\n- Taro 不支持 `无状态组件`（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-stateless-function.md)）。\n- Taro 不支持在 `render()` 之外的地方定义 jsx 内容（[参见说明](https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/no-jsx-in-class-method.md)）。\n\n所以到了 Taro 这里，我们就只剩下组件的方式来拆分页面模块了。\n","readmeFilename":"README.md","gitHead":"9bfd11349e685cd29e1b1922a3dbdc95122cbebd","_id":"@unovo/taro-component@0.2.6","_npmVersion":"6.4.1","_nodeVersion":"10.15.3","_npmUser":{"name":"yangtuan2010","email":"yangtuan2009@126.com"},"dist":{"integrity":"sha512-knTCk0iCcoyyLIkod8qN8UV8evbFJ2paEdeaujgHA8E4yr2svN3biDDKnkYXZGHBNHbHWC20rFZ8n+xgDsd0tA==","shasum":"a5c609fcc6f0fd026033e775c772ca3bd9765ea1","tarball":"https://registry.npmjs.org/@unovo/taro-component/-/taro-component-0.2.6.tgz","fileCount":59,"unpackedSize":428038,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdpSV7CRA9TVsSAnZWagAAfQcP/0JilnpVd+YE4iM6rhXa\nIq+KDZJ+1tx0qD7lExmosNY7eg09BJjYLg5orBbVFFzuKi/aiNmZjVQNVti3\nd445fxUVdrP/BK+8uFotP6A9e3cNFStZcFDN9r0e7RaTo8VsypuJqIOsPs1O\nFzXhHV3iKD1DbDlsJYqB9XFWXa2Fy/+jcyg79mAAT3eiBUFsSMDg35tJh0PE\nJ0fLuw37+VD4IIU9W6gZW8UFyzM58M2fYtA4OMf+K30HuHSS6sMTLXDaFVq4\nAGaoCRAQV4zhDJL8UOjgWoZwYkDAMSvz91LvVwqn5KqafeXoUyA7kOCVbvj8\ntGuGo6Yb3CwTTXwpJRZbxBi1NoAUWsr17EKiAqgPYkodXHFNrNIGp7WFOORJ\n9YHVbgWKXkIG1f+AjyhjEE1S1qXDSQn+VKrAGf5FnK7zxb9rpk6ssIlBPj6X\nPsunulGoxgZgNupauTh3DHS/F3hWKBgO+IBebLvEX5Cj9CruA9v1U411cc4g\nymnetheKiUQpQCm/u9TVksWvznp7BrdJzfYhfjFAzQTpdT9jFQ3nRjTCxWed\nfPrBhbS5+DZu/x0nLhj4dWNX3IJQPqCUA93naJLUYB4g3SiNJdPySnv3eeSN\n4NQfVRvOie1/YN9sG+UGy9AIN4YbEyU46eoF+sh9zc3h56qmTl61sCDmphv0\ny0tv\r\n=ATfG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCtY5GPzTrhe8X9YFZzZR+3zY8q0ydogD3Vl5fb25qSyQIgCHKzvPP1BolnYugvNjs2W+gvcgA34lIfi2VUw7yFKPY="}]},"maintainers":[{"email":"arklove@qq.com","name":"ineo6"},{"email":"xiaowanzi1226@qq.com","name":"xiaowanzi12"},{"email":"yangtuan2009@126.com","name":"yangtuan2010"},{"email":"keep_rock@163.com","name":"yuxiaoqinglan"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taro-component_0.2.6_1571104123059_0.12008113289210187"},"_hasShrinkwrap":false}},"time":{"created":"2019-04-16T09:51:40.822Z","0.0.1":"2019-04-16T09:51:41.171Z","modified":"2022-04-07T09:44:56.393Z","0.0.2":"2019-04-23T09:32:40.592Z","0.0.3":"2019-04-23T11:01:34.484Z","0.0.4":"2019-04-23T12:13:12.891Z","0.0.5":"2019-04-24T02:06:18.743Z","0.0.6":"2019-04-24T03:08:45.144Z","0.0.7":"2019-04-24T06:19:59.135Z","0.0.8":"2019-04-24T10:00:32.728Z","0.0.9":"2019-04-24T11:07:35.571Z","0.0.10":"2019-04-25T06:15:38.052Z","0.0.11":"2019-04-25T06:41:02.561Z","0.1.0":"2019-04-26T02:07:07.817Z","0.1.1":"2019-04-26T05:59:07.632Z","0.1.2":"2019-04-29T01:08:59.446Z","0.1.3":"2019-04-29T07:02:41.280Z","0.1.4":"2019-04-29T09:58:08.011Z","0.1.5":"2019-05-30T08:22:42.464Z","0.1.6":"2019-07-04T08:35:20.735Z","0.1.7":"2019-08-06T05:25:10.142Z","0.1.8":"2019-08-12T07:14:05.423Z","0.2.0":"2019-08-13T08:56:38.538Z","0.2.1":"2019-08-13T09:39:30.229Z","0.2.2":"2019-08-13T10:11:20.193Z","0.2.3":"2019-08-14T03:15:03.269Z","0.2.4":"2019-08-16T03:22:47.499Z","0.2.5":"2019-09-25T10:50:47.497Z","0.2.6":"2019-10-15T01:48:43.234Z"},"maintainers":[{"email":"arklove@qq.com","name":"ineo6"},{"email":"xiaowanzi1226@qq.com","name":"xiaowanzi12"},{"email":"yangtuan2009@126.com","name":"yangtuan2010"},{"email":"keep_rock@163.com","name":"yuxiaoqinglan"}],"description":"基于taro的小程序组件","repository":{"type":"git","URL":"git@gitlab.intebox.com:FE/taro-component.git"},"author":{"name":"unovo"},"license":"MIT","readme":"","readmeFilename":""}