VUE基础开发-------2---组件化开发

6 篇文章 0 订阅

组件开发参考: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-------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值