组件

119 阅读1分钟

组件基础

组件,一个模板标签就是一个组件,网页可由多个组件组成,每一个组件都有自己的数据源,方法,过滤器,计算属性,属性侦听,生命周期函数等

组件注意点:注册组件时组件名不能用系统使用过的,一个组件的template模板中只能有一个根元素,注册时用驼峰命名,使用时可用连字符代替

局部组件

    <div id="app">
        <Box></Box>
        <my-box></my-box>
    </div>
    <script>
        new Vue({
            el:"#app",
            data:{},
            methods: {},
            components:{
                // 注册局部组件
                Box:{
                    template:`<div>
                                <h1>welcome to aotu land</h1>
                            </div>`
                },
                MyBox:{
                    template:`<h2>aotu 666</h2>`
		}	
            },
            filters:{},
            watch:{},
            computed:{},
            directives:{},
            beforeCreate() {},
            created() {
                
            },
            beforeMount() {
                
            },
            mounted() {
                
            },
            beforeUpdate() {
                
            },
            updated() {
                
            },
            beforeDestroy() {
                
            },
            destroyed() {
                
            },

        })
    </script>

image.png

组件可以写在js文件中导出一个对象然后引入,使用的vue文件其实就是在webpack打包之后加载器会映射成一份js文件再挂载到页面上。

ps:一个组件的 data 选项必须是一个函数,函数返回一个对象,对象中就是该组件可以使用的每个数据

    <div id="app">
        <!-- 3.使用组件 -->
        <Box></Box>
        <my-box></my-box>
    </div>
    <script type="module">
        // 1.引入组件
        import Box from './Box.js'
        new Vue({
            el: "#app",
            data: {},
            methods: {},
            components: {
                // 2.注册组件
                Box,
                MyBox: {
                    template: `<h2>aotu 666</h2>`
                }
            }
        })
    </script>
</body>
let Box = {
    template: `<div>
                    <h1>{{msg}}</h1>
                    <button @click="fn">显示数据</button>
                    <button @click="fm">隐藏数据</button>
                    <div v-for="el in member" v-if="flag">
                        <p>{{el.name}}-{{el.player}}</p>
                    </div>
                </div>`,
    data() {
        return {
            msg:"welcome to aotu land",
            member:[
                {name:"jess",player:"leader"},
                {name:"cici",player:"member"},
                {name:"erjie",player:"member"},
                {name:"lili",player:"member"},
                {name:"jiejing",player:"member"}
            ],
            flag:false
        }
    },
    methods: {
        fn(){
            this.flag=true;
            console.log("数据已经显示");
        },
        fm(){
            this.flag=false;
            console.log("数据已经隐藏");
        }
    },
};
export default Box;

image.png

image.png

组件的嵌套

    <div id="app">
        <team></team>
    </div>
    <script>
        new Vue({
            el: "#app",
            components: {
                // 局部注册组件
                team: {
                    template: `<div>
                    <h1>{{msg}}</h1>
                    <button @click="fn">显示数据</button>
                    <button @click="fm">隐藏数据</button>
                    <div v-for="el in member" v-if="flag">
                        <p>{{el.name}}-{{el.player}}</p>
                    </div>
                    <team-info></team-info>
                </div>`,
                    data() {
                        return {
                            msg: "welcome to aotu land",
                            member: [
                                { name: "jess", player: "leader" },
                                { name: "cici", player: "member" },
                                { name: "erjie", player: "member" },
                                { name: "lili", player: "member" },
                                { name: "jiejing", player: "member" }
                            ],
                            flag: false
                        }
                    },
                    methods: {
                        fn() {
                            this.flag = true;
                            console.log("数据已经显示");
                        },
                        fm() {
                            this.flag = false;
                            console.log("数据已经隐藏");
                        }
                    },
                    components: {
                        // 局部注册,嵌套在team组件中,这个标签要写在team组件中的template
                        TeamInfo: {
                            template: `<h6>{{msg}}</h6>`,
                            data() {
                                return {
                                    msg: "AOTU 666",
                                }
                            }
                        }
                    }
                }
            }
        })
    </script>

组件的嵌套,嵌套的组件的使用标签必须要写在被嵌套组件中的template