• Vue3中 子组件内v-model绑定props接收到参数时报错update:modelValue


     开发过程中二次封装了一个搜索的组件,子组件内使用了el-select和el-input

    参数分别对应父组件传入的selectValueselectText参数

    子组件内部@change@input事件来同步触发组件中数据的修改

    最终本地开发环境一切正常,部署到测试环境和生产环境后出现下方报错:

    selectValue is not defined at d.onUpdate:modelValue.s..s.

    报错后开始反复查看本地都是没有任何警告的,但是测试环境就是有问题,没有办法只能根据控制台报错找原因,onUpdate:modelValue应该是在子组件内触发父组件修改导致的错误,但是确实给el-select绑定了@change事件。

    后续参考Vue官网对于props的介绍,应该是@change事件的触发时机问题,虽然在数据改变后立马进行了emit,但还是不符合vue中props的单向数据流原则,解决方案:

    Props | Vue.jsVue.js - 渐进式的 JavaScript 框架https://cn.vuejs.org/guide/components/props.html#one-way-data-flow

    • 在子组件内定义两个变量
    • 以计算属性的方式在get内第一时间接收父组件传入数据的变化
    • 当子组内v-model绑定的数据发生变化时,在set内触发父组件数据更新

    原报错代码:

    html结构:

    1. class="searchBox">
    2. <div>
    3. <el-select
    4. v-model="selectValue"
    5. :style="{ width: selectWidth }"
    6. @change="emit("update:selectValue", selectValue)"
    7. >
    8. <el-option
    9. v-for="item in options"
    10. :key="item.value"
    11. :label="item.label"
    12. :value="item.value"
    13. />
    14. el-select>
    15. <el-input
    16. v-model.trim="searchText"
    17. @input="emit('update:searchText', searchText.trim())"
    18. :placeholder="`请输入要查找的${selectLabel}`"
    19. @keyup.enter="emit('getTemplate')"
    20. >
    21. el-input>
    22. <el-button type="primary" @click="emit('getTemplate')">搜索el-button>
    23. div>
  • js:

    1. const emit = defineEmits([
    2. "openDialog",
    3. "getTemplate",
    4. "update:selectValue",
    5. "update:searchText",
    6. ]);
    7. const props = defineProps({
    8. selectValue: String,
    9. searchText: String,
    10. showAddBtn: {
    11. type: Boolean,
    12. default: true,
    13. },
    14. selectWidth: {
    15. type: String,
    16. default: "100px",
    17. },
    18. options: {
    19. type: Array,
    20. default: () => [],
    21. },
    22. });

    后续使用了compute计算属性get/set来触发props数据的修改就解决了问题

    修改后代码:html中删除@change和@input事件后,基于上方js代码添加:

    1. //在上面js代码基础上加上
    2. const selectValue = computed({
    3. get: () => props.selectValue,
    4. set: (val) => {
    5. emit("update:selectValue", val);
    6. },
    7. });
    8. const searchText = computed({
    9. get: () => props.searchText,
    10. set: (val) => emit("update:searchText", val),
    11. });

  • 相关阅读:
    MySQL 视图(详解)
    计算机毕业设计ssm高校车辆租赁管理系统23qhn系统+程序+源码+lw+远程部署
    Apache Hudi 流转批 场景实践
    一个插件帮你快速、免费下载两个网站的高清无水印LOGO!
    基于SSM的个人网站的设计与实现
    如何进行前端单元测试?
    Linux内核驱动开发-001字符设备开发-内核中断驱动独立按键
    【毕业设计】医学大数据分析 - 心血管疾病分析
    Mybatis 08
    Python 二叉树的创建与遍历
  • 原文地址:https://blog.csdn.net/SunFlower914/article/details/128207339