darkti UI—input轮子及单元测试

2020-06-23  本文已影响0人  darkTi

一、整理一下README

1、梳理每一项标题,可参考vue的README;
2、解决iconfont文件的引入问题(不让用户自己去引入,我们给他引入好)

二、分析用户用例(user case)

三、开始写input

1、disabled的写法

// 下面两种写法都可以,第一种千万不要忘记“:”,第二种是简写,意思是只要写了disabled,disabled就为true
<g-input :disabled="true"></g-input>
<g-input disabled></g-input>

&[disabled]{
       cursor: not-allowed;    //鼠标变成不可编辑样式
   }

2、disabled和readonly的区别

// 这里为什么不<div>,因为此处只是为了用v-if包住他们,用了div还要调样式
<template v-if="error">
      <Icon name='error' class="icon-error"></Icon>
      <span class="errorMessage">{{error}}</span>
</template>

四、单元测试,写完几个属性就要进行一下

1、主要注意事件的测试

describe('事件',() => {
        const Constructor = Vue.extend(Input)
        let vm
        afterEach(() => {
            vm.$destroy()
        })
        it('支持change/input/focus/blur事件', () => {
            vm = new Constructor({}).$mount()
            const callback = sinon.fake()
            vm.$on('change',callback)
            //触发input的change 事件
            let event = new Event('change');  //重要的是下面这几句
            let inputElement = vm.$el.querySelector('input')
            inputElement.dispatchEvent(event)
            expect(callback).to.have.been.calledWith(event)
        })
    })

为了具体理解上面重要的那几句,我们可以把它写进app.js里来理解

new Vue({
    el: '#app',
    data:{},
    created(){
        setTimeout(()=>{
            let event = new Event('change');
            let inputElement = this.$el.querySelector('input')
            inputElement.dispatchEvent(event)
            console.log('ni');
        },3000)
    },
    methods: {
        inputChange(e){
            console.log(e,'eeeee')
        }
    }
})

过3秒后,真的就触发了change事件,打印出内容了


image.png
  1. 这些库都是有哪里提供的

五、写g-input的v-model

1、首先要知道v-model是怎么实现的

<div id="app">
     <input type="text" :value="message" @input="message = $event.target.value">
    <div>{{message}}</div>
  </div>
new Vue({
  el:'#app',
  data:{
    message: 'nct'
  }
})

以上代码就实现了v-model的双向绑定~~~

上一篇下一篇

猜你喜欢

热点阅读