当前位置: 首页 > news >正文

Vue 中单向数据流原则

做一个 ElementUI 弹框组件的二次封装

效果如下:

点击取消按钮发现弹出如下报错信息 :

[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "dialogVisible"

错误的写法:

子组件 MyDialog3.vue

<!-- 子组件 -->
<template>
  <!-- elmentui 的 Dialog -->
  <el-dialog :title=title
             :visible="dialogVisible">
    <span slot="footer" class="dialog-footer">
    <el-button @click="handleCancel">取 消</el-button>
    <el-button type="primary" @click="">确 定</el-button>
  </span>
  </el-dialog>
</template>

<script>
export default {
  name: "MyDialog3",
  props: ['title', 'dialogVisible'],
  methods: {
    handleCancel() {
      this.dialogVisible = false;     // 这是错误的写法, 不能在子组件中直接修改props的值
    }
  }
}
</script>

<style scoped>

</style>

父组件 MyDialog3Test.vue

<template>
  <div>
    <el-button @click="btnClick">点我弹框</el-button>
    <MyDialog3
        :title="headerText"
        :dialog-visible="dialogShow">
    </MyDialog3>
  </div>
</template>

<script>
import MyDialog3 from "@/components/dialog3/MyDialog3";

export default {
  name: "MyDialog3Test",
  components: {MyDialog3},
  data() {
    return {
      headerText: '测试弹框',
      dialogShow: false,
    }
  },
  methods: {
    btnClick() {
      this.dialogShow = true;
    }
  }
}
</script>

<style scoped>

</style>

出现这个错误的原因是 父子组件在进行通信时, 子组件直接修改了 props的某个属性的值. 

在 Vue.js 中,直接修改 prop(属性)的值是被严格禁止的,因为这会导致父子组件之间的数据流变得难以追踪和调试。Vue 设计之初就采用了单向数据流的原则,即父组件通过 prop 向下传递数据到子组件,而子组件应该通过事件(如自定义事件)来通知父组件更新数据,而不是直接修改 prop 的值。

正确的写法如下:

在子组件中取消按钮的点击事件中不修改  dialogVisible 属性的值, 而是通过 $emit 发送一个自定义事件 dialog-close, 在父组件中使用 @dialog-close 去申明处理这个事件. 代码如下:

子组件:

父组件: 

总结: 

在 Vue.js 中,单向数据流(One-Way Data Flow)是一个重要的设计理念,指的是数据从父组件通过 props 向下传递给子组件,而子组件不能直接修改这些数据。如果子组件需要修改数据,应该通过事件通知父组件,由父组件更新数据。这种机制确保了组件之间的关系清晰,易于维护。


文章转载自:
http://balkhash.dxwdwl.cn
http://barbiturate.dxwdwl.cn
http://anisocytosis.dxwdwl.cn
http://ashler.dxwdwl.cn
http://catabolize.dxwdwl.cn
http://armure.dxwdwl.cn
http://buckayro.dxwdwl.cn
http://anagnorisis.dxwdwl.cn
http://bolus.dxwdwl.cn
http://bizonal.dxwdwl.cn
http://cafeteria.dxwdwl.cn
http://blinding.dxwdwl.cn
http://apprehensible.dxwdwl.cn
http://camaron.dxwdwl.cn
http://approximatively.dxwdwl.cn
http://arhythmical.dxwdwl.cn
http://astride.dxwdwl.cn
http://aarp.dxwdwl.cn
http://beginning.dxwdwl.cn
http://bema.dxwdwl.cn
http://bullboat.dxwdwl.cn
http://cameraman.dxwdwl.cn
http://bardic.dxwdwl.cn
http://allergy.dxwdwl.cn
http://assent.dxwdwl.cn
http://anesthesiologist.dxwdwl.cn
http://azure.dxwdwl.cn
http://bopomofo.dxwdwl.cn
http://apres.dxwdwl.cn
http://basifugal.dxwdwl.cn
http://www.dtcms.com/a/33007.html

相关文章:

  • 2025-spring boot 之多数据源管理
  • HyperGraph(超图)
  • 【Redis数据结构】ziplist 压缩列表
  • nginx 反向代理 配置请求路由
  • 【网络编程】广播和组播
  • 【RK3588嵌入式图形编程】-SDL2-构建交互式按钮
  • 基于python+django的宠物商店-宠物管理系统源码+运行步骤
  • J4打卡—— ResNet 和 DenseNet结合实现鸟类分类
  • 用AI写游戏3——deepseek实现kotlin android studio greedy snake game 贪吃蛇游戏
  • 【quicker】调节PPT指定字号字体大小/快速调节WPS的PPT字体大小
  • 三级分类bug解决
  • 作用域的知识点总结
  • Day6 高精度加减算法+洛谷讲解
  • 开源RAG主流框架有哪些?如何选型?
  • 算法系列之分治算法
  • 从底层驱动到 OpenCV:深入解析 Linux 摄像头完整技术栈
  • 安全生产月安全知识竞赛主持稿串词
  • 基于Python和Neo4j开发的医疗辅助诊断系统的详细实现步骤和代码示例
  • Python--函数进阶(上)
  • Unity制作游戏——前期准备:Unity2023和VS2022下载和安装配置——附安装包
  • ESP32S3:解决RWDT无法触发中断问题,二次开发者怎么才能使用内部RTC看门狗中断RWDT呢?
  • 力扣热题100——滑动窗口
  • 【java】类和对象
  • 使用 AndroidNativeEmu 调用 JNI 函数
  • k8s学习记录:环境搭建(基于Kubeadmin)
  • 从入门到精通Rust:资源库整理
  • 【YOLOv11改进- 主干网络】YOLOv11+RepViT: 从ViT的角度重新审视Mobile的CNN助力YOLOv11有效涨点;
  • 解决Spring Boot中Druid连接池“discard long time none received connection“警告
  • DeepSeek R1的崛起与挑战:技术创新 与 普通人的反思
  • HTML之JavaScript DOM编程获取元素的方式