组件开发参考:https://www.cnblogs.com/yinhaiying/p/10985476.html
分vue页面的组件引入:https://blog.csdn.net/zhiyikeji/article/details/84202808
组件开发的三部曲:声明,注册,使用
组件和new Vue是一样的。
-----------局部的
声明:
注册,使用:
------------全局的
注意组件是怎么使用的,组件就像一个div一样。
完整代码:
<!DOCTYPE html>
<html>
<head>
<title>组件化开发</title>
</head>
<body>
<div id="app">
</div>
<script type="text/javascript" src="vue.js"></script>
<script type="text/javascript">
var MyHeader={// 1------------------:声明组件
template:`
<div>我是头部</div>
`,
}
var MyBody=Vue.extend({//原来是这样写的,后来就简化为上面的方式
template:`
<div>我是身体</div>
`
})
//这个是语法糖,比较简洁
// var MyBody={
// template:`
// <div>我是身体</div>
// `
// }
Vue.component('MyFooter',{//全局创建就不用注册了
template:`
<div>我是尾部</div>
`
})
new Vue({
el:'#app',
//2--------------------------:注册组件
components:{
MyHeader,
MyBody
},
template:`
<div>
<my-header></my-header>//3-------------------:使用
<my-body></my-body>
<my-footer></my-footer>
</div>
`,
data(){
return{}
},
})
</script>
</body>
</html>
------------------------------------2-1-----------------------------------------
slot就是让dom动态的插入进去。
组件:声明 注册 使用三部曲
------
插槽的用法1,普通插槽,就是我们在使用组件的时候,引入组件是不能在组件里面加div的,要想加就得在组件的代码里面加插槽,一个插槽可以插入多个div:
var Parent={
template:`
<div>
我是父组件
<div>其他</div>
<slot></slot>
</div>
`,
data(){
return {
}
},
mounted(){
// console.log(this.$refs.childs)
}
}
new Vue({
el:'#app',
components:{
Parent
},
template:`
<div>
<parent>
<div>我是插槽</div>
<div>我是插槽2</div>
</parent>
</div>
`,
data(){
return{}
},
})
插槽的用法2:具名的插槽
var Parent={
template:`
<div>
我是父组件
<div>其他</div>
<slot name="hello"></slot>
</div>
`,
data(){
return {
}
},
mounted(){
// console.log(this.$refs.childs)
}
}
new Vue({
el:'#app',
components:{
Parent
},
template:`
<div>
<parent>
<div slot='hello'>我是插槽</div>
<div>我是插槽2</div>// 这个不显示
</parent>
</div>
`,
data(){
return{}
},
})
插槽的用法3:组件嵌套组件,ref在父组件上获取子组件的实例
var Child={
template:`
<div>我是子组件</div>
`,
data(){
return {
msg: 'hello'
}
},
created(){
}
}
var Parent={
template:`
<div>
我是父组件
<div>其他</div>
<slot name="hello"></slot>
<child ref='childs'></child>// 3.使用
</div>
`,
data(){
return {
}
},
components:{
Child // 2.注册
},
mounted(){
console.log(this.$refs.childs.$el)// this.$refs.childs可以获取很多el事其中之一
console.log(this.$refs.childs.msg)// 可以拿数据
}
}
new Vue({
el:'#app',
components:{
Parent
},
template:`
<div>
<parent>
<div slot='hello'>我是插槽具名的</div>
<div>我是插槽2</div>
</parent>
</div>
`,
data(){
return{}
},
})
获取父亲的实例:
var Child={
template:`
<div>我是子组件</div>
`,
data(){
return {
msg: 'hello'
}
},
created(){
console.log(this.$parent.parents);// parents是值
}
}
var Parent={
template:`
<div>
我是父组件
<div>其他</div>
<slot name="hello"></slot>
<child ref='childsddd'></child>
</div>
`,
data(){
return {
parents:'我是父亲组件'
}
},
components:{
Child
},
mounted(){
console.log(this.$refs.childsddd.$el)
console.log(this.$refs.childsddd.msg)
}
}
new Vue({
el:'#app',
components:{
Parent
},
template:`
<div>
<parent>
<div slot='hello'>我是插槽具名的</div>
<div>我是插槽2</div>
</parent>
</div>
`,
data(){
return{}
},
})
在使用组件的过程中,是不能在组件中间插入元素的,如何解决这个问题呢?
这样是不可以的。
在父组件声明一个插槽,留个坑。
在使用的时候就可以了:
<div>
<parent>
<div>我是插槽内容111111111</div>//不可以
<div slot='hello'>eeee我是插槽内容2</div>//可以
</parent>
</div>
应用在组件嵌套组件的情况上。
mounted是数据加载完毕dom挂载完毕
created是dom挂载完毕
代码:
<!DOCTYPE html>
<html>
<head>
<title>组件化开发</title>
</head>
<body>
<div id="app">
</div>
<script type="text/javascript" src="vue.js"></script>
<script type="text/javascript">
var Child={
template:`
<div>我是子组件</div>
`,
data(){
return {
msg:'hello'
}
},
created(){//数据加载完毕但是没挂DOM
console.log(this.$parent)
}
}
var Parent={
template:`
<div>
我是父组件
<slot name='hello'></slot>
<child ref='childs'></child>//使用 ref
</div>
`,
components:{
Child//在父组件注册子组件
},
data(){
return {
parents:'我是父组件'
}
},
mounted(){
// console.log(this.$refs.childs.$el) //和这个this.$refs.childs是对应的,可以拿到子组件的所有的东西
}
}
new Vue({
el:'#app',
components:{
Parent
},
template:`
<div>
<parent>
<div>我是插槽内容</div>
<div slot='hello'>我是插槽内容2</div>
</parent>
</div>
`,
data(){
return{}
},
})
</script>
</body>
</html>
----------------------------------------2-2----------------------------------------------------------------
父子组件的通信:
父亲给儿子:子组件props:['sendchild'],父组件在使用子组件的时候定义一个属性sendchild父亲组件给这个属性赋值,子组件直接{{sendchild}}就可以了。
//子组件定义好了props直接用
var Child={
template:`
<div>
我是子组件------------------------------{{sendchild}}
</div>
`,
props:['sendchild'],
methods:{
}
}
//父组件通过属性sendchild传递了数据给子组件
var Parent={
template:`
<div>
我是父组件
<child sendchild='父亲给你的'></child>
</div>
`,
components:{
Child
},
data(){
return {
msg:''
}
},
methods:{
}
}
new Vue({
el:'#app',
components:{
Parent
},
template:`
<div>
<parent></parent>
</div>
`,
data(){
return {
}
},
})
儿子给父亲:定义事件this.$emit('baba','这是儿子组件给你的'),在父组件的子区域@baba='reserve' 写reserve函数。
//子组件定义好了props直接用
var Child={
template:`
<div>
<button @click='sendparent'>我要反馈东西给父亲</button>
</div>
`,
methods:{
sendparent(){
this.$emit('baba','这是儿子组件给你的','这是儿子组件给你的1')
}
}
}
//父组件通过属性sendchild传递了数据给子组件
var Parent={
template:`
<div>
我是父组件{{ msg }}
<child @baba='reserve'></child>
</div>
`,
components:{
Child
},
data(){
return {
msg:''
}
},
methods:{
reserve(val,val1){
this.msg=val+val1
}
}
}
new Vue({
el:'#app',
components:{
Parent
},
template:`
<div>
<parent></parent>
</div>
`,
data(){
return {
}
},
})
------------------2-3---------------
非父子组件的通信:
0.创建三个组件 头部 尾部 的身体
1.创建空的实例:Vue.prototype.$bus=new Vue()
2.传入数值:this.$bus.$emit('sending','我是底部的数据')
3.监听:this.$bus.$on('sending',val=>{
this.headermsg=val
})
代码:
Vue.prototype.$bus=new Vue()
var MyHeader={
template:`
<div>
我是头部
{{ headermsg }}
</div>
`,
data(){
return {
headermsg:'我是头部的信息'
}
},
created(){
// var self=this
// self.$bus.$on('sending',function(val){
// self.headermsg=val
// })
this.$bus.$on('sending',val=>{//不加箭头表达式this是指的是$bus,箭头函数改this的指向。
this.headermsg=val
})
}
}
var MyBody={
template:`
<div>我是身体</div>
`,
}
var MyFooter={
template:`
<div>我是底部<button @click='sendhead'>我要跟头部通信</button></div>
`,
methods:{
sendhead(){
this.$bus.$emit('sending','我是底部的数据')
}
}
}
new Vue({
el:'#app',
components:{
MyHeader,
MyBody,
MyFooter
},
template:`
<div>
<my-header></my-header><hr>
<my-body></my-body><hr>
<my-footer></my-footer>
</div>
`,
data(){
return {}
},
})
注意:
这个this是$bus的空实例。
注意:使用箭头函数修改this的指向:
规则:指向外面包裹他不是箭头函数的作用域,就是created的作用域,就是Header。
------------------------------2-4----------------------------------------------
生命周期:https://www.jianshu.com/p/5cd198945d41
https://www.cnblogs.com/whh-16/p/9092539.html
没上课。
----------2-5-------------