Money.vue组件

简介: Money.vue组件

Money.vue组件


1. 小技巧:快速包裹每一行

  • 选中,按两下 shift,输入 surround ,选择 surround with emit,输入 li*,意思就是 n 个 li 包住行数

2. input,label 的写法

  • 新手
<label for="xxx"></label>
<input id = 'xxx' type="text">
  • 老手
<label>
  <span>备注</span>
  <input type="text">
</label>

3. 文件行数规则

  • 一个文件超过 150 行,一般拆成多个文件。

4. 开始写 CSS

  1. css 重置,抽成另外一个文件 reset.scss,然后在 app.vue 中引入
// reset.scss
* {
  margin: 0; padding: 0;
  box-sizing: border-box;
}
a{
  text-decoration: none;
  color:inherit;
}
// app.vue
@import "~@/assets/style/reset.scss";
  1. 处理字体,需要用到 fonts.css\
  • 在 google 搜索 "fonts.css" 中文
  • 找到 font-family 的地方,在 helper.scss 中声明 font,然后在 app.vue 中使用
// helper.scss
$font-hei:  -apple-system, "Noto Sans", "Helvetica Neue", Helvetica, "Nimbus Sans L", Arial, "Liberation Sans", "PingFang SC", "Hiragino Sans GB", "Noto Sans CJK SC", "Source Han Sans SC", "Source Han Sans CN", "Microsoft YaHei", "Wenquanyi Micro Hei", "WenQuanYi Zen Hei", "ST Heiti", SimHei, "WenQuanYi Zen Hei Sharp", sans-serif;
// app.vue
body{
  line-height: 1.5;
  font-family: $font-hei;
}
  1. 把变量都放到 helper.css 里面。\
  • command+shift+f 进行全局搜索
  • helper.css 这个文件只能放变量,函数和 mixin,最终会消失的东西

4. 写css推荐顺序

  • 一般而言无所谓,如果比较复杂,推荐从里到外,因为里面最简单

5. scss的用法

  • 选择器里面
.tags {
  > .current {
  }
}
  • 选择器本身
.tags {
  &.current {
  }
}

6. 按钮字体样式不会继承

  • 在reset.scss中加入
button, input{
  font: inherit;
}

7. 字体居中解决

  • 第一种方式,lineheight和高度一样,这种情况用于只有一行字
  • 第二种方式,用flex

8. 字的下划线比字长

border-bottom: 1px solid;
padding: 0 4px;

9. selected下划线的做法

  • 避免用border-bottom来做,这种做法当class消失会有抖动,要用以下做法
&.selected::after {
  content: '';
  position: absolute;
  bottom: 0;
  left: 0;
  width: 100%;
  height: 4px;
  background: #333;
}

10. 处理没有的字体,在其后面加上一类字体。

// monospace就是等宽的编程字体类
font-family: Consolas, monospace;

11. 如果用了float

  • 父元素一定要用clearfix
.clearfix::after{
  content:'';
  display: block;
  clear:both;
}
  • 用scss的%,placeholder功能
// helper.scss
// placeholder
%x{
  &::after{
    content: '';
    clear: both;
    display: block;
  }
}
// 如何用
// money.vue
.buttons {
  @extend %x;
}

12. 两层内阴影的写法

box-shadow: inset 0 -5px 5px -5px fade_out(black, 0.5),
inset 0 5px 5px -5px fade_out(black, 0.5);

13. 多个地方统一替换

  • 选中之后按command+r

14. 用前缀控制组件内css样式

// 这样写会有bug,要写deep

// Money.vue
<Layout class-prefix="layout">
</Layout>
<style lang="scss">
  .layout-content{
    border: 3px solid red;
  }
  .layout-wrapper{
    border: 3px solid blue;
  }
</style>
// Layout.vue
<template>
  <div class="layout-wrapper" :class="classPrefix && `${classPrefix}-wrapper`">
    <div class="content" :class="classPrefix && `${classPrefix}-content`">
      <slot />
    </div>
    <Nav/>
  </div>
</template>
<script lang="ts">
  export default {
    props: ['classPrefix'],
    name: "Layout"
  }
</script>

15. 如何模块化

  • 坚持一个文件查过150行就执行模块化
  • 把html scss剪切的单独.vue文件,引入的时候写\
  • 最后把相关文件放到一个文件夹

16. 实现TypeScript的Vue组件。

  • 以Types组件为例改写
  • JS写法
<template>
      <div>
        <ul class="types">
          <li :class="type === '-' && 'selected'"
          @click="selectType('-')">支出</li>
          <li :class="type === '+' && 'selected'"
          @click="selectType('+')">收入</li>
        </ul>
      </div>
    </template>
    <script lang="js">
      export default {
        name: "Types",
        props: ['xxx'],
        data() {
          return {
            type: '-' // '-'表示支出.'+'表示收入
          }
        },
        mounted() {
          console.log(this.xxx)
        },
        methods: {
          selectType(type) { // type 只能是 '-' 和 '+' 中的一个
            if(type !== '-' && type !== '+'){
              throw new Error('type is unknown')
            }
            this.type = type
          }
        }
      }
    </script>
  • TS写法,用class组件写data methods 和生命周期
  1. 起手
export default class Types extends Vue {
        }
  1. Component修饰符,在最上面加@Compo按下tab键,选择从vue-property-decorator引入
import {Component} from "vue-property-decorator"
        @Component
        export default class Types extends Vue {
        }
  1. 必需制定参数type的类型
selectType(type: string) { // type 只能是 '-' 和 '+' 中的一个
      }
  1. 代码总结
import Vue from 'vue'
        import {Component} from "vue-property-decorator"
          @Component
          export default class Types extends Vue {
            type = '-'  // '-'表示支出.'+'表示收入
            selectType(type: string) { // type 只能是 '-' 和 '+' 中的一个
              if(type !== '-' && type !== '+'){
                throw new Error('type is unknown')
              }
              this.type = type
            }
            created(){}
            mounted(){}
          }
  • props用法
    1 查看一个包的最新版本,在终端输入
npm info typescript version

1. TS 组件 @Prop装饰器

  • 用法
// 左边Number是运行时的检查,右边number是编译时的检查,编译时的检查会在写代码的时候就给提示
      @Prop(Number) xxx: number | undefined;
      // Prop 告诉 Vue xxx 不是 data 是 prop
      // Number 告诉 Vue xxx 运行时类型 是个 Number
      // xxx 属性名
      // number | undefined 就是 告诉 TS xxx 的编译时类型
      // 为什么前面的Number是大些后面是小写,见3.编译时和运行时的区别
  • TS的好处
  1. html直接空格告诉你有哪些参数
  2. 如果声明了类型,代码写错了会提前告诉,编译报错,无法编程js
  3. 检查调用的方法到底能不能调用,你不能写.tostring

2. 编译时和运行时的区别

3. TS的本质

4. Vue但文件组件的三种写法

  1. 用JS对象
export default { data,props,methods,created,... }
  1. 用 TS 类
<script lang="ts">
    @Component
    export default class XXX extends Vue{
      xxx: string = 'hi';
      @Prop(Number) xxx: number|undefined;
    }
  1. 用 JS 类
@Component
    <script lang="js">
    export default class XXX extends Vue{
      xxx = 'hi'
    }

5. 开始实现NumberPad组件

  • 在按钮上绑定事件,不加参数会默认传入事件
<button @click="inputContent">1</button>
  inputContent(event: MouseEvent){
    if(event.target){
      console.log(event.target.textContent);
    }
  }
  • 强制指定类型,需要这么做的原因是Vue和Typescript不够好
inputContent(event: MouseEvent){
    if(event.target){
      const button = (event.target as HTMLButtonElement)
      console.log(button.textContent);
    }
  }
  • 如果只是要排除空,也可以这么写
const input = button.textContent!;
  • 基本完成NumberPad,NumberPad 组件所有代码
import Vue from "vue"
  import {Component, Prop} from "vue-property-decorator"
  @Component // 如果如果这样写,就表示Class就有一个propMessage的props,类型为String
  export default class NumberPad extends Vue {
    output: string = '0';
    inputContent(event: MouseEvent){
      const button = (event.target as HTMLButtonElement);
      const input = button.textContent!;
      if(this.output.length === 16){return}
      if(this.output === '0'){
        if ('0123456789'.indexOf(input) >= 0) {
          this.output = input
        } else {
          this.output += input;
        }
        return
      }
      if (this.output.indexOf(".") >= 0 && input === ".") {return;}
      this.output += input;
    }
    remove(){
      if (this.output.length === 1){
        this.output = '0';
      } else {
        this.output = this.output.slice(0, -1);
      }
    }
    clear(){
      this.output = '0';
    }
    ok(){
    }
  }

6. 开始实现备注功能

  • 原生html input实现绑定数据
<input type="text" :value="value" @input="onInput" placeholder="在这里输入备注">
onInput(event: KeyboardEvent){
      const input = event.target as HTMLInputElement;
      this.value = input.value
    }
  • 对:value 和 @input绑定数据进行简写
<input type="text" v-model="value" placeholder="在这里输入备注">

7. 开始实现tags模块

  • 只能不能改外部数据的写法
@Prop() readonly dataSource: string[] | undefined // 加readonly
  • 内部不能直接改外部数据
// 内部
  // this.dataSource.push(name!); // 不能改外部数据,这种写法不推荐!
  this.$emit("update:dataSource", [...this.dataSource, name])
  // 外部,用.sync简写
  <Tags :data-source.sync="tags"/>


相关文章
|
2月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
282 2
|
5月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
726 0
|
7月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
967 4
|
5月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
5月前
|
JavaScript 前端开发 UED
Vue 表情包输入组件的实现代码:支持自定义表情库、快捷键发送和输入框联动的聊天表情解决方案
本文详细介绍了在 Vue 项目中实现一个功能完善、交互友好的表情包输入组件的方法,并提供了具体的应用实例。组件设计包含表情分类展示、响应式布局、与输入框的交互及样式定制等功能。通过核心技术实现,如将表情插入输入框光标位置和点击外部关闭选择器,确保用户体验流畅。同时探讨了性能优化策略,如懒加载和虚拟滚动,以及扩展性方案,如自定义主题和国际化支持。最终,展示了如何在聊天界面中集成该组件,为用户提供丰富的表情输入体验。
455 8
|
5月前
|
JavaScript 前端开发 UED
Vue 表情包输入组件实现代码及详细开发流程解析
这是一篇关于 Vue 表情包输入组件的使用方法与封装指南的文章。通过安装依赖、全局注册和局部使用,可以快速集成表情包功能到 Vue 项目中。文章还详细介绍了组件的封装实现、高级配置(如自定义表情列表、主题定制、动画效果和懒加载)以及完整集成示例。开发者可根据需求扩展功能,例如 GIF 搜索或自定义表情上传,提升用户体验。资源链接提供进一步学习材料。
264 1
|
5月前
|
JavaScript 前端开发 UED
Vue 项目中如何自定义实用的进度条组件
本文介绍了如何使用Vue.js创建一个灵活多样的自定义进度条组件。该组件可接受进度段数据数组作为输入,动态渲染进度段,支持动画效果和内容展示。当进度超出总长时,超出部分将以红色填充。文章详细描述了组件的设计目标、实现步骤(包括props定义、宽度计算、模板渲染、动画处理及超出部分的显示),并提供了使用示例。通过此组件,开发者可根据项目需求灵活展示进度情况,优化用户体验。资源地址:[https://pan.quark.cn/s/35324205c62b](https://pan.quark.cn/s/35324205c62b)。
218 0
|
7月前
|
存储 JavaScript 前端开发
基于 ant-design-vue 和 Vue 3 封装的功能强大的表格组件
VTable 是一个基于 ant-design-vue 和 Vue 3 的多功能表格组件,支持列自定义、排序、本地化存储、行选择等功能。它继承了 Ant-Design-Vue Table 的所有特性并加以扩展,提供开箱即用的高性能体验。示例包括基础表格、可选择表格和自定义列渲染等。
559 6
|
12月前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
265 64
|
12月前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
396 64