checkbox
src
checkbox.vue
<template>
<div>
<div>
<input type="checkbox" />
</div>
<div>
<slot></slot>
</div>
</div>
</template>
<script lang="ts>
import {definedComponent} from "vue";
export default definedComponent({
name: "ZCheckbox",
setup(props, ctx){
}
})
</script>
CheckboxGroup.vue
<template>
<div>
checkbox
</div>
</template>
<script lang="ts>
import {definedComponent} from "vue";
export default definedComponent({
name: "ZCheckboxGroup",
props: {
name:{
type:String,
},
inder: {
type:Boolaan,
},
checked: {
type:Boolean
},
disabled:{
type: Boolean,
},
label: [String,Number,Bolean],
modelValue: [String,Number,Boolean]
},
setup(props, ctx){
}
})
</script>
yarn install
export interface CheckboxProps{
inder?:boolean,
checked?:boolean,
name?:string,
disabled?:boolean,
label?:string|number|boolean,
modelValue?:string|number|boolean,
}
let V = reactive([])
let V = reactive({
list: null
})
<input v-model="model" :checked="isChecked" />
setup(props,ctx){
const {emit} = getCurrentInstance();
const model = computed({
get(){
return props.modelValue
},
set(val){
emit("update:modelValue", val)
}
})
const isChecked = computed(()=>{
return props.modelValue;
})
return {
model,
isChecked
}
},
emits: ['update:modelValue']
emits:['change'],
setup(props,ctx){
const handlerChange = (e:InputElement) => {
const target = e.target as HTMLInputElement
const changeVal = target.checked:true:false
ctx.emit("change", changeVal)
}
}
checkbox-group
CheckboxGroup.vue
<template>
<div class="z-checkbox-group">
<slot></slot>
</div>
</template>
<script lang="ts>
// 这里的v-model绑定一定不要reactive否则不生效 数组 因为直接改地址了用ref
import {definedComponent} from "vue";
export default definedComponent({
name: "ZCheckboxGroup",
props: {
modelValue: Array // 父组件传递给子组件传递给modelValue
},
emits: ['change',"update:modelValue"],
setup(props, ctx){
const cpd:ComputedRef = computed({
get(){
return props.modelValue
}
})
// 儿子修改了通知父亲
const changeEvent = (val) => {
const INS = getInstance();
INS.emit("change", val);
INS.emit("update:modelValue", val);
}
provide('ZCheckboxGroup', {
name: 'ZCheckboxGroup',
cpd,
changeEvent
});
}
})
</script>
// 子组件的改造。 ZCheckbox
checkbox.vue
<template>
<div>
<div>
<input type="checkbox" />
</div>
<div>
<slot></slot>
</div>
checkbox
</div>
</template>
<script lang="ts>
import {definedComponent} from "vue";
export default definedComponent({
name: "ZCheckbox",
setup(props, ctx){
// 儿子要把provide的数据拿过来用
// 如果用了checkbox-group现在没有modelValue了
// inject
const IJ = inject<any>('ZCheckboxGroup', {});
if(IJ.name){
const model = computed({
get(){
return IJ.modelValue?.value || props.modelValue
},
set(val){
if(IJ.name) {
return IJ.changeEvent?.(val);
} else {
emit("update:modelValue", val);
}
}
})
}
if(IJ.name && Array.isArray(model.value)){
if(model.value.includes(props.label)){
} else {
}
}
}
})
</script>
// 计算属性的类型是ComputedRef
// <input 如果v-model="这里面的这个玩意是个数组" 需要带着:value="值" /> 这么来玩 vue的特点。对于checkbox而言 vue3 v-model 和 value 不冲突了。 vue2只要前面那个行了。VUE3需要多个:value