vue单向数据流的深入理解

目录
  • 官网解释
  • 单向数据流是什么
  • 示例
    • a-input原始用法
    • 组件代码
  • 使用场景
  • 总结

官网解释

所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。额外的,每次父级组件发生变更时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。

单向数据流是什么

单向数据流指只能从一个方向来修改状态。下图是单向数据流的极简示意:

与单向数据流对对应的是双向数据流(也叫双向绑定)。在双向数据流中,Model(可以理解为状态的集合) 中可以修改自己或其他Model的状态, 用户的操作(如在输入框中输入内容)也可以修改状态。这使改变一个状态有可能会触发一连串的状态的变化,最后很难预测最终的状态是什么样的。使得代码变得很难调试。如下图所示:

与双向数据流比,在单向数据流中,当你需要修改状态,完全重新开始走一个修改的流程。这限制了状态修改的方式,让状态变得可预测,容易调试。

示例

我们通过一个示例来解释单向数据流与双向绑定,这个示例是对ant-design-vue表单组件的二次封装

a-input原始用法

<template>
    <a-input v-model='data'/>
</template>

<script>
export default {
    data() {
        return {
            data: ''
        }
    }
}
</script>

在data中声明的属性会通过Object.definePropty方法为其添加get和set方法,使其成为响应式数据。v-model是一个语法糖,在vue 2.2.0版本后新增了model属性

官方解释

允许一个自定义组件在使用 v-model 时定制 prop 和 event。默认情况下,一个组件上的 v-model 会把 value 用作 prop 且把 input 用作 event,但是一些输入类型比如单选框和复选框按钮可能想使用 value prop 来达到不同的目的。使用 model 选项可以回避这些情况产生的冲突。

我们利用这个属性来对上述input组件做二次封装

组件代码

<template>
    <a-input :value='currentValue' @change='onInputChange'/>
</template>

<script>
export default {
    data() {
        return {
            currentValue: this.value
        }
    },

    model: {
        event: 'change',
        prop: 'value'
    },
    props:{
        value: {
            type: String
        }
    },
    watch: {
        value: {
            handler(newVal) {
                this.currentValue = newVal
            }
        }
    },

    onInputChange(e) {
        this.$emit('change', e.target.value)
    }
}
</script>

在父组件中使用

<template>
    <my-input v-model='data' />
</template>

<script>
export default {
    data() {
        return {
            data:''
        }
    }
}
</script>

上述子组件中的currentValue是实际input组件的值,他的值是根据父组件传入的值得出的,input标签组件的change事件来触发父组件的change事件,从而改变传入子组件props中value的值。这就解释了单项数据流,父組件通过props向子组件传递值,子组件通过emit事件来通知父组件修改值,子组件不在自身对父组件传递过来的props做任何修改,都是通过父组件来更新props,从而达到子组件更新自身状态。

使用场景

当我们在实现一个由数据渲染的复杂表单时,那么我们的设计就可以采用这种模式,通过props以及emit传递,保证子组件的事件触发根节点的数据更新,从而更新子孙组件的状态。

总结

到此这篇关于vue单向数据流的文章就介绍到这了,更多相关vue单向数据流内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Vue props 单向数据流的实现

    1.props通信 注意:DOM模板的驼峰命名props要转为短横分割命名. <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <title>Vue</title> </head> <body> <div id="app"> <my-component m

  • vue父子组件传值以及单向数据流问题详解

    目录 前言 1.父组件传值给子组件 2.子组件的 props 类型约束问题 (1)构造函数自定义类型 (2)自定义函数自定义类型 3.单向数据流问题 总结 前言 我们知道 vue 中父子组件的核心概念是单向数据流问题,props 是单向传递的.那究竟什么是单向数据流问题,这篇文章来总结一下关于这个知识点的学习笔记. 1.父组件传值给子组件 <div id="app"> <blog-item :title="title"></blog-i

  • 深入理解Vue 单向数据流的原理

    单向数据流是什么 单向数据流指只能从一个方向来修改状态.下图是单向数据流的极简示意: 单向数据流的极简示意 与单向数据流对对应的是双向数据流(也叫双向绑定).在双向数据流中,Model(可以理解为状态的集合) 中可以修改自己或其他Model的状态, 用户的操作(如在输入框中输入内容)也可以修改状态.这使改变一个状态有可能会触发一连串的状态的变化,最后很难预测最终的状态是什么样的.使得代码变得很难调试.如下图所示: 与双向数据流比,在单向数据流中,当你需要修改状态,完全重新开始走一个修改的流程.这

  • Vue组件之单向数据流的解决方法

    子组件能够通过自身的props选项获取父组件上的数据,但是在默认情况下,props是单向绑定的---当父组件数据(属性)发生变化的时候会传递给子组件,引起子组件的变化,但不能反过来并且不允许子组件直接改变父组件的数据,会报错的.例如: 也就是说当通过一种方法改变父组件数据的时候,子组件与之相关联的props数据也会发生改变,从而影响子组件,但是子组件直接改变从父组件拿过来的props数据却不能影响父组件的原始数据.也就是说一般情况下只能是"父影响子,而不是子影响父". 两种情况: 1.

  • vue单向数据流的深入理解

    目录 官网解释 单向数据流是什么 示例 a-input原始用法 组件代码 使用场景 总结 官网解释 所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行.这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解.额外的,每次父级组件发生变更时,子组件中所有的 prop 都将会刷新为最新的值.这意味着你不应该在一个子组件内部改变 prop.如果你这样做了,Vue 会在浏览器的控制台中发出警告. 单向数

  • vue单向数据流的深入讲解

    目录 vue单向数据流 代码示例 特殊情况 注意点: 总结 vue单向数据流 在vue中需要遵循单向数据流原则 在父传子的前提下,父组件的数据发生会通知子组件自动更新 子组件内部,不能直接修改父组件传递过来的props => props是只读的 代码示例 父组件代码: <template> <div style="border: 1px solid #000"> <h1>我是父组件</h1> <Son :info="

  • 对Angular中单向数据流的深入理解

    变更检测 Angular 中,数据是由顶部根节点流向最后的叶子节点,整个数据流是单向,构成一颗单向树. Angular 认为所有的异步操作都有可能会引起模型的变化,引起数据模型发生变化的事件源有: Events:click, mouseover, keyup ... Timers:setInterval.setTimeout XHRs:Ajax(GET.POST ...) Angular 封装 Zone来拦截跟踪异步,一旦发现异步行为,Angular 就会进行变更检测. 因为数据流是单向的,组件

  • 浅谈Vue的双向绑定和单向数据流冲突吗

    目录 前言 单向绑定 vs 双向绑定 单向数据流 vs 双向数据流 为什么说v-model只是语法糖 总结 参考资料 前言 众所周知,Vue中更加推荐单向数据流的状态管理模式(比如Vuex),但Vue同时支持通过v-model实现双向数据绑定.那么问题来了,单项数据流和双向数据绑定的概念,这两种不是相互冲突的吗?即然能用v-model双向数据绑定,不应该就是双向数据流了吗? 本文主要包括以下内容 单向绑定 vs 双向绑定 单向数据流 vs 双向数据流 为什么说v-model只是语法糖 单向绑定

  • vue插槽slot的简单理解与用法实例分析

    本文实例讲述了vue插槽slot的简单理解与用法.分享给大家供大家参考,具体如下: vue中插槽的使用非常广泛,本文就插槽的使用和理解简单总结. 从字面理解插槽是预先插入一个代码空间,用于后期塞入数据. 插槽分类 匿名插槽     ------------------   匿名的代码空间 具名插槽     ------------------   带有命名的代码空间 作用域插槽 -------------------   带有数据的代码空间 插槽使用示例 匿名插槽 说明在组件中先定义预留的代码空

  • vue缓存之keep-alive的理解和应用详解

    官方解释: <keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们.和 <transition> 相似,<keep-alive> 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在组件的父组件链中. 当组件在 <keep-alive> 内被切换,它的 activated 和 deactivated 这两个生命周期钩子函数将会被对应执行. 主要用于保留组件状态或避免重新渲染. keep-alive 是 Vue 的内置组件,

  • Vue中this.$nextTick()的理解与使用方法

    目录 this.$nextTick()原理: 1.Vue实现响应式并不是数据发生变化之后DOM立即变化,而是按一定的策略进行DOM的更新. 2.Vue官网 3.等价转换,如果this.$nextTick不起作用时尝试用延时器 4.this.$nextTick的应用场景 5.总结 this.$nextTick()原理: Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新. Vue 在修改数据后,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之

随机推荐