当前位置: 首页 > 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 向下传递给子组件,而子组件不能直接修改这些数据。如果子组件需要修改数据,应该通过事件通知父组件,由父组件更新数据。这种机制确保了组件之间的关系清晰,易于维护。

相关文章:

  • 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下载和安装配置——附安装包
  • 涉嫌严重违纪违法,57岁证监会副主席王建军被查
  • 水利部将联合最高检开展黄河流域水生态保护专项行动
  • 白玉兰奖征片综述丨国产剧集创作的此消彼长
  • 陈文清:推进扫黑除恶常态化走深走实,有力回应人民群众对安居乐业的新期待
  • 西班牙葡萄牙遭遇史上最严重停电:交通瘫了,通信崩了,民众疯抢物资
  • 美乌总统梵蒂冈会谈,外交部:望有关各方继续通过对话谈判解决危机