vue $attrs、$listeners使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue $attrs、$listeners使用相关的知识,希望对你有一定的参考价值。

参考技术A

父组件调用子组件时,传递除了使用prop接受的以外属性 (class 和 style 除外),都可以使用$attrs获取。
若要多层级组件使用 $attrs,则需要在中间子组件使用 v-bind="$attrs" ,才可以被访问,否则访问$attrs为空对象。

与$attrs类似,是对父组件on事件监听但收集,中间子组件使用v-on="$listeners"可以向该组件内的子组件传递监听器。

在vue3.0中 $listeners被移除!!!

所以,在vue3中使用$attrs即可实现属性和事件监听器的传递。

vue$attrs和$listeners的使用


1、$attrs

1.1、html代码

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>vue_$attrs的使用</title>
    <style>
        .title 
            font-weight: 600;
            margin-right: 2em;
        
    </style>
</head>

<body>
    <div id="app">
        <div>
            <span class="title">A组件</span>
        </div>

        <b-component row="row"></b-component>
    </div>

    <template id="b-component">
        <div>
            <div>
                <span class="title">B组件</span>
                <span>B组件中不需要定义props</span>
            </div>
            <c-component v-bind="$attrs"></c-component>
        </div>
    </template>

    <template id="c-component">
        <div>
            <div>
                <span class="title">C组件</span>
                <span>A组件传过来的值:row</span>
            </div>
        </div>
    </template>

    <script src="/node_modules/vue/dist/vue.js"></script>
    <script src="./index.js"></script>
</body>

1.2、JavaScript代码

// 方式一
// 注意:BC组件定义的顺序不能颠倒
// let CComponent = 
//     name: 'CComponent',
//     template: '#c-component',
// , BComponent = 
//     name: 'BComponent',
//     template: '#b-component',
//     components: 
//         CComponent
//     ,
// ;

// 方式二
let BComponent = 
    name: 'BComponent',
    template: '#b-component',
;
Vue.component('CComponent', 
    name: "CComponent",
    template: '#c-component',
    props: 
        row: 
            type: String,
            dedault: () => ''
        
    
);

new Vue(
    el: '#app',
    components: 
        BComponent
    ,
    data: 
);

1.3、相关文章

CSDN-vue$attrs的使用


2、$listeners

2.1、html代码

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>vue_$listeners的使用</title>
    <style>
        .title 
            font-weight: 600;
            margin-right: 2em;
        
    </style>
</head>

<body>
    <div id="app">
        <div>
            <span class="title">A组件</span>
            <span>C组件传过来的值:row</span>
        </div>

        <!-- childinfo 不区分大小写 -->
        <b-component @childInfo="getInfo"></b-component>
    </div>

    <template id="b-component">
        <div>
            <div>
                <span class="title">B组件</span>
                <span>B组件中不需要定义$emit</span>
            </div>
            <c-component v-on="$listeners"></c-component>
        </div>
    </template>

    <template id="c-component">
        <div>
            <div>
                <span class="title">C组件</span>
            </div>
        </div>
    </template>

    <script src="/node_modules/vue/dist/vue.js"></script>
    <script src="./index_$listeners.js"></script>
</body>

2.2、JavaScript代码

let BComponent = 
    name: 'BComponent',
    template: '#b-component',
;
Vue.component('CComponent', 
    name: "CComponent",
    template: '#c-component',
    mounted() 
        // childinfo 不区分大小写
        // 如果这里的i写为I
        // 则发出告警
        // 且不能触发getInfo函数
        this.$emit("childinfo", "row");
    
);

new Vue(
    el: '#app',
    components: 
        BComponent
    ,
    data: 
        row: ""
    ,

    methods: 
        getInfo: function (row) 
            this.row = row;
        
    
);

2.3、相关文章

CSDN-vue$listeners用法记录


3、完整代码

gitee(码云) - mj01分支 - vue_$attrs_$listeners 文件夹

以上是关于vue $attrs、$listeners使用的主要内容,如果未能解决你的问题,请参考以下文章

Vue 组件通信之$attrs$listeners

Vue2.x $attrs和$listeners

Vue2.x $attrs和$listeners

vue-$attrs和$listeners

Vue 警告 $listeners 和 $attrs 是只读的

vue中$attrs $listeners你会用吗?