Vue基础语法(五)

2023-05-31 23:02:39 浏览数 (1)

一、插槽

1、格式

放在子组件

代码语言:javascript复制
<slot>内容</slot>

2、内容

可以放任何模块的代码

3、原理

父组件引用时,填写内容会被应用到插槽

css模块

代码语言:javascript复制
<style>
    .box{
        width: 200px;
        height: 200px;
        background-color: aqua;
        float: left;
        margin-right: 20px;
    }
</style>

html模块

代码语言:javascript复制
<body>
    <div id="app">
        <cpn>
            <a href="">点击</a>
        </cpn>
        <cpn>
            <button>点击</button>
        </cpn>
        <cpn></cpn>
    </div>
    <template id="cpn">
        <div>
            <div class="box">
                <h1>{{msg}}</h1>
                <slot>
                    <h4>默认内容</h4>
                </slot>
            </div>
        </div>
    </template>
    <script>
        new Vue({
            el:'#app',
            components:{
                cpn:{
                    template:'#cpn',
                    data(){
                        return{
                            msg:'子组件'
                        }
                    }
                }
            }
        })
    </script>
</body>

二、具名插槽

1、定义

使用多个插槽时,给slot添加name属性,设置slot名称

2、步骤

(1)<slot>标签添加绑定name属性

(2)便签显示处用<template>标签包裹,并绑定对应的slot,绑定方法如下:

v-slot:插槽名【注意中间是英文冒号,不是等号】

②缩写:#插槽名

代码语言:javascript复制
<body>
    <div id="app">
        <cpn>
            <template v-slot:slot1>
                <div>
                    <a href="">跳转</a>
                </div>
            </template>
            <template #slot2>
                <div>
                    <a href="">点击</a>
                </div>
            </template>
        </cpn>
        <cpn>
            <template #slot1>
                <div>
                    <button>点击</button>
                </div>
            </template>
            
        </cpn>
    </div>
    <template id="cpn">
        <div>
            <div class="box">
                <slot name="slot1"></slot>
                <h1>{{msg}}</h1>
                <slot name="slot2"></slot>
            </div>
        </div>
    </template>
    <script>
        new Vue({
            el:'#app',
            components:{
                cpn:{
                    template:'#cpn',
                    data(){
                        return{
                            msg:'子组件'
                        }
                    }
                }
            }
        })
    </script>
</body>

三、作用域插槽

1、使用前提

要在具名插槽的基础上使用

2、作用

传递数据,将子组件的数据传递给父组件

3、步骤

(1)先设置好具名插槽

(2)在子组件的<slot>标签上自定义属性名来绑定参数

(3)在父组件的具名插槽上赋值形参接收传参

格式:#插槽名="形参"

代码语言:javascript复制
<body>
    <div id="app">
        <cpn>
            <template #slot1="item">
                <div>
                    <h3>我是一个具名插槽</h3>
                    <h5>{{item}}</h5>
                    <h5>{{item.cityname}}</h5>
                </div>
            </template>
        </cpn>
    </div>
    <template id="cpn">
        <div>
            <h1>{{msg}}</h1>
            <slot name="slot1" :cityName="city.name">
                <h4>默认内容</h4>
            </slot>
        </div>
    </template>
    <script>
        new Vue({
            el:'#app',
            components:{
                cpn:{
                    template:'#cpn',
                    data(){
                        return{
                            msg:'子组件',
                            city:{
                                name:'北京',
                            },
                        }
                    },
                },
            },
        })
    </script>
</body>

 四、子组件向父组件通信总结

1、三步骤

(1)子组件准备好需要传递的参数

自定义方法:this.$emit('自定义方法名',参数1,参数2...)

                        自定义方法名格式:采用复合型name-name

(2)连接标签:通过子组件与父组件的连接关键<cpn></cpn>

(3)父组件接收和存储子组件传递来的参数

2、多参数传递例子

代码语言:javascript复制
<body>
    <div id="app">
        <h4>{{idInfo}}</h4>
        <h4>{{nameInfo}}</h4>
        <h4>{{ageInfo}}</h4>
        <detail @info-transfer="getInfo"></detail>
    </div>
    <template id="detail">
        <div>
            <h1>{{msg}}</h1>
            <button @click="btnClick">传递学生信息</button>
        </div>
    </template>
    <script>
        new Vue({
            el:'#app',
            data:{
                idInfo:'未传递id',
                nameInfo:'未传递name',
                ageInfo:'未传递age',
            },
            methods:{
                getInfo(id,name,age){
                    console.log(id,name,age);
                    this.idInfo = id
                    this.nameInfo = name
                    this.ageInfo = age
                }
            },
            components:{
                detail:{
                    template:'#detail',
                    data(){
                        return{
                            msg:'测试',
                            info:{
                                id:'1',
                                name:'申小兮',
                                age:'18',
                            }
                        }
                    },
                    methods:{
                        btnClick(){
                            this.$emit('info-transfer',this.info.id,this.info.name,this.info.age)
                        }
                    }
                }
            }
        })
    </script>
</body>

0 人点赞