什么是组件,在Vue中,不同功能的代码可单独拆成一个个的组件,以此来区分不同的功能,不同的组件负责不同的更功能,将来需要什么样的功能就调用不同的组件,这样也可以极大的减少单个页面的代码量;
<!--如果要使用组件,直接,把组件的名称,以HTML标签的形式,引入到页面中,即可-->
<div id = "app">
<!--如果组件的名称使用的是驼峰命名,那么页面组件的引用,需按照大写以‘-’符号拆分开-->
<my-coml></my-coml>
</div>
<script>
//组件创建方式一
// 1.1使用Vue.extend来创建全局的Vue组件
var coml = Vue.extend({
template: "这是使用Vue .extend创建的组件"
})
//1.2使用VUe.component(组件的名称,创建出来的组件模板对象)
Vue.component(myCom , coml)
//组件创建方式二
//跳过使用Vue.extend的过程
Vue.component(myCom , {
template: "这是使用Vue .extend创建的组件"
})
//创建Vue实例,得到ViewModel
var vm = new Vue({
el:"#app"
});
</script>
推荐使用引入template模板的方式
<div id = "app">
<my-com3></my-com3>
</div>
<template id = "temp">
<div>
<h4>这是通过template元素,在外部定义的组件结构,这个方式,有代码的只能提示和高亮</h4>
</div>
</template >
<script>
Vue.component ( "myCom3",{
template: '#temp',
})
//创建Vue实例,得到ViewModel
var vm = new Vue({
el:"#app"
});
</script>
<div id="app2">
<login></login>
</div>
var vm2 = new Vue({
el: 1#app2,
data: {},
methods: {},
filters: {},
directives: {},
components: { //定义实例内部私有组件的
login:{
template: '这是私有的 login 组件
';
}
},
beforeCreate(){},
created(){},
beforeMount(){},
mounted(){},
beforeUpdate(){},
updated(){},
beforeDestroy(){},
destroyed(){}
))
<div id = "app">
<a href = '' @click.prevent = 'flag = true'>登录</a>
<a href = '' @click.prevent = 'flag = false'>注册</a>
</div>
<login v-if = "flag"></login>
<register v-else = "flag"></register >
<script>
Vue.component(login , {
template: "登录组件"
})
Vue.component(register , {
template: "注册组件"
})
var vm = new Vue({
el:"#app",
data:{
flag: true
}
});
</script>
component 元素可以通过给is属性赋值的方式实现组件切换;
<div id = "app">
<a href = '' @click.prevent = "comName = 'login' ">登录</a>
<a href = '' @click.prevent = "comName = 'register '">注册</a>
</div>
<component :is = "comName "></component>
<script>
Vue.component(login , {
template: "登录组件"
})
Vue.component(register , {
template: "注册组件"
})
var vm = new Vue({
el:"#app",
data:{
comName : 'login'
}
});
</script>
//mode = "out-in" 动画模式先出后进, 注意:给动画定义样式,参考上一篇文章
<transition mode = "out-in">
<component :is = " " ></component>
</<transition>>
父组件在引用子组件的时候可以通过v-bind来给子组件传值,子组件通过pops[ ]来获取父组件传来的值。
父组件向子组件传递放方法的时候,通过v-on来实现;而子组件通过this.$emit(方法名,‘参数1’,‘参数2’)的方式来触发父组件的方法。
<div id="app2">
<login v-bind:parentMsg = "msg" v-on:func123 = "parentMethod"></login>
</div>
var vm2 = new Vue({
el: 1#app2,
data: {
msg:'父子组件的msg值'
},
methods: {
parentMethod(data1,data2):{
console.log("这是父组件的方法,子组件传来的参数1"+data1 +"子组件传来的参数2"+ data2)
}
},
filters: {},
directives: {},
components: { //定义实例内部私有组件的
login:{
template: '这是子组件--{{ parentMsg }}
';
pops:[parentMsg]
data function:{
return:{
}
}
methods: {
sonMethod():{
//emit意为,触发调用的意思,通过this.$emit的方式来调用父组件的方法,
this.$emit('func123','需要传给父组件的参数1','需要传给父组件的参数2')
}
},
}
},
))
Vue不提倡直接操作DOM元素,但是提供了操作DOM元素的方式,ref ,任何vue的标签上只要带ref属性,就可以获取该标签的DOM元素。
<div id = "app">
<my-com3 res = "sonRef"></my-com3>
</div>
<template id = "temp">
<div>
<h4>这是个子组件</h4>
</div>
</template >
<script>
Vue.component ( "myCom3",{
template: '#temp',
data:{
return:{
sonMsg:"son msg"
}
}
methods: {
init(id):{
console.log("父组件传来的ID:"+id)
}
},
})
//创建Vue实例,得到ViewModel
var vm = new Vue({
el:"#app"
data:{
},
methods: {
parentMethod():{
//通过$refs调用子组件的init方法
this.$refs.sonRef.init(666);
//通过$refs调用子组件的属性
let m =this.$refs.sonRef.sonMsg;
}
},
});
</script>