自学Vue的第04天

自学Vue的第04天

组件化开发

局部组件

<div id="app"></div>

<script>

<!--    自定义局部组件-->
    var MyHeader = {
        template: `
                <div>我是Header</div>
            `
    }

    var MyBody = {
        template: `
                <div>我是Body</div>
            `
    }

    new Vue({
        el: '#app',
        //注册局部组件
        components: {
            MyHeader, MyBody
        },
        template: `
                <div>
                    <my-header></my-header>
                    <my-body></my-body>
                </div>
        `,
        data: function () {
            return {}
        }
    })
</script>
复制代码

1、这里的注册局部组件的时候,没有使用键值对,默认k-v相等

2、这里的创建局部组件的时候,其实用了个语法糖,完整的写法其实是

var MyFooter = Vue.extend({
        template: `
                <div>我是MyFooter</div>
            `
    })
复制代码

全局组件

Vue.component('MyLow', {
        template: `
        <div>我是MyLow</div>
    `
    })
    
    new Vue({
        el: '#app',
        //注册局部组件
        components: {
            MyHeader, MyBody, MyFooter
        },
        template: `
                <div>
                    <my-header></my-header>
                    <my-body></my-body>
                    <my-footer></my-footer>
                    <my-low></my-low>
                </div>
        `,
        data: function () {
            return {}
        }
    })
复制代码

全局组件,使用的时候无需声明

完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>组件化开发</title>
    <script src="../vue.js"></script>
</head>
<body>
<div id="app"></div>

<script>

    <!--    自定义局部组件-->
    var MyHeader = {
        template: `
                <div>我是Header</div>
            `
    }

    var MyBody = {
        template: `
                <div>我是Body</div>
            `
    }

    var MyFooter = Vue.extend({
        template: `
                <div>我是MyFooter</div>
            `
    })

    //全局组件
    Vue.component('MyLow', {
        template: `
        <div>我是MyLow</div>
    `
    })

    new Vue({
        el: '#app',
        //注册局部组件
        components: {
            MyHeader, MyBody, MyFooter
        },
        template: `
                <div>
                    <my-header></my-header>
                    <my-body></my-body>
                    <my-footer></my-footer>
                    <my-low></my-low>
                </div>
        `,
        data: function () {
            return {}
        }
    })
</script>
</body>
</html>
复制代码

slot插槽、ref、parent

扫描二维码关注公众号,回复: 6464134 查看本文章

slot举例

<script>

    var Parent={
        template: `
            <div>我是父组件<slot></slot></div>
        `
    }


    new Vue({
        el: '#app',
        components:{
            Parent
        },
        template: `
            <div>
                <parent>
                    <div>我是插槽内容</div>
                </parent>
            </div>
        `,
        data: function () {
            return {}
        }
    })
</script>
复制代码

如果父组件中没有slot,那么在使用的时候<div>我是插槽内容</div>是不会被渲染的

slot还可以指定名称

var Parent={
        template: `
            <div>我是父组件<slot name="hello"></slot></div>
        `
    }


    new Vue({
        el: '#app',
        components:{
            Parent
        },
        template: `
            <div>
                <parent>
                    <div>我是插槽内容</div>
                    <div slot="hello">我是插槽内容2</div>
                </parent>
            </div>
        `,
        data: function () {
            return {}
        }
    })
</script>
复制代码

指定名称的内容才进行渲染

$ref

<script>

    var Child = {
        template: `
            <div>我是子组件</div>
        `
    }

    var Parent = {
        template: `
            <div>
                我是父组件
                <!--为子组件取名-->
                <child ref="childs"></child>
            </div>
        `,
        components: {
            Child
        },
        mounted:function(){
        <!--获取到子组件的相关信息-->
            console.log(this.$refs.childs.$el);
        }
    }


    new Vue({
        el: '#app',
        components: {
            Parent
        },
        template: `
            <div>
                <parent></parent>
            </div>
        `,
        data: function () {
            return {}
        }
    })
</script>
复制代码

$parent

就好像使用$refs获取到子组件的信息,
我们可以使用$parent获取到父组件的信息

var Child = {
        template: `
            <div>我是子组件</slot></div>
        `,
        created:function(){
            console.log(this.$parent);
        }
    }
复制代码

组件的通讯

  • 父子组件通讯

  • 非父子组件通讯

父传子

<script>

    var Child = {
        //第三步:子组件使用父组件传递过来的数据
        template: `
            <div>我是子组件:{{sendChild}}</div>
        `,
        //第一步:子组件接收父组件参数的名称
        props:['sendChild']
    }

    var Parent = {
        //第二步:通过特定名称的属性,传递数据给子组件
        template: `
            <div>
                我是父组件
                <child sendChild="父组件给的"></child>
            </div>
        `,
        components: {
            Child
        }
    }


    new Vue({
        el: '#app',
        components: {
            Parent
        },
        template: `
            <div>
                <parent>
                </parent>
            </div>
        `,
        data: function () {
            return {}
        }
    })
</script>
复制代码

子传父

非父子组件

<script type="text/javascript">

		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.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 {}
			},
		})
	</script>
复制代码

Vue生命周期

猜你喜欢

转载自blog.csdn.net/weixin_34128501/article/details/91399561