标题Vue 2.0常用传值方式 父传子、子传父、非父子组件传值,及$emit,$on问题
转载 https://blog.youkuaiyun.com/lander_xiong/article/details/79018737
摘要:在Vue的框架开发的项目过程中,经常会用到组件来管理不同的功能,有一些公共的组件会被提取出来。这时必然会产生一些疑问和需求?比如一个组件调用另一个组件作为自己的子组件,那么我们如何进行给子组件进行传值呢?如果是电商网站系统的开发,还会涉及到购物车的选项,这时候就会涉及到非父子组件传值的情况。当然你也可以用Vuex状态管理工具来实现,这部分我们后续会单独介绍。我先给大家介绍Vue开发中常用的三种传值方式。
Vue常用的三种传值方式有:
父传子
子传父
非父子传值
父子组件的关系可以总结为 prop 向下传递,事件向上传递。父组件通过 prop 给子组件下发数据,子组件通过事件给父组件发送消息,如下图所示
1.父组件向子组件进行传值
父组件
v-bind 传值 可直接简写为 :
无论是否加冒号都是子组件的一个属性,v-bind/: 即意味着动态赋值 不加就是静态变量 传递数字/bool/数组/对象
传一个静态的prop的值
<blog-post title="My journey with Vue"></blog-post>
传入一个对象的所有属性
如果你想要将一个对象的所有属性都作为 prop 传入,你可以使用不带参数的 v-bind (取代 v-bind:prop-name)。例如,对于一个给定的对象 post:
关于prop内容转载于https://www.jianshu.com/p/072fb76d5baa
向子组件传递 属性inputName 绑定的值为name (个人感觉就是给子组件绑了个属性inputName)
子组件
Prop Html中的特性名是大小写不敏感的,所以浏览器会把所有的大写都解释成小写
在子组件上使用
??? 不行啊 还是名称一样才访问的到 回来再试试
组件中使用camelCased(驼峰式)命名,在html中应改为kebab-case(短横线)命名方式。没问题
子组件使用props来声明获取的数据
props:[message] 可以是数组来接受父组件的数据
Props 也可以是对象,对象允许配置高级的选项,类型的判断,数据的校验,默认值设置
Type 校验数据类型 required 必须要绑定属性 必须传值 对于不是必须传的值我们可以设置默认值,人为设置数据的校验 validator:function(val){} 来判断 也会显示但是会报错
假如我们传递的不是一个基本数据类型是一个对象那么我们在设置默认值时使用工厂函数(工厂函数及返回一个对象)
子组件通过props 接受父组件的inputName
单向数据流
所有的prop之间都是形成 单向的下行绑定。
父级的v-bind绑定内容的更新会向下流动到子组件,但是反过来就不行。这样式为了从子组件意外的修改父组件的内容。从而导致你的应用数据流难以理解。
另外,每次父级组件发生更新时,子组件中的值每次都会刷新为最新的值。这意味着你不应该在一个子组件中直接改变他的状态prop。最好还是通过父级组件进行修改,这样的一个数据流才是正确的,如果不这样做,vue会发出警告。
方式1 如果子组件想把prop作为局部属性来使用 不影响父组件(对象不行,可以先深拷贝通过JSON)
方式2 子组件修改数据同步更新到父组件
1.使用.Sync vue2.0不支持 再通过emit 函数来改变mymessage 但是破坏了单向数据流 同子传父
2.将基本数据类型整合为对象 整合为对象他们的地址指向都是相同的
假如传递的是对象直接修改对象的属性是可以的不需要再使用sync, 修改对象属性可以 修改对象不行 this.user=0 不行
2.子组件向父组件传值
需要子组件手动发送给父组件 使用当前vue 组件的$emit 方法 ,父组件在使用子组件的地方监听子组件触发的事件,并且定义方法获取数据
子组件
子组件通过$emit 方法来将值传递给父组件
父组件
父组件通过v-on监听子组件
3.非父子组件进行传值
非父子组件之间传值,需要定义个公共的公共实例文件bus.js,作为中间仓库来传值,不然路由组件之间达不到传值的效果。$emit $on 都是vue实例的方法
公共bus.js
组件A:
组件B
在父子组件,兄弟组件传值时 我们很有可能进行赋值操作
在父子组件传值中Vue父子组件传值,子组件数据只更新一次,之后更改父组件的数据,子组件不再更新
使用watch 监听传过来值的变化在进行赋值
以上这篇vue中父子组件传值,解决钩子函数mounted/created只运行一次的操作
使用bus 传值时对于兄弟组件传值存在 $on没有被绑定 $emit监听不到
子组件传递给父组件不会有这种操作使用this.$emit 子组件在使用v-on 监听,父组件肯定就已经实例化了
利用eventBus解决,并进行页面动态响应
转载https://blog.youkuaiyun.com/qq_36490598/article/details/104684868
利用eventBus来解决,而且组件不直接通过$on来存储数据,而是利用bus实例来存储数据,然后组件只负责来获取数据。
Bus 来监听数据变化 并保存
在跳转方法中,触发$ emit事件
将数据保存,在需要传送的页面 使用computed 的属性来接受数据,动态刷新
利用vm.$nexttick
官方文档是这样解释的:Vue 在更新 DOM 时是异步执行的,为了在数据变化之后等待 Vue 完成更新 DOM,可以在数据变化之后立即使用 Vue.nextTick(callback)。这样回调函数将在 DOM 更新完成后被调用。
补:Slot 内容分发 位置 槽 用来获取组件中的原内容
一般我们使用模板时在模板中间写的内容不会比绑定在dom 上
定义一个模板hello 中间使用solt 标签 再调用<hello></hello>
时我们会显示出组件中间的内容,假如组件没有内容那么会默认显示solt 标签内的内容
通过name属性来决定模板之间内容的显示位置