首先让我们看一下这张图,表示了一个多级关联的组件嵌套 为什么要用$attrs 和 $listeners 先让我们来想一种情况,就是组件A跟组件C怎么通信,我们可以有多少中解决方案?
首先让我们看一下这张图,表示了一个多级关联的组件嵌套
$attrs
和 $listeners
先让我们来想一种情况,就是组件A跟组件C怎么通信,我们可以有多少中解决方案?
在很多开发情况下,我们只是想把组件A的数据传给组件C,如果用props来进行组件通信的话,虽然可以实现,但是代码可读性上不强,且难维护。
所以这时候,我们的主角$attrs
和 $listeners
就出现了
$attrs
和 $listeners
的用法在vue2.4中,为了解决该需求,引入了$attrs
和$listeners
, 新增了inheritAttrs
选项。 在版本2.4以前,默认情况下父作用域的不被认作props的属性属性百年孤独,将会“回退”且作为普通的html特性应用在子组件的根元素上。如下列的例子
父组件的代码:
<template>
<div>
<child-dom :foo="foo" :bar="bar"></child-dom>
</div>
</template>
<script>
import ChildDom from "../components/attrs/ChildDom.vue";
export default {
components: {
ChildDom,
},
data() {
return {
foo: "foo",
bar: "bar",
};
},
};
</script>
子组件的代码:
<template>
<div>
<p>foo:{{ foo }}</p>
</div>
</template>
<script>
export default {
props: ["foo"],
};
</script>
我们先看一下这样写的时候,控制台打印出来的dom结构是这样的:
在2.4中新增选项inheritAttrs
,inheritAttrs
的默认值为true, 将inheritAttrs
的值设为false, 这些默认的行为会禁止掉。但是通过实例属性 $attrs
,可以将这些特性生效,且可以通过v-bind
绑定到子组件的非根元素上。
将子组件的代码修改一下:
<template>
<div>
<p>foo:{{ foo }}</p>
<p>attrs: {{ $attrs }}</p>
<dom-child v-bind="$attrs"></dom-child>
</div>
</template>
<script>
import DomChild from "./DomChild.vue";
export default {
props: ["foo"],
inheritAttrs: false,
components: {
DomChild,
},
};
</script>
然后在加一个孙组件
<template>
<div>
<p>bar:{{ bar }}</p>
</div>
</template>
<script>
export default {
props: ["bar"],
};
</script>
页面显示如下:
从上面的代码,可以看出使用$attrs
,inheritAttrs
属性能够使用简洁的代码,将组件A的数据传递给 组件C,该场景的使用范围还是挺广的。
那我们现在来看看组件C怎么传值给组件A?
vue2.4版本新增了$listeners
属性,我们在组件B上 绑定 v-on=”$listeners”
, 在组件A中,监听组件C触发的事件。就能把组件C发出的数据,传递给组件A。
修改一下父组件的代码:
<template>
<div>
<child-dom :foo="foo" :bar="bar" @upFoo="update"></child-dom>
</div>
</template>
<script>
import ChildDom from "../components/attrs/ChildDom.vue";
export default {
components: {
ChildDom,
},
data() {
return {
foo: "foo",
bar: "bar",
};
},
methods: {
update(val) {
this.foo = val;
console.log("update success");
},
},
};
</script>
子组件代码:
<template>
<div>
<p>foo:{{ foo }}</p>
<p>attrs: {{ $attrs }}</p>
<dom-child v-bind="$attrs" v-on="$listeners"></dom-child>
</div>
</template>
<script>
import DomChild from "./DomChild.vue";
export default {
props: ["foo"],
inheritAttrs: false,
components: {
DomChild,
},
};
</script>
孙组件代码:
<template>
<div>
<p>bar:{{ bar }}</p>
<button @click="startUpFoo">我要更新foo</button>
</div>
</template>
<script>
export default {
props: ["bar"],
methods: {
startUpFoo() {
this.$emit("upFoo", "foooooooooooo");
console.log("startUpFoo");
},
},
};
</script>
运行结果:
现在我们应该清楚了$attrs
,$listerners
,inheritAttrs
的作用了吧
到此这篇关于vue $attrs和$listeners的使用与区别的文章就介绍到这了,更多相关vue $attrs $listeners内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: vue$attrs和$listeners的使用与区别
本文链接: https://lsjlt.com/news/138654.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-01-12
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0