# uni-ccui

基于 uni-app 的 ui 框架 `uni-ccui`

优先使用 `uni-ui` 组件库，在其不支持或**支持存在差异**的情况下，使用 `uni-ccui`

TIP:

- 优先使用背景图，而非 `image` 标签 [参考-本地图片](https://ask.dcloud.net.cn/article/37276)
- 使用css样式，扩大可点击区域：

    ```scss
    .human {
      position: relative;
      &:before {
        content: '';
        position: absolute;
        top: -10px; bottom: -10px; left: -10px; right: -10px;
      };
    }
    ```

如何使用：

配置 uni-app 项目 `pages.json` 中的 easycom 项

```json
// 自动按需引入
"easycom": {
  "autoscan": true,
  "custom": {
    // "^uni-(.*)": "@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue",
    "^cc-(.*)": "@deepjs/uni-ccui/lib/cc-$1/cc-$1.vue",
    "^dd-(.*)": "@/components/cc-$1/cc-$1.vue",
  }
}
```

模板中使用

```vue
<template>
  <cc-countdown time="9000" format="H:F:S" @timeup="timeUp">
</template>

<script>
export default {
  methods: {
    timeUp() {
      console.log('计时结束')
    },
  },
}
</script>
```

TIP:

- 文件名或者文件夹名中不允许出现 @ 符号，static/cart/add@2x.png，请调整后重试
- 使用 yarn 管理依赖
- 各组件要使用微信小程序，支付宝小程序同时测试验证通过
- 使用系统图标，需要手动引入系统图标的 iconfont (main.js 中)
  - `import '@deepjs/uni-ccui/style/iconfont.css'`

注意事项

- 组件减少对公共样式依赖，除细线方案外
- 组件减少对项目公共业务方法依赖, 提取到第三方包，直接引用
- TODO: 统一事件 `$emit` 传递数据的格式
- ~~鉴于 sass 存在个安装依赖编译慢问题，推荐用 less~~
- ~~cli 编译模式，还是没 HbuildX 编译稳定，有时出现一些奇怪的错误~~
  - 可以挖掘下，编译软件用的哪个版本的依赖
  - `/Applications/HBuilderX-Alpha.app/Contents/HBuilderX/plugins/uniapp-cli/package.json`
  - 有点遗憾，使用上面的版本，parse.vue 还是报错，还未找到原因
  - 突然发现是项目目录的原因，直接在 src 运行不报错，在根目录运行就出现上面的问题，所以 cli 如能改变编译目录，就 OK 了
- 不要将外部组件直接copy进来，如需要，考虑是否贴合我们的使用场景

## 关于样式

https://bemcss.com/

BEM的命名规矩很容易记：block-name__element-name--modifier-name，也就是模块名 + 元素名 + 修饰器名

```css
.cc-block__element--bottom

.cc-upload__container-box
```

BEM思想，是不考虑结构的，不使用子代选择器，不需要原子类（如ellipsis）

## 工具类复用

uni-app 专用 一系列小工具，细粒度拆分

- [ ] uni-axios
- [ ] uni-geo
- [x] [uni-pull](https://www.npmjs.com/package/@deepjs/uni-pull)
  - pullUp    滚动加载
  - pullDown  下拉刷新
- [ ] uni-request
- [ ] uni-router uni路由
- [ ] uni-stat
- [x] [uni-storage](https://www.npmjs.com/package/@deepjs/uni-storage)
- [x] [uni-utils](https://www.npmjs.com/package/@deepjs/uni-utils)
  - checkUpdate 检查更新
  - errorReport 错误上报
- [x] [vuex-persistedstate](https://www.npmjs.com/package/vuex-persistedstate) 持久化存储 vuex

shvl: `shvl.set(obj, 'a.b.c', 2);`

## 组件列表

组件名 `cc-xxx`

- 基础组件
  - [ ] badge         徽标
  - [ ] calendar      日历
  - [ ] quick-nav     快速导航            !!!
  - [ ] card          卡片
  - [ ] cell          cell列表项          !!!
  - [ ] cell-group    分组                !!
  - [ ] collapse      折叠面板
  - [ ] combox        可选择输入框
  - [x] countdown     倒计时              !!
  - [ ] drawer        抽屉
  - [x] divider       分割线
  - [ ] editor        编辑器
  - [ ] fab           悬浮按钮
  - [ ] fav           收藏按钮
  - [ ] grid          宫格
  - [ ] header-bar    标题栏（支持适配 iPhoneX）
  - [ ] header        标题
  - [x] html          复杂富文本解析       !!!
  - [x] icon          iconfont 图标      !!!
  - [ ] image         图片（支持大小设定）  !!
  - [ ] indexed-bar   索引栏
  - [ ] indexed-list  索引列表
  - [x] input-number  数字输入框          !!!
  - [ ] link          超链接（支持复制）
  - [ ] list          列表
  - [x] load-more     加载更多             !!
  - [x] marquee       滚动容器
  - [ ] nav-bar       自定义导航栏
  - [x] notice-bar    通告栏               !
  - [x] page          页面容器
  - [ ] pager         分页器
  - [ ] page-result   结果页
  - [ ] picker        选择器              !!
  - [ ] picture       图片预览
  - [x] popup         弹出层              !!!
  - [ ] progress      进度条
  - [ ] pull-list     滚动加载列表         !!!  废弃此版本实现，改为新版
  - [x] rate          评分
  - [x] rich-text     简单富文本展示        !!
  - [ ] search-bar    搜索栏              !!!
  - [ ] share         分享按钮
  - [ ] slider        滑动选择器
  - [ ] stepper       步骤条              !!
  - [ ] sticky        滚动吸顶
  - [ ] swiper        swiper图片滚动      !!!
  - [ ] swiper-dot    轮播图指示点          !
  - [ ] swipe-action  滑动操作
  - [ ] switch        开关                !!
  - [ ] textarea      文本区域(带字数控制)
  - [x] transition    过渡动画             !!
  - [ ] tab           简单Tab             !!!
  - [x] scroll-tab    支持滚动的Tab        !!!
  - [ ] tab-bar       标签栏
  - [ ] tag           标签                 !
  - [ ] task          任务
  - [ ] upload        上传组件
  - [ ] waterfall     瀑布流

## 关于 vuex-persistedstate

支持 uni-app，两个问题

- 可选择的变更持久化
- 下次进入使用持久化数据初始化 vuex

```js
import Vue from 'vue'
import Vuex from 'vuex'
import createPersistedState from 'vuex-persistedstate'

import app from './modules/app.js'

Vue.use(Vuex)

export default new Vuex.Store({
  strict: false,
  modules: {
    app,
    user,
  },
  plugins: [
    // 可以有多个持久化实例
    createPersistedState({
      key: 'vuex_temp',  // 状态保存到本地的 key
      // 非Module格式: xxx
      // 使用了Module的格式: ModuleName.xxx
      paths: ['app.config', 'user.userInfo'],  // 要持久化的状态，在state里面取，如果有嵌套，可以 a.b.c
      storage: {  // 存储方式定义(必须同步方法？)
        getItem: (key) => uni.getStorageSync(key), // 获取
        setItem: (key, value) => uni.setStorageSync(key, value), // 存储
        removeItem: (key) => uni.removeStorageSync(key), // 删除
      },
    }),
  ],
})
```
