Vue 组件化

时间:2021-07-18 01:18:18

Vue 组件化

Vue 组件化

<body>
    <div id="app">
        <!--组件名就是调用组件时的标签-->
        <my-hello></my-hello>

    </div>
    
    <template id="content">
        <div>
            <h3>自定义全局组件</h3>
            <p>MyHello</p>
            <p>name:{{name}}</p>
        </div>
    </template>
</body>

<script>
    const app = Vue.createApp({
        data(){
        }
    })
    app.component('my-hello',{ // 组件名使用短横线相连,全小写
        template:'#content',
        data(){
            return{
                name:'tom'
            }
        }
    })

    const vm = app.mount('#app')
</script>

Vue 组件化

组件多次调用,他们之间是互不影响的

<body>
    <div id="app">
        <!--组件名就是调用组件时的标签-->
        <my-hello v-for="(item,index) in 3" :key="index"></my-hello>

    </div>
    
    <template id="content">
        <div>
            <h3>自定义全局组件</h3>
            <p>MyHello</p>
            <p>name:{{name}}</p>
            <input type="text" v-model="name">
        </div>
    </template>
</body>

<script>
    const app = Vue.createApp({
        data(){
        }
    })
    app.component('my-hello',{ // 组件名使用短横线相连,全小写
        template:'#content',
        data(){
            return{
                name:'tom'
            }
        }
    })
    const vm = app.mount('#app')
</script>

Vue 组件化

Vue 组件化

<body>
    <div id="app">
        <comp-a></comp-a>

    </div>
    
    <template id="a">
        <div>
           <h3>组件A</h3>
           <p>{{msg}}</p>
        </div>
    </template>
</body>

<script>
    const app = Vue.createApp({
        components:{
            'comp-a':{
                template:'#a',
                data(){
                    return{
                        msg:'aaa'
                    }
                }
            }
        }

    }).mount('#app')

</script>

Vue 组件化

<body>
    <div id="app">
        <comp-a></comp-a>
        
    </div>
    
    <template id="a">
        <div>
           <h3>组件A</h3>
           <p>{{msg}}</p>
           <comp-b></comp-b>
        </div>
    </template>

    <template id="b">
        <div>
           <h3>组件B</h3>
           <p>{{msg}}</p>
        </div>
    </template>
</body>

<script>
    const app = Vue.createApp({
        components:{ // 局部组件
            'comp-a':{  // 父组件
                template:'#a',
                data(){
                    return{
                        msg:'aaa'
                    }
                },
                components:{ //局部组件
                    'comp-b':{ //子组件 
                        template:'#b',
                        data(){
                            return{
                                msg:'bbb'
                            }
                        }
                    }

                }
            }
        }

    }).mount('#app')

</script>

Vue 组件化

Vue 组件化

Vue 组件化

<body>
    <div id="app">
        <my-hello></my-hello>
        
    </div>

    <template id="hello">
        <div>
            <h2>hello父组件</h2>
            <h2>访问自己的数据: {{ msg }},{{info}},{{user.username}}</h2>
            <hr>
            <my-world :msg="msg" :info="info" :user="user"></my-world>
        </div>
    </template>

    <template id="world">
        <div>
            <h2>world子组件</h2>
            <h3>访问父组件数据:{{msg}},{{info}},{{user.username}}</h3>
            
        </div>
    </template>



</body>

<script>
    const app = Vue.createApp({
        components:{
            'my-hello':{ //父组件
                template:'#hello',
                data(){
                    return{
                        msg:'welcome',
                        info:'vue',
                        user:{
                            id:1001,
                            username:'admin',
                            password:'123'
                        }
                    }
                },
                components:{
                    'my-world':{ //子组件
                        template:'#world',
                        // 接收方式一
                        // props:['msg','info','user']
                        // 接收方式二
                        props:{
                            msg:String,
                            info:{
                                type:String,
                                default:'csdn'
                            },
                            user:{
                                type:Object
                            }
                        }

                    }
                }
            }
        }

    }).mount('#app')

</script>


Vue 组件化

Vue 组件化

<body>
    <div id="app">
        <my-hello></my-hello>

    </div>

    <template id="hello">
        <div>
            <h2>hello父组件</h2>
            <hr>
            <my-world  @e-data="get"></my-world>
            <h2>访问子组件数据:{{sex}}</h2>
        </div>
    </template>

    <template id="world">
        <div>
            <h2>world子组件</h2>
            <h2>访问自己的数据:{{sex}}</h2>
            <button @click="send">将子组件的数据传递给父组件</button>
        </div>
    </template>


</body>

<script>
    const app = Vue.createApp({
        components: {
            'my-hello': { //父组件
                template: '#hello',
                data() {
                    return {
                        sex:null
                    }
                },
                methods: {
                    get(sex) {
                        this.sex = sex

                    }
                },
                components: {
                    'my-world': { //子组件
                        template: '#world',
                        data() {
                            return {
                                sex: 'male'
                            }
                        },
                        methods:{
                            send(){
                                // 使用$emit() 触发一个自定义事件
                                this.$emit('e-data',this.sex)
                            }
                        }


                    }
                }
            }
        }

    }).mount('#app')

</script>

Vue 组件化

Vue 组件化

<body>
    <div id="app">
        <button @click="flag='CompA'">组件A</button>
        <button @click="flag='CompB'">组件B</button>
        <button @click="flag='CompC'">组件C</button>
        <hr>
        <component :is="flag"></component>

    </div>
</body>

<script>
    Vue.createApp({
        data(){
            return{
                flag:'CompA'

            }
        },
        components:{
            CompA:{
                template:'<h3>组件A</h3>'
            },
            CompB:{
                template:'<h3>组件B</h3>'
            },
            CompC:{
                template:'<h3>组件C</h3>'
            },
        }
    }).mount('#app')
</script>

Vue 组件化

Vue 组件化

默认情况下点击A组件,A组件会被创建,点击B组件创建B组件的同时销毁A组件

<body>
    <div id="app">
        <button @click="flag='CompA'">组件A</button>
        <button @click="flag='CompB'">组件B</button>
        <button @click="flag='CompC'">组件C</button>
        <hr>

        
            <component :is="flag"></component>
        
    </div>
</body>

<script>
    Vue.createApp({
        data(){
            return{
                flag:'CompA'

            }
        },
        components:{
            CompA:{
                template:'<h3>组件A</h3>',
                created(){
                    console.log('组件A-------created')
                },
                unmounted(){
                    console.log('组件A-------unmounted')
                }
            },
            CompB:{
                template:'<h3>组件B</h3>',
                created(){
                    console.log('组件B-------created')
                },
                unmounted(){
                    console.log('组件B-------unmounted')
                }
            },
            CompC:{
                template:'<h3>组件C</h3>',
                created(){
                    console.log('组件C-------created')
                },
                unmounted(){
                    console.log('组件C-------unmounted')
                }
            },
        }
    }).mount('#app')
</script>

Vue 组件化

缓存组件不会销毁切换之前的组件

<keep-alive>
            <component :is="flag"></component>
        </keep-alive>

Vue 组件化

Vue 组件化

<body>
    <div id="app">
        <comp-a>
            <p>111</p>
        </comp-a>
        <hr>
        <comp-a>
            <p>222</p>
        </comp-a>
    </div>

    <template id="a">
        <div>
            <h3>组件A</h3>
        <slot></slot>
        </div>

    </template>
</body>

<script>
    Vue.createApp({
        data(){
            return{
                flag:''

            }
        },
        components:{
            'comp-a':{
                template:'#a'
            }
        }
    }).mount('#app')
</script>

Vue 组件化