diff --git a/examples/docs/en-US/radio.md b/examples/docs/en-US/radio.md index 3533ea543..e1dc90337 100644 --- a/examples/docs/en-US/radio.md +++ b/examples/docs/en-US/radio.md @@ -137,6 +137,12 @@ label | the value of radio | string/number/boolean | — | — disabled | whether radio is disabled | boolean | — | false name | native 'name' attribute | string | — | — +### Radio Events + +| Event Name | Description | Parameters | +| --- | --- | --- | +| change | triggers when the bound value changes | the label value of the chosen radio | + ### Radio-group Attributes Attribute | Description | Type | Accepted Values | Default @@ -148,8 +154,8 @@ text-color | font color when button is active | string | — | #ffffff | ### Radio-group Events | Event Name | Description | Parameters | ---- | --- | --- -change | triggers when the bound value changes | the label value of the chosen radio +| --- | --- | --- | +| change | triggers when the bound value changes | the label value of the chosen radio | ### Radio-button Attributes diff --git a/examples/docs/zh-CN/radio.md b/examples/docs/zh-CN/radio.md index 858135bd1..795fe8bc3 100644 --- a/examples/docs/zh-CN/radio.md +++ b/examples/docs/zh-CN/radio.md @@ -141,6 +141,11 @@ | disabled | 是否禁用 | boolean | — | false | | name | 原生 name 属性 | string | — | — | +### Radio Events +| 事件名称 | 说明 | 回调参数 | +|---------- |-------- |---------- | +| change | 绑定值变化时触发的事件 | 选中的 Radio label 值 | + ### Radio-group Attributes | 参数 | 说明 | 类型 | 可选值 | 默认值 | |---------- |-------- |---------- |------------- |-------- | diff --git a/packages/radio/src/radio-button.vue b/packages/radio/src/radio-button.vue index 0f995f15e..372e80ae0 100644 --- a/packages/radio/src/radio-button.vue +++ b/packages/radio/src/radio-button.vue @@ -18,6 +18,7 @@ type="radio" v-model="value" :name="name" + @change="handleChange" :disabled="isDisabled" tabindex="-1" > @@ -28,9 +29,13 @@ diff --git a/packages/radio/src/radio-group.vue b/packages/radio/src/radio-group.vue index 731a04358..82aea48e5 100644 --- a/packages/radio/src/radio-group.vue +++ b/packages/radio/src/radio-group.vue @@ -30,6 +30,11 @@ textColor: String, disabled: Boolean }, + created() { + this.$on('handleChange', value => { + this.$emit('change', value); + }); + }, mounted() { // 当radioGroup没有默认选项时,第一个可以选中Tab导航 let radios = this.$el.querySelectorAll('[type=radio]'); @@ -73,7 +78,6 @@ }, watch: { value(value) { - this.$emit('change', value); this.dispatch('ElFormItem', 'el.form.change', [this.value]); } } diff --git a/packages/radio/src/radio.vue b/packages/radio/src/radio.vue index 621d7d58c..796ebb115 100644 --- a/packages/radio/src/radio.vue +++ b/packages/radio/src/radio.vue @@ -22,6 +22,7 @@ v-model="model" @focus="focus = true" @blur="focus = false" + @change="handleChange" :name="name" :disabled="isDisabled" tabindex="-1" @@ -89,6 +90,15 @@ tabIndex() { return !this.isDisabled ? (this.isGroup ? (this.model === this.label ? 0 : -1) : 0) : -1; } + }, + + methods: { + handleChange() { + this.$nextTick(() => { + this.$emit('change', this.model); + this.isGroup && this.dispatch('ElRadioGroup', 'handleChange', this.model); + }); + } } }; diff --git a/test/unit/specs/radio.spec.js b/test/unit/specs/radio.spec.js index c242cec16..c8f42ded1 100644 --- a/test/unit/specs/radio.spec.js +++ b/test/unit/specs/radio.spec.js @@ -50,6 +50,63 @@ describe('Radio', () => { done(); }); }); + it('change event', done => { + vm = createVue({ + template: ` + + + `, + data() { + return { + radio: '', + data: '' + }; + }, + methods: { + handleChange(val) { + this.data = val; + } + } + }, true); + let radioElm = vm.$el; + radioElm.click(); + setTimeout(_ => { + expect(vm.data).to.equal('3'); + done(); + }, 10); + }); + it('change event only triggers on user input', done => { + vm = createVue({ + template: ` + + + `, + data() { + return { + radio: '', + data: '' + }; + }, + methods: { + handleChange(val) { + this.data = val; + } + } + }, true); + vm.radio = '3'; + setTimeout(_ => { + expect(vm.data).to.equal(''); + done(); + }, 10); + }); describe('Radio group', () => { it('create', done => { vm = createVue({ @@ -102,6 +159,61 @@ describe('Radio', () => { done(); }); }); + it('change event', done => { + vm = createVue({ + template: ` + + 备选项 + 备选项 + 备选项 + + `, + methods: { + onChange(val) { + this.data = val; + } + }, + data() { + return { + radio: 3, + data: 0 + }; + } + }, true); + let radio2 = vm.$refs.radio2; + radio2.$el.click(); + setTimeout(_ => { + expect(vm.data).to.equal(6); + done(); + }, 10); + }); + it('change event only triggers on user input', done => { + vm = createVue({ + template: ` + + 备选项 + 备选项 + 备选项 + + `, + methods: { + onChange(val) { + this.data = val; + } + }, + data() { + return { + radio: 3, + data: 0 + }; + } + }, true); + vm.radio = 6; + setTimeout(_ => { + expect(vm.data).to.equal(0); + done(); + }, 10); + }); it('disabled when children is radio button', done => { vm = createVue({ template: ` @@ -174,6 +286,61 @@ describe('Radio', () => { done(); }); }); + it('change event', done => { + vm = createVue({ + template: ` + + 备选项 + 备选项 + 备选项 + + `, + methods: { + onChange(val) { + this.data = val; + } + }, + data() { + return { + data: 0, + radio: 3 + }; + } + }, true); + let radio = vm.$refs.radio2; + radio.$el.click(); + setTimeout(_ => { + expect(vm.data).to.equal(6); + done(); + }, 10); + }); + it('change event only triggers on user input', done => { + vm = createVue({ + template: ` + + 备选项 + 备选项 + 备选项 + + `, + methods: { + onChange(val) { + this.data = val; + } + }, + data() { + return { + data: 0, + radio: 3 + }; + } + }, true); + vm.radio = 6; + setTimeout(_ => { + expect(vm.data).to.equal(0); + done(); + }, 10); + }); it('size', done => { vm = createVue({ template: `