vue3 useVModel 实现父子组件双向数据绑定。

子组件触发 click 事件之后传值给父组件。

子组件代码

  <div @click="changeChecked()">
    <i v-if="checked" class="iconfont icon-checked"></i>
    <i v-else class="iconfont icon-unchecked"></i>
    <span v-if="$slots.default"><slot /></span>
  </div>
<script setup>
import { useVModel } from "@vueuse/core";
import {  defineProps, defineEmits } from "vue";
const emit = defineEmits(["update:modelValue",change]);

const props = defineProps({
  modelValue: {
    type: Boolean,
    default: false
  }
});

// @vueuse/core 的实现
   // 使用 useVModel 实现双向数据绑定 v-model 指令
    // 1. 使用 props 接收 modelValue
    // 2. 使用 useVModel 来包装props中的 modelValue 属性数据
    // 3. 在使用 checked.value就是使用父组件数据
    // 4. 在使用 checked.value = '数据' 赋值的时候,就会自动触发 emit('update:modelvalue', '数据')
    // 5. 也可以手动触发别的事件 例如这里的 change
const checked = useVModel(props,'modelValue',emit)
const changeChecked=()=>{
    const newValue = !checked.value
    // 通知父组件
    checked.value = newValue
    // 让组件触发 change 事件
    emit('change',newValue)
}
</script>

父组件代码

<template>
<div class='sub-category'>
    <div class="container">
      <!-- 复选框 -->
      <XtxCheckBox v-model="isAllChecked" @change="handleChange">
      {{isAllChecked}}
      </XtxCheckBox>
    </div>
 </div>
</template>
<script setup>
import {ref}from 'vue'
import XtxCheckBox from '@/components/library/xtx-check-box.vue';
const isAllChecked = ref(true)
const handleChange=(val)=>{
  console.log('Change',val);
}
</script>
<style scoped lang="less"></style>

子组件触发事件的时候在vue devtools 里面观察父组件的数据也发生改变。

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值