跳到主要内容

vue3.4 defineModel 默认值相关

难

难得一见

前端

2024年12月28日 1,568 次阅读
本页目录

 

在传递的为基本数据类型的时候,在父组件没有传递值的时候会出现第一次加载无法同步. 当然子组件后续更新还会同步.

//父组件:
<script lang="ts" setup>
import { ref } from "vue";
import TestWidget from "@/views/test/components/test-widget.vue";

const id = ref<number>(null);
console.log(id.value);
</script>

<template>
  <div>
    <div class="bg-blue">父:{{ id }}</div>
    <div class="mt-10">
      <test-widget  v-model="id"/>
    </div>
  </div>
</template>

// 子组件:

<script lang="ts" setup>
const val = defineModel<number>({default:10});
console.log(val.value);
function test() {
  val.value++;
  console.log(val.value);
}
</script>

<template>
  <div>
    val:{{ val }}
    <el-button @click="test">test</el-button>
  </div>
</template>

解决办法是可以给v-model值设置为null也就是 `const id = ref<number>(null);`

出现此问题原因我的理解为undefined无法传递, 甚至传递null也是可以传递的值,undefined是值都不存在,不存在所以无法传递.导致第一次无法同步.
后续的更新会通过类似`emit('update:modelValue', value)`更新,从而父组件的 id 的赋值, 从而重新同步.

以上问题只是v-model是基本数据类型, 如果为引用类型的话...  `ref()` 视图无法更新. `ref(null)`的情况下父组件的v-model值会同步子组建defineModel的值为`null`, 如果子组建中对数组,对象中的元素的操作会报错.
 

//父组件
<script lang="ts" setup>
import { ref } from "vue";
import TestWidget from "@/views/test/components/test-widget.vue";

const id = ref<number[]>();
console.log(id.value);
</script>

<template>
  <div>
    <div class="bg-blue">父:{{ id }}</div>
    <div class="mt-10">
      <test-widget  v-model="id"/>
    </div>
  </div>
</template>

//子组件
<script lang="ts" setup>
const val = defineModel<number[]>({default:[10]});
console.log(val.value);
function test() {
  val.value[0]++;
  console.log(val.value);
}
</script>

<template>
  <div>
    val:{{ val }}
    <el-button @click="test">test</el-button>
  </div>
</template>


总结一下就是default还是很有作用的,尤其是在新建子组件调试过程中,只要保证传入的v-model不为undefined就可以了了.

Related

相关文章

同分类文章 →
2025年06月10日 前端

gemini-2.5-pro-0605 按图生成html效果测试

Gemini 最新推出的 2.5 版本真的有点东西。之前用过不少 AI 辅助写代码的工具,但这次它的&ldquo;图生 HTML&rdquo;功能确实让我眼前一亮&mdash;&mdash;上传一张设计图,它不仅能快速识别布局和元素,还能生成结构清晰、样

2025年03月14日 前端

css flex-1和overflow-hidden结合使用详解:弹性布局与内容溢出控制

在 Flexbox 布局中,flex: 1 和 overflow: hidden 是两个常用的属性,它们组合使用可以有效地控制子元素的尺寸和内容显示。flex: 1 的作用:当子元素设置 flex: 1 时,它会根据 Flex 容器的主轴方向,自动伸缩以填充剩余的可用

2025年03月13日 前端

Vue 3中实现处理后的v-model双向绑定

在Vue 3中,当你需要对v-model传入的值进行处理后再展示或使用时,可以使用计算属性的getter和setter来实现这种处理过程的双向绑定。 实现步骤 接收父组件传递的v-model值 创建计算属性,在getter中处理展示值,在setter中处

WeChat

扫码加我微信

微信二维码