Vue中的单向数据流原则详解

 更新时间:2025年03月24日 09:41:07   作者:Hejjon  
这篇文章主要介绍了Vue中的单向数据流原则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

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 向下传递给子组件,而子组件不能直接修改这些数据。

如果子组件需要修改数据,应该通过事件通知父组件,由父组件更新数据。这种机制确保了组件之间的关系清晰,易于维护。

相关文章

  • webstorm vue开发配置方式

    webstorm vue开发配置方式

    这篇文章主要介绍了webstorm vue开发配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • 通过实例解析vuejs如何实现调试代码

    通过实例解析vuejs如何实现调试代码

    这篇文章主要介绍了通过实例解析vuejs如何实现调试代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • vue 移动端注入骨架屏的配置方法

    vue 移动端注入骨架屏的配置方法

    骨架屏就是在页面未渲染完成的时候,先用一些简单的图形大致勾勒出页面的基本轮廓,给用户带来更好的体验。这篇文章主要介绍了vue 移动端注入骨架屏,需要的朋友可以参考下
    2019-06-06
  • Vue3中页面重定向的方式汇总

    Vue3中页面重定向的方式汇总

    Vue3 中页面重定向主要依赖 Vue Router 4,这是一个Vue3 配套的路由库,具体分为路由配置式重定向、编程式导航重定向和路由守卫重定向三类场景,以下是各种方式汇总,需要的朋友可以参考下
    2025-12-12
  • 关于vue2响应式缺陷的问题

    关于vue2响应式缺陷的问题

    这篇文章主要介绍了关于vue2响应式缺陷的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • vue路由$router.push()使用query传参的实际开发使用

    vue路由$router.push()使用query传参的实际开发使用

    在vue项目中我们用函数式编程this.$router.push跳转,用query传递一个对象时要把这个对象先转化为字符串,然后在接收的时候要转化为对象,下面这篇文章主要给大家介绍了关于vue路由$router.push()使用query传参的实际开发使用,需要的朋友可以参考下
    2022-11-11
  • 基于axios 的responseType类型的设置方法

    基于axios 的responseType类型的设置方法

    今天小编就为大家分享一篇基于axios 的responseType类型的设置方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • vue限制输入框只能输入8位整数和2位小数的代码

    vue限制输入框只能输入8位整数和2位小数的代码

    这篇文章主要介绍了vue限制输入框只能输入8位整数和2位小数,文中我们使用v-model加watch 实现这一个功能,代码简单易懂,需要的朋友可以参考下
    2019-11-11
  • 关于delete和Vue.delete的区别及说明

    关于delete和Vue.delete的区别及说明

    这篇文章主要介绍了关于delete和Vue.delete的区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Vue3 中的ref与props属性详解

    Vue3 中的ref与props属性详解

    这篇文章主要介绍了Vue3 中的ref与props属性知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-04-04

最新评论