import PropTypes from '../_util/vue-types' import hasProp from '../_util/props-util' export default { name: 'ARadio', props: { prefixCls: { default: 'ant-radio', type: String, }, defaultChecked: Boolean, checked: { type: Boolean, default: undefined }, disabled: Boolean, isGroup: Boolean, value: PropTypes.any, name: String, id: String, autoFocus: Boolean, }, model: { prop: 'checked', }, inject: { radioGroupContext: { default: undefined }, }, data () { const { radioGroupContext, checked, defaultChecked, value } = this let stateChecked if (radioGroupContext && radioGroupContext.stateValue !== undefined) { stateChecked = radioGroupContext.stateValue === value } return { stateChecked: stateChecked === undefined ? !hasProp(this, 'checked') ? defaultChecked : checked : stateChecked, } }, mounted () { this.$nextTick(() => { if (this.autoFocus) { this.$refs.input.focus() } }) }, computed: { classes () { const { prefixCls, disabled, stateChecked } = this return { [`${prefixCls}-wrapper`]: true, [`${prefixCls}-wrapper-checked`]: stateChecked, [`${prefixCls}-wrapper-disabled`]: disabled, } }, checkboxClass () { const { prefixCls, disabled, stateChecked } = this return { [`${prefixCls}`]: true, [`${prefixCls}-checked`]: stateChecked, [`${prefixCls}-disabled`]: disabled, } }, }, methods: { handleChange (event) { const targetChecked = event.target.checked this.$emit('input', targetChecked) const { name, value, radioGroupContext } = this if ((!hasProp(this, 'checked') && !radioGroupContext) || (radioGroupContext && radioGroupContext.value === undefined)) { this.stateChecked = targetChecked } const target = { name, value, checked: targetChecked, } if (this.radioGroupContext) { this.radioGroupContext.handleChange({ target }) } else { this.$emit('change', { target, stopPropagation () { event.stopPropagation() }, preventDefault () { event.preventDefault() }, }) } }, focus () { this.$refs.input.focus() }, blur () { this.$refs.input.blur() }, onFocus (e) { this.$emit('focus', e) }, onBlur (e) { this.$emit('blur', e) }, onMouseEnter (e) { this.$emit('mouseenter', e) }, onMouseLeave (e) { this.$emit('mouseleave', e) }, }, watch: { checked (val) { this.stateChecked = val }, 'radioGroupContext.stateValue': function (stateValue) { this.stateChecked = stateValue === this.value }, }, render () { const { id, classes, checkboxClass, prefixCls, stateChecked, handleChange, $slots, onFocus, onBlur, onMouseEnter, onMouseLeave, radioGroupContext, } = this let { name, disabled } = this if (radioGroupContext) { name = radioGroupContext.name disabled = disabled || radioGroupContext.disabled } return ( ) }, }