Vue基础语法(四)

2023-05-12 09:19:48 浏览数 (1)

一、父组件向子组件通信

1、数组

(1)例一:选择城市,父组件的数据传递给子组件去显示

编写思路:

①通过v-for建立父组件,并绑定click点击事件传参获取城市

②定义一个city变量,存储获取的城市

③通过props:[],自定义动态绑定名

④同时在父与子关联的cpn标签,进行v-bind动态绑定将父组件的变量city值传递给子组件自定义绑定名,子组件就可以直接通过使用自定义绑定名,直接显示父组件传递的城市

代码语言:javascript复制
<body>
    <div id="app">
        <ul>
            <li @click="btnClick(item,index)" v-for="(item,index) in cityArr">{{item}}</li>
        </ul>
        <cpn :show-city="city"></cpn>
    </div>
    <template id="cpn">
        <div>
            <h1>{{msg}}</h1>
            <h2>{{showCity}}</h2>
        </div>
    </template>
    <script>
        new Vue({
            el:'#app',
            data:{
                cityArr:['上海','重庆','天津','北京'],
                city:'未选择城市'
            },
            methods:{
                btnClick(item,index){
                    console.log(item,index);
                    this.city = item
                },
            },
            components:{
                cpn:{
                    template:'#cpn',
                    data(){
                        return {
                            msg:'我是子组件',
                        }
                    },
                    props:['showCity'],
                }
            }
        })
    </script>
</body>

(2)例二:标题内容

代码语言:javascript复制
<body>
    <div id="app">
        <cpn :title-name="title" :text="content"></cpn>
    </div>
    <template id="cpn">
        <div>
            <h1>{{titleName}}</h1>
            <h3>{{text}}</h3>
        </div>
    </template>
    <script>
        new Vue({
            el:'#app',
            data:{
                title:'父组件的标题',
                content:'父组件的内容'
            },
            components:{
                cpn:{
                    template:'#cpn',
                    props:['titleName','text']
                }
            }
        })
    </script>
</body>

2、对象(建议用这种,更严谨)

(1)例一:选择城市

代码语言:javascript复制
<body>
    <div id="app">
        <ul>
            <li @click="citySelect(item,index)" v-for="(item,index) in cityArr">{{item}}</li>
        </ul>
        <cpn :show-city="city"></cpn>
    </div>
    <template id="cpn">
        <div>
            <h1>我是子组件</h1>
            <h3>{{showCity}}</h3>
        </div>
    </template>
    <script>
        new Vue({
            el:'#app',
            data:{
                cityArr:['重庆','北京','天津','上海'],
                city:'未选择城市',
            },
            methods:{
                citySelect(item,index){
                    console.log(item,index);
                    this.city = item
                }
            },
            components:{
                cpn:{
                    template:'#cpn',
                    props:{
                        showCity:{
                            type:String,
                            default(){
                                return '未选择城市'
                            },
                        }
                    },
                },
            },
 
        })
    </script>
</body>

(2)例二:标题内容

代码语言:javascript复制
<body>
    <div id="app">
        <cpn :title-name="title" :text="content"></cpn>
    </div>
    <template id="cpn">
        <div>
            <h1>{{titleName}}</h1>
            <h3>{{text}}</h3>
        </div>
    </template>
    <script>
        new Vue({
            el:'#app',
            data:{
                title:'父组件标题',
                content:'父组件内容',
            },
            components:{
                cpn:{
                    template:'#cpn',
                    props:{
                        titleName:{
                            type:String,
                            default(){
                                return '默认'
                            }
                        },
                        text:{
                            type:String,
                            default(){
                                return '默认'
                            }
                        },
                    },
                },
            },
        })
    </script>
</body>

(3)注意:

标签无法正常识别大小写,通过v-bind动态绑定的属性要注意驼峰改成-格式

②传输的数据类型一致,否则用对象严谨的方法会报错

二、子组件向父组件通信

1、自定义方法

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

(2)要求方法名name-name的形式

2、选择城市

代码语言:javascript复制
<body>
    <div id="app">
        <h1>{{showCity}}</h1>
        <cpn @city-transfor="getCity"></cpn>
    </div>
    <template id="cpn">
        <div>
            <h1>我是子组件</h1>
            <button @click="btnClick">城市传递</button>
        </div>
    </template>
    <script>
        new Vue({
            el:'#app',
            data:{
                showCity:'未选择城市'
            },
            methods:{
                getCity(city){
                    console.log(city);
                    this.showCity = city
                }
            },
            components:{
                cpn:{
                    template:'#cpn',
                    data(){
                        return {
                            city:{
                                name:'北京'
                            }
                        }
                    },
                    methods:{
                        btnClick(){
                            this.$emit('city-transfor',this.city.name)
                        }
                    }
                },
            }, 
        })
    </script>
</body>

三、父组件访问子组件

1、this.$children:返回的是数组

(1)方法使用

代码语言:javascript复制
<body>
    <div id="app">
        <cpn></cpn>
        <button @click="getChild">访问子组件</button>
    </div>
    <template id="cpn">
        <div>
            <h1>{{msg}}</h1>
        </div>
    </template>
    <script>
        new Vue({
            el:'#app',
            methods:{
                getChild(){
                    console.log(this.$children);
                },
            },
            components:{
                cpn:{
                    template:'#cpn',
                    data(){
                        return {
                            msg:'我是子组件'
                        }
                    },
                }
            },
        })
    </script>
</body>

(2)获取具体值

代码语言:javascript复制
<script>
    new Vue({
        el:'#app',
        methods:{
            getChild(){
                console.log(this.$children[0].msg);
            },
        },
        components:{
            cpn:{
                template:'#cpn',
                data(){
                    return {
                        msg:'我是子组件'
                    }
                },
            },
        },
    })
</script>

(3)方法缺点举例

①当有多个子组件时,该方法无法访问具体某个子组件的内容

代码语言:javascript复制
<body>
    <div id="app">
        <cpn2></cpn2>
        <cpn1></cpn1>
        <button @click="getChild">访问子组件</button>
    </div>
    <template id="cpn1">
        <div>
            <h1>{{msg}}</h1>
        </div>
    </template>
    <template id="cpn2">
        <div>
            <h1>{{str}}</h1>
        </div>
    </template>
    <script>
        new Vue({
            el:'#app',
            methods:{
                getChild(){
                    console.log(this.$children[0].msg);
                },
            },
            components:{
                cpn1:{
                    template:'#cpn1',
                    data(){
                        return {
                            msg:'我是子组件1'
                        }
                    },
                },
                cpn2:{
                    template:'#cpn2',
                    data(){
                        return {
                            str:'我是子组件2'
                        }
                    },
                },
            },
        })
    </script>
</body>

2、this.$refs:返回的是对象

注意:使用该方法时要与ref属性搭配,且这个方法可以避免什么数组出现的问题

代码语言:javascript复制
<body>
    <div id="app">
        <cpn2 ref="cpn2"></cpn2>
        <cpn1 ref="cpn1"></cpn1>
        <button @click="getChild">访问子组件</button>
    </div>
    <template id="cpn1">
        <div>
            <h1>{{msg}}</h1>
        </div>
    </template>
    <template id="cpn2">
        <div>
            <h1>{{str}}</h1>
        </div>
    </template>
    <script>
        new Vue({
            el:'#app',
            methods:{
                getChild(){
                    console.log(this.$refs);
                },
            },
            components:{
                cpn1:{
                    template:'#cpn1',
                    data(){
                        return {
                            msg:'我是子组件1'
                        }
                    },
                },
                cpn2:{
                    template:'#cpn2',
                    data(){
                        return {
                            str:'我是子组件2'
                        }
                    },
                },
            },
        })
    </script>
</body>

四、子组件访问父组件

1、this.$parent:返回的是对象

代码语言:javascript复制
<body>
    <div id="app">
        <cpn></cpn>
    </div>
    <template id="cpn">
        <div>
            <h1>我是子组件</h1>
            <button @click="getFather">访问父组件</button>
        </div>
    </template>
    <script>
        new Vue({
            el:'#app',
            data:{
                msg:'我是父组件',
            },
            components:{
                cpn:{
                    template:'#cpn',
                    methods:{
                        getFather(){
                            console.log(this.$parent);
                        },
                    },
                },
            },
        })
    </script>
</body>

0 人点赞