熊猫记账(Vue / 本地版)项目总结

熊猫记账(panda-booking)是一款简约、轻量的记账应用,也是一款基于Vue、VueRouter、Vuex、TypeScript的单页面应用。源码链接 项目预览

参考了市面上多款记账应用的设计界面,独立实现完成。下面记录一些实现过程中遇到的问题:

1.svg图标的引用

参考文档:https://juejin.im/post/59bb864b5188257e7a427c09

我用的是阿里的iconfont,根据官方文档可以使用symbol方式引入项目下面生成的iconfont.js,加入通用css,然后在页面中用svg标签加相应的图标的class名就可以了,但是这种方式的缺点也很多,参考文档中列举了一些,我自己使用过程中的感受就是不方便,每次在图库新添加图标的时候要重新生成引入新的js文件,找对应的图标也很不方便。于是就搜索解决办法,可以使用webpack的loader解决:

  1. 安装依赖
npm install svg-sprite-loader --save-dev

2.全局配置vue.config.js

const path = require('path')

module.exports = {
  lintOnSave: false,
  chainWebpack: config => {
    const dir = path.resolve(__dirname, 'src/assets/icons') //svg文件位置

    config.module
      .rule('svg-sprite')
      .test(/\.(svg)(\?.*)?$/)
      .include.add(dir).end() //包含icon目录
      .use('svg-sprite-loader-mod').loader('svg-sprite-loader-mod').options({extract: false})
      // .end()
      // .use('svgo-loader').loader('svgo-loader')  // 自动删除svg的fill
      .tap(options => ({...options, plugins: [{removeAttrs: {attrs: 'fill'}}]}))
      .end()
    config.plugin('svg-sprite').use(require('svg-sprite-loader-mod/plugin'), [{plainSprite: true}])
    config.module.rule('svg').exclude.add(dir) //其他 svg loader 排除icons目录  不然会有loader冲突
  }
}

中间注释掉的是自动删除svg文件fill属性的,如果项目很多svg而且不需要填充颜色的时候可以使用,也可以手动删除fill属性。
3.svg-sprite-loader通过icon引入了svg,然后在svg里面做了symbol,然后就可以使用标签了

import name from "@/.../icons/name.svg"
<svg>
  <use xlink:herf="#name"/>
</svg>

4.解决一个引用svg文件的TS报错

在shims-vue.d.ts文件中声明一下

declare module "*.svg" {
  const content: string;
  export default content;
}

5.封装了一个Icon组件,解决每次使用都要import的问题

// 声明一个引入方法,遍历指定文件夹里面的所有文件
  const importAll = (requireContext: __WebpackModuleApi.RequireContext) => requireContext.keys().forEach(requireContext);
  try {
    // 指定icons文件夹,指定以.svg结尾的文件
    importAll(require.context('../assets/icons', true, /\.svg$/))
  } catch (error) {
    console.log(error);
  }
2.classPrefix

之前做了个Layout组件,包含底部导航Nav组件和上面的视窗,后来做记账页面的时候碰到了布局问题,要Layout变成flex布局,开始就直接传的class的前缀名直接加Layout,后来想想如果Layout的子元素也需要改样式那岂不是还要传别的名字来增加子元素的class,解决办法就是不写死class,给Layout绑定动态class:

<div class="content" :class="classPrefix && `${classPrefix}-content`">

然后父组件定义classPrefix并传过去就好了。

3.父子组件通信,子组件的input标签给v-model,ts怎么获取input的value

解决办法:
1.用原始方法,动态绑定value,然后监听value改变触发改变value函数并通过$emit传给父组件

<input type="text" :value="notes" @change="onValueChang($event.target.value)" placeholder="在这里输入备注">

2.子组件给ref属性,ts可以通过$refs获取DOM元素

<input type="text" v-model="value" ref='input' />
this.$refs.input.value  //获取input的value
4.需求是记账页面点击ok账单记录成功清空备注内容并数字清零,没成功备注和数字不变

因为一开始没考虑失败情况,方法都放在了子组件里面,后果就是点击了ok后不管有没有成功都会清空,解决办法是清空的触发由父组件来执行,但是又需要去触发ok的点击事件,所以这里就又出现了一个问题:父组件怎么调用子组件的方法。
网上找到了两种方法:
1.如果是直接子组件可以使用$children

this.$children('组件名').子组件方法

2.不是直接子组件就给ref属性获取子组件

this.$refs.给的ref属性名.子组件方法

按照上述方法操作后发现子方法ts会报错,后来搜索解决办法要给前面指定类型:

(this.$refs.给的ref属性名 as HTMLFormElement).子组件方法

报错就没了

5.用::v-deep解决复用组件的内部样式问题

复用组件全局样式修改会影响别的页面效果,但是scoped又改不了它的样式,这时就可以在scoped里用::v-deep深入到组件里面,改组件在当前组件的样式。

6.引入dayjs库辅助处理账单的时间显示问题

几个主要方法:
当前时间
dayjs()

时间字符串
dayjs('2018-06-03')

时间戳
dayjs(1528361259484)

检查一个 Dayjs 对象是否和另一个 Dayjs 对象时间相同
dayjs().isSame(dayjs())

格式化
dayjs().format()
dayjs().format('YYYY-MM-DD dddd HH:mm:ss.SSS A')

减少时间并返回一个新的 Dayjs() 对象
dayjs().subtract(7, 'year')
dayjs().subtract(7, 'month')

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