1、在component文件夹中创建scyradio.vue
<template>
<div class="co-radio__warp" @click="toggle">
<input class="co-radio__checkbox" type="checkbox" :checked="value === checkedStatus" />
<span class="co-radio__outer"></span>
<label class="co-radio__title">{{ label }}</label>
</div>
</template>
<script>
export default {
name: "scyRadio", // 组件名
props: ["label", "value"], // 父级传递过来的值
data() {
return {
checkedStatus: "",
};
},
mounted() {},
methods: {
// 点击事件
toggle() {
this.$parent.trigger("input", this.value); // 双向数据绑定使用---v-model接收
this.$parent.trigger("change", this.value); // change事件触发
},
},
};
</script>
<style scoped>
.co-radio__warp {
margin-right: 12px;
position: relative;
display: inline-block;
overflow: hidden;
}
.co-radio__checkbox {
width: 0;
opacity: 0;
}
.co-radio__outer {
cursor: pointer;
display: inline-block;
width: 14px;
height: 14px;
margin-right: 8px;
margin-bottom: -2px;
border: 1px solid #dcdfe6;
background-color: #fff;
box-sizing: border-box;
border-radius: 50%;
position: relative;
transition: all 0.3s;
}
.co-radio__checkbox:checked + .co-radio__outer {
border: 1px solid #1f282e;
background-color: #1f282e;
}
.co-radio__checkbox:checked + .co-radio__outer::before {
content: "";
display: inline-block;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border-radius: 50%;
border-color: #1f282e;
background-color: #1f282e;
overflow: hidden;
}
.co-radio__checkbox:checked + .co-radio__outer::after {
content: "";
display: inline-block;
position: absolute;
top: 50%;
left: 50%;
width: 4px;
height: 4px;
margin-top: -2px;
margin-left: -2px;
border-radius: 50%;
background-color: #fff;
overflow: hidden;
}
</style>
2、在component文件夹中创建scyrodiogroup.vue
<template>
<div class="co-radio-group" :class="size">
<slot></slot>
</div>
</template>
<script>
export default {
name: "scyRadioGroup",
props: ["value", "size"], // size大小
mounted() {
this.update();
},
methods: {
update() {
// 获取子元素列表,并赋值
this.$children.forEach((item) => (item.checkedValue = this.value));
},
// 告诉父组件传值,第一个参数:方法名,第二个参数:值
trigger(eventType, value) {
this.$emit(eventType, value);
},
},
watch: {
value() {
this.update();
},
},
};
</script>
<style scoped>
.small {
height: 32px;
line-height: 32px;
}
.medium {
height: 36px;
line-height: 36px;
}
</style>
3、在main.js中全局引入
// 自定义组件
import scyRadio from './components/scyradio.vue';
import scyRadioGroup from './components/scyrodiogroup.vue';
Vue.component('scy-radio', scyRadio)
Vue.component('scy-radio-group', scyRadioGroup)
4,使用单选,在components文件夹在创建test.vue文件
<template>
<div class="content-radio">
<!-- 多个放在一起使用 -->
<scy-radio-group v-model="test" @change="changeTest">
<scy-radio value='1' lable="数据1"></scy-radio>
<scy-radio value='2' lable="数据2"></scy-radio>
</scy-radio-group>
<!-- 单个使用 -->
<scy-radio :value='test' lable="数据1"></scy-radio>
</div>
</template>
<script>
export default {
data() {
return {
test: 1,
};
},
methods:{
// 单选选中的回调
changeTest(value){
console.oog(value); // 打印选中的值
}
}
}
</script>
网友评论