1.Vue组件创建的几种方式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="app">
<!-- 在命名时组件名称可用驼峰命名法,但在使用时要用小写 -->
<my-com1></my-com1>
<mycom2></mycom2>
<mycom3></mycom3>
<mycom4></mycom4>
</div>
<template id="templ">
<div>
<h3>这是通过template在外部定义的组件结构</h3>
<h6>有代码的智能提示和高亮</h6>
</div>
</template>
<div id="app2">
<login></login>
</div>
<script type="text/javascript" src="./node_modules/vue/dist/vue.min.js"></script>
<script type="text/javascript">
//注意:不管用哪种方式创建组件,template属性指向的模板内容只能包含唯一的根元素
var com1 = Vue.extend({
template:'<h3>这是Vue.extend创建的组件</h3>'
});
//Vue.component('组件名称',创建出来的组件模板对象);
Vue.component('myCom1',com1);
//不使用中间对象来接收的写法
Vue.component('mycom2',Vue.extend({
template:'<h3>这是Vue.extend不使用中间对象创建的组件</h3>'
}));
Vue.component('mycom3',{
template:'<h3>这是Vue.component创建的组件</h3>'
});
Vue.component('mycom4',{
template:'#templ'
});
new Vue({
el:'#app',
data:{
},
});
var vm2 = new Vue({
el:'#app2',
data:{
},
components:{
login:{
template:'<h3>这是私有组件</h3>'
}
}
});
</script>
</body>
</html>
2.局部组件:声明、挂载、使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="app"></div>
<script type="text/javascript" src="./node_modules/vue/dist/vue.min.js"></script>
<script type="text/javascript">
//局部组件:声明、挂载、使用
//入口组件的声明
var Apps = { //预防使用时与HTML的标签混淆,建议组件名首字母大写。声明时用驼峰命名,使用时可用小写,如:声明AppName 使用app-name
data(){
return{
}
},
template:`
<div>
我是入口组件
</div>
`
}
var vm = new Vue({
el:'#app',
data(){
return{
}
},
//挂载子组件
components:{
App11:Apps
// Apps
},
//父组件可以直接使用
template:`
<App11></App11>
<!--<Apps></Apps>-->
`
});
</script>
</body>
</html>
3.全局组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
.default{
}
.primary{
background-color: blue;
}
.success{
background-color: green;
}
</style>
</head>
<body>
<div id="app"></div>
<script type="text/javascript" src="./node_modules/vue/dist/vue.min.js"></script>
<script type="text/javascript">
//全局组件
Vue.component('Vbtn',{
template:`
<!--插槽 内置组件slot 作为承载分发内容的出口-->
<button class="default" :class="type">
<slot>
按钮
</slot>
</button>
`,
props:['type']
});
//局部组件:声明、挂载、使用
var Vheader = {
data(){
return{
}
},
template:`
<div>
我是头部组件
</div>
`
}
var Vasider = {
data(){
return{
}
},
template:`
<div>
我是侧边组件
</div>
`
}
var Vcontent = {
data(){
return{
}
},
template:`
<div>
我是内容组件
<Vbtn type="primary">普通</Vbtn>
<Vbtn type="success">成功</Vbtn>
<Vbtn/>
</div>
`
}
var App = {
data(){
return{
}
},
template:`
<div>
<Vheader/>
<div>
<Vasider/>
<Vcontent/>
</div>
</div>
`
,
components:{
Vheader,
Vasider,
Vcontent
},
}
var vm = new Vue({
el:'#app',
data(){
return{
}
},
//挂载子组件
components:{
App
},
//父组件可以直接使用
template:`
<App></App>
`
});
</script>
</body>
</html>
4.通过prop往子组件通信
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="app"></div>
<script type="text/javascript" src="./node_modules/vue/dist/vue.min.js"></script>
<script type="text/javascript">
//全局组件
Vue.component('Child',{
template:`
<div>
<p>我是一个孩子组件</p>
<p>{{childData}}</p> <!--3.在子组件中使用属性-->
<input type="text" v-model='childData'/>
</div>
`
,
props:['childData'] //2.在子组件中用props接收父组件传递的数据
});
Vue.component('Parent',{
data(){
return{
msg:"我是父组件的数据"
}
},
template:`
<div>
<p>我是一个父组件</p>
<Child v-bind:childData = 'msg'/> <!--1.在父组件中绑定自定义属性-->
</div>
`
});
var App = {
data(){
return{
}
},
template:`
<div>
<Parent/>
</div>
`
,
components:{
},
}
var vm = new Vue({
el:'#app',
data(){
return{
}
},
//挂载子组件
components:{
App
},
//父组件可以直接使用
template:`
<App></App>
`
});
</script>
</body>
</html>
5.通过事件向子组件发送消息
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="app"></div>
<script type="text/javascript" src="./node_modules/vue/dist/vue.min.js"></script>
<script type="text/javascript">
//全局组件
Vue.component('Child',{
template:`
<div>
<p>我是一个孩子组件</p>
<input type="text" v-model='childData' @input = 'changeValue(childData)'/> <!--2.在子组件中触发原生事件-->
</div>
`
,
props:["childData"],
methods:{
changeValue(val){
this.$emit('childHandler',val) //在函数中用$emit触发childHandler
}
}
});
Vue.component('Parent',{
data(){
return{
msg:"我是父组件的数据"
}
},
template:`
<div>
<p>我是一个父组件</p>
<Child v-bind:childData = 'msg' @childHandler = 'childHandler'/> <!--1.在父组件中绑定自定义事件-->
</div>
`
,
methods:{
childHandler(val){
console.log(val);
}
}
});
var App = {
data(){
return{
}
},
template:`
<div>
<Parent/>
</div>
`
,
components:{
},
}
var vm = new Vue({
el:'#app',
data(){
return{
}
},
//挂载子组件
components:{
App
},
//父组件可以直接使用
template:`
<App></App>
`
});
</script>
</body>
</html>