Vue组件和插槽

Vue组件

什么是组件: 组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可。

组件化和模块化的不同:

  模块化:是从代码逻辑的角度进行划分的;方便代码分层开发,保证每个功能模块的职能单一

  组件化:是从UI界面的角度进行划分的;前端的组件化,方便UI组件的重用

 

组件定义的四种方式

        // 方式1 使用 Vue.extend 配合 Vue.component 方法         // let login= Vue.extend({         //     template:'<h1>登录</h1>'         // })         // 方式二直接使用 Vue.component 方法:         // Vue.component("login",{         //     template:'<h2>登录</h2>'         // })         // 方式三 将模板字符串,定义到script标签中,需要添加id 和改变type类型为 x-template:       <!-- <script id="login" type="x-template">         <div>             <h3>注册</h3>         </div>     </script> -->           // Vue.component("login",{         //     template:"#login"         // })    方式四 将模板字符串,定义到template标签中,只需要添加id     <template id="mine">         <div>             <h1>个人中心</h1>         </div>     </template>           Vue.component("login",{             template:"#mine",         })

 

组件中展示数据和响应事件

        // 组件中data需要被定义为方法然后通过返回值来拿到对象         // 因为需要数据隔离         // 组件可以多次调用,多次调用的组件,         // 其中一个更改数据不会影响到别的组件,因为Vue中数据驱动试图

全局组件

Vue.component("app",{

template:"#app",

data(){

return{}

},methods:{

}

})

 

局部组件

    const vm = new Vue({         el: '#app',         data: {             flag:true         },         methods: {         },         components:{             mine:{                 template:"#mine",                 data(){                     return{}                 },                 methods:{
                }             }         }     })   组件的生命周期 和Vue实例一样有八个 beforeCreat() created() beforeMount() mounted() beforeUpdate() update() beforDestory() destoryed()   组件传值 父传子 父组件直接穿就可以,子组件需要用props来接受 <body>     <div id='app'>
        <father></father>     </div>     <template id="father">         <div>             父             <son :props1="msg1" :props2="msg2"></son>         </div>     </template>     <template id="son">         <div>             子{{props1}}{{props2}}         </div>     </template>     <script>         Vue.component("father",{             template:"#father",             data(){                 return{                     msg1:123,                     msg2:"haha"                 }             },                     })         Vue.component("son",{             template:"#son",             data(){                 return{}             },             props: {                 props1:[String,Number],                 props2:[String,Number]             }                     })     const vm = new Vue({         el: '#app',         data: {         },         methods: {         }     })     </script>   子传父: 子组件调用父组件的方法             1.  在父组件中给引用的子组件注册一个事件(这个事件的名字是自定义的)             2.  子组件可以触发这个事件$emit('事件名字')                         子组件给父组件传递数据             1.  $emit方法第二个参数可以定义子组件给父组件传递的内容             2.  在父组件中怎么拿到这内容             2.1 父组件这个方法没有自定参数,在父组件的方法直接加这个参数就可以拿到             2.2 父组件有自定义参数,可以传入$event也可以拿到子组件传递的数据。通过$event只能传递第一个参数。 <body>     <div id='app'>             <father></father>     </div> <template id="father">     <div>         父组件 值:{{data}}         <son @toson="fromson"></son>     </div> </template> <template id="son">     <div>         子组件         <button @click="toson">传值</button>     </div> </template>     <script>         Vue.component("father",{             template:"#father",             data(){                 return{                     data:""                 }             },             methods:{                 fromson(msg){                     this.data = msg                     console.log(msg);                 }             }
        })         Vue.component("son",{             template:"#son",             data(){                 return{}             },             methods:{                 toson(){                     this.$emit('toson', "子组件数据");                 }             }         })
    const vm = new Vue({         el: '#app',         data: {         },         methods: {         }     })     </script>     插槽

插槽就是子组件中的提供给父组件使用的一个占位符,用<slot></slot> 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的<slot></slot>标签。

<body>     <div id='app'>         <login>哈哈</login>     </div>     <template id="login">         <div>             <h2><slot></slot></h2>             登录         </div>     </template>     <script>         Vue.component("login",{             template:"#login",             data(){                 return{}             }         })     const vm = new Vue({         el: '#app',         data: {         },         methods: {         }     })     </script> </body>   具名插槽 <body>     <div id='app'>         <login>             <template v-slot:footer>                 <div>底部</div>             </template>             <template v-slot:header>                 <div>头部</div>             </template>         </login>
    </div>
    <template id="login">         <div>             <h2><slot name="header"></slot></h2>             登录             <h1><slot name="footer"></slot></h1>         </div>     </template>     <script>         Vue.component("login",{             template:"#login",         })     const vm = new Vue({         el: '#app',         data: {         },         methods: {         }     })     </script> </body>
上一篇:SpringBoot11:Thymeleaf模板引擎


下一篇:VUE学习记录(TodoList v-model、v-for、v-on)