vue 组件之间通信
本文于1006天之前发表,文中内容可能已经过时。
props/$emit
v-model
- 语法糖,子组件通过this.$emit(‘input’, value)更新父组件v-model绑定的值
sync
- 语法糖,子组件通过this.$emit(‘update:xx’, value)更新父组件:xx.sync=”value”里面的value的值
$parent/$children
- 尽量不要用
$ref
v-bus
|
|
vuex
- 需要注意页面刷新,整个store清空,可以通过插件实现数据持久化,本质就是利用缓存
inheritAttrs $attrs/$listeners
- 可以少写很多props,通过$attrs将属性一层一层往下传递,组件库使用比较方便
- 父组件123456789101112131415161718192021222324252627282930313233// 父组件<template><f-son :name="name":age="age"@on-ok="ok"@on-change="changeName"></f-son></template><script>import Fson from './Fson.vue'export default{data() {return {name: '章三',age: 12}},methods: {changeName(value) {this.name = value},ok() {conosle.log(222)}},components: {Fson}}</script>
- 父组件
- 子组件12345678910111213141516171819202122232425// 子组件<template><div><grand-son v-bind="$attrs" v-on="$listeners">{{name}}</grand-son></div></template><script>import GrandSon from './GrandSon'export default{inheritAttrs: false, //默认是true,如果不设置为false则所有不用prop继承的属性都将绑定到父组件的div上creted() {console.log(this.$attrs) // {name: '章三', age: 12}console.log(this.$listeners)// {// on-ok: ƒ invoker()// on-change: ƒ invoker()// }},components: {GrandSon}}</script>
- 子组件
- 孙组件1234567891011121314151617181920// 孙组件<template><div><div>{{$attrs.name}} {{$attrs.age}}</di></div></template><script>export default{inheritAttrs: false, //默认是true,如果不设置为false则所有不用prop继承的属性都将绑定到父组件的div上creted() {console.log(this.$attrs) // {name: '章三', age: 12}console.log(this.$listeners)// {// on-ok: ƒ invoker()// on-change: ƒ invoker()// }}}</script>
- 孙组件
provide/inject
- 组件库使用较多,在最顶级定义provide,可以跨级传递属性,只需要在要用的组件中inject一下,不会双向绑定,除非provide的值为data里面的引用
- 顶级组件1234567891011121314151617// 顶级组件<template><div></div></template><script>export default{provide () {return {firstName: '张',secondeName: 'fsafdsa',}}}</script>
- 顶级组件
- 用到的组件12345678910111213141516// 用到的组件<template><div>{{firstName}}</div></template><script>export default{inject: {firstName: {default: ''}}}</script>
- 用到的组件