最简组件
全局组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="https://cdn.bootcss.com/vue/2.5.14/vue.min.js"></script>
<script src="https://cdn.bootcss.com/axios/0.17.1/axios.min.js"></script>
</head>
<body>
<div id="box">
<!-- 调用必须在某一个vue作用域中调用 -->
<test></test>
</div>
<script>
//全局组件
Vue.component("test",{
template:"<h1>Hello Word!</>"
});
let vm = new Vue({
el:'#box',
data:{
msg:"2423",
}
})
</script>
</body>
</html>
上面那种有很多局限性:
第一写标签的时候没有帮助,速度慢,准确性低
全局组件改良版
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="https://cdn.bootcss.com/vue/2.5.14/vue.min.js"></script>
<script src="https://cdn.bootcss.com/axios/0.17.1/axios.min.js"></script>
</head>
<body>
<div id="box">
<!-- 调用必须在某一个vue作用域中调用 -->
<test></test>
</div>
<template id="tt">
<div>
<h3>这种方法其实跟上一种没啥区别,只是把标签独立出来了</h3>
<p>这样做的好处就是标签不必用一个大的根标签来套住</p>
</div>
</template>
<script>
//全局组件
Vue.component("test",{
template:"#tt"
});
let vm = new Vue({
el:'#box',
data:{
msg:"2423",
}
})
</script>
</body>
</html>
这是命名规则的实例:
命名:myConpu
调用:<my-compu></my-compu>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="https://cdn.bootcss.com/vue/2.5.14/vue.min.js"></script>
<script src="https://cdn.bootcss.com/axios/0.17.1/axios.min.js"></script>
</head>
<body>
<div id="box">
<!-- 调用的时候注意格式,前面小写的照写,然后后面的全小写中间加斜杠 -->
<my-compu></my-compu>
</div>
<script>
//这里的命名和调用是驼峰名名
Vue.component("myCompu",{
template:"<h3>Hello Word!</h3>"
})
let vm = new Vue({
el:'#box',
data:{
msg:"2423",
}
})
</script>
</body>
</html>
普通局部组件:带参数和方法
这个实例应该着重注意他的参数和方法的定义,data的定义是和vue对象的有所差别,需要把data写成一个函数然后返回参数值,methods的使用是一样的,写方法然后在具体的标签上使用,注意不能在template上使用,不然识别不到
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="https://cdn.bootcss.com/vue/2.5.14/vue.min.js"></script>
<script src="https://cdn.bootcss.com/axios/0.17.1/axios.min.js"></script>
</head>
<body>
<div id="box">
<!-- 调用的时候注意格式,前面小写的照写,然后后面的全小写中间加斜杠 -->
<my-compu></my-compu>
</div>
<script>
//这里的命名和调用是驼峰名名
Vue.component("myCompu",{
template:"<h3 @click='ale()'>{{msg}}</h3>",
data:function(){
return {
msg:"第一个文本参数",
}
},
methods:{
ale:function(){
alert(this.msg);
}
}
})
let vm = new Vue({
el:'#box',
data:{
msg:"2423",
}
})
</script>
</body>
</html>
改良版全局变量:带参数和方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="https://cdn.bootcss.com/vue/2.5.14/vue.min.js"></script>
<script src="https://cdn.bootcss.com/axios/0.17.1/axios.min.js"></script>
</head>
<body>
<div id="box">
<my-compu></my-compu>
</div>
<template id="tt">
<div>
<h1>{{msg}}</h1>
<br/>
<button @click="gai()">点击改变</button>
</div>
</template>
<script>
Vue.component("myCompu",{
template:"#tt",
data:function(){
return{
msg:"点击下面的按钮,这里的参数就会改变",
}
},
methods:{
gai:function(){
this.msg="是吧,没骗你对吧!"
}
}
})
let vm = new Vue({
el:'#box',
data:{
msg:"2423",
}
})
</script>
</body>
</html>
局部组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="https://cdn.bootcss.com/vue/2.5.14/vue.min.js"></script>
<script src="https://cdn.bootcss.com/axios/0.17.1/axios.min.js"></script>
</head>
<body>
<div id="box">
<my-com></my-com>
</div>
<template id="tt">
<div>
<span>{{msg}}</span>
<img :src="imgSrc">
</div>
</template>
<script>
let vm = new Vue({
el:'#box',
data:{
},
components:{
"myCom":{
template:"#tt",
data:function(){
return{
msg:"2423",
imgSrc:"http://scimg.158pic.com/allimg/160718/103-160GQ03AK96.jpg"
}
}
}
}
})
</script>
</body>
</html>
全局组件——参数传入(props)
重点:在数据传输这里,有个坑,就是你的数据名称假如含有一个大写字母,下面的props就不会识别,也就不会把数据加载到组件当中去
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="https://cdn.bootcss.com/vue/2.5.14/vue.min.js"></script>
<script src="https://cdn.bootcss.com/axios/0.17.1/axios.min.js"></script>
</head>
<body>
<div id="box">
<my-com msg="images/1.jpg" imgurl="http://pic2016.ytqmx.com:82/2017/1019/10/1.jpg!960.jpg"></my-com>
</div>
<template id="tt">
<div>
<h1>{{msg}}</h1>
<img :src="imgurl">
</div>
</template>
<script>
let vm = new Vue({
el:'#box',
data:{
},
components:{
"myCom":{
props:['msg','imgurl'],
template:"#tt",
}
}
})
</script>
</body>
</html>
全局组件——参数传入(solt:匿名槽口)
可以用来制作头部导航和尾部导航栏,内容就包裹在slot之中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="https://cdn.bootcss.com/vue/2.5.14/vue.min.js"></script>
<script src="https://cdn.bootcss.com/axios/0.17.1/axios.min.js"></script>
</head>
<body>
<div id="box">
<my-com>这是初始的内容</my-com>
</div>
<template id="tt">
<div>
<p>在内容之前的数据</p>
<slot>如果初始的内容为空就显示这部分</slot>
<P>在内容之后的</P>
</div>
</template>
<script>
let vm = new Vue({
el:'#box',
components:{
"myCom":{
template:"#tt",
}
}
})
</script>
</body>
</html>
全局组件——参数传入(solt:具名槽口)
这个示例中的div会根据slot的名字而被引用到template中去
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="https://cdn.bootcss.com/vue/2.5.14/vue.min.js"></script>
<script src="https://cdn.bootcss.com/axios/0.17.1/axios.min.js"></script>
</head>
<body>
<div id="box">
<my-comput>
<div slot="Cpu">Intel core i</div>
<div slot="GPU">GTX980 Ti</div>
<div slot="Memory">king stom 32G</div>
</my-comput>
</div>
<template id="tt">
<div>
<slot name="Cpu">1</slot>
<slot name="GPU">2</slot>
<slot name="Memory">3</slot>
</div>
</template>
<script>
let vm = new Vue({
el:'#box',
data:{
msg:"jin",
},
components:{
"myComput":{
template:"#tt",
}
}
})
</script>
</body>
</html>
父子组件开发之函数关联方法
这个函数的方法是绑定父组件的函数,当我们在子组件方法函数中调用了这个方法之后,父组件关联函数也会被触发
关联的关键步骤在调用组件标签的时候使用一个方法名关联父组件方法名,然后传入子组件,通过this.$emit(方法名)来调用父组件方法
<my-compon v-on:add1="addtotal"></my-compon>
methods:{
add888:function(){
this.$emit("add1");
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>计数器</title>
<script src="https://cdn.bootcss.com/vue/2.5.14/vue.min.js"></script>
<script src="https://cdn.bootcss.com/axios/0.17.1/axios.min.js"></script>
</head>
<body>
<div id="box">
{{msg}}
<my-compon v-on:add1="addtotal"></my-compon>
</div>
<template id="tt">
<div>
<button @click="add888">计数器</button>
</div>
</template>
<script>
let vm = new Vue({
el:'#box',
data:{
msg:1,
},
methods:{
addtotal:function(){
this.msg+=1;
}
},
components:{
"myCompon":{
template:"#tt",
methods:{
add888:function(){
this.$emit("add1");
}
}
},
}
})
</script>
</body>
</html>