vue学习自定义组件篇(六)

自定义组件

在这里插入图片描述

  • 组件帮助我们实现组件化开发,方便使用
    • 组件化:针对前端,UI界面而言,部分页面为一个组件
    • 模块化:针对后端,业务逻辑而言,每个功能为一个模块

组件

  • 组件分类
  • 组件传值
  • 组件场景
  • vue标签

组件分类

  • 全局组件
  • 私有组件
(1)全局组件
  • 定义
  • 注册
  • 渲染
组件创建的方式
  • extend
  • {}
  • 模板template
    • 这是我们接触到的第一个vue提供的标签
方式一 extend
<div id="app">
    <login></login>
</div>
<script>
    //方式一
    Vue.component("login",Vue.extend({
        template:"<h1>login</h1>"
    }))
    new Vue({
        el:"#app",
        data:{
        }
    })
</script>
方式二 {}
<div id="app">
    <register></register>
</div>
<script>
    //方式二
    Vue.component("register",{
        template:"<h1>register</h1>"
    })
    new Vue({
        el:"#app",
        data:{
        }
    })
</script>
方式三(有提示) template
<div id="app">
    <index></index>
</div>
<template id="index">
    <h1>index</h1>
</template>
<script>
    //方式三
    Vue.component("index",{
        template: "#index"
    })
    new Vue({
        el:"#app",
        data:{
        }
    })
</script>
  • 预览
    在这里插入图片描述
(2)私有组件
  • 创建
  • 注册
  • 渲染
<div id="app">
    <login></login>
</div>
<script>
    new Vue({
        el:"#app",
        data:{
        },
        components: {
            "login":{
                template:"<h1>login</h1>"
            }
        }
    })
</script>

组件传值

  • 父传子
  • 子传父
  • 兄弟传
(1)父传子值
  • 定义父组件和子组件
  • 视图绑定父组件,子元素定义和子元素使用
定义父组件和子组件
  • 使用
<div id="app">
    {{msg}}
    <login></login>
</div>
<script>
    new Vue({
        el:"#app",
        data:{
            msg:"我是父组件"
        },
        components:{
            login:{
                template:"<h1>我是子组件</h1>"
            }
        }
    })
</script>
  • 预览
    在这里插入图片描述
视图绑定父组件,子元素定义和子元素使用
  • 使用
<div id="app">
    {{msg}}
    <login :son="msg"></login>
</div>
<script>
    new Vue({
        el:"#app",
        data:{
            msg:"我是父组件"
        },
        components:{
            login:{
                props:["son"],
                template:"<h1> {{son}}</h1>"
            }
        }
    })
</script>
  • 预览
    在这里插入图片描述
(2)父传子方法
  • 创建父组件和子组件
  • 视图绑定父组件,子组件定义,调用
创建父组件和子组件
<div id="app">
    {{msg}}
    <login></login>
</div>
<script>
    new Vue({
        el:"#app",
        data:{
            msg:"我是父组件"
        },
        components:{
            login:{
                template:"<h1>我是子组件</h1>"
            }
        }
    })
</script>
视图绑定父组件,子组件定义,调用
<div id="app">
    <login @son="show"></login>
</div>
<script>
    new Vue({
        el:"#app",
        data:{
            msg:"我是父组件"
        },
        methods:{
            show(){
                console.log("我是父组件的方法")
            }
        },
        components:{
            login:{
                template:"<button @click='click'> 子组件</button>",
                methods: {
                    click(){
                        this.$emit("son");
                    }
                }
            }
        }
    })
</script>
  • 预览
    在这里插入图片描述
(3)子传父值
  • 根据父组件可以给子组件传递方法,可以实现子传父值
    • 子组件可以调用父组件的方法,可以把数据当做参数给父组件
    • 父组件可以定义一个值来接收子组件通过参数传过来的值
    在父传子方法上加上参数
    在子组件上定义数据传,在父组件上定义数据接收
<div id="app">
    <login @son="show"></login>
</div>
<script>
    new Vue({
        el:"#app",
        data:{
            msg:"我是父组件"
        },
        methods:{
            show(info){
                console.log("我是父组件的方法------"+info)
            }
        },
        components:{
            login:{
                data(){
                    return{
                        sonData:"我是子组件的值"
                    }
                },
                template:"<button @click='click'> 子组件</button>",
                methods: {
                    click(){
                        this.$emit("son",this.sonData);
                    }
                },

            }
        }
    })
</script>
  • 预览
    在这里插入图片描述
    在这里插入图片描述
(4)兄弟传
  • 原理
    在这里插入图片描述

  • 使用

<div id="app">
    <login></login>
    <register></register>
</div>
<script>
    const middle=new Vue();
    new Vue({
        el:"#app",
        components:{
            "login":{
                data(){
                    return{
                        msg:"login数据"
                    }
                },
                template:"<h1>login</h1>",
                created(){
                    middle.$on("share",function (data){
                        console.log(data)
                    })
                }
            },
            "register":{
                data(){
                    return{
                        msg:"register数据"
                    }
                },
                template:"<button @click='getData'>register</button>",
                methods:{
                    getData(){
                        middle.$emit("share","我是register数据,想要给login分享")
                    }

                }
            }
        }
    })
</script>
  • 预览
    在这里插入图片描述

组件场景

  • tab栏切换(组件切换)
组件切换
  • 两个组件的切换

  • 多个组件的切换

两个组件切换
  • 遇到的第二个vue标签component
  • 使用
<div id="app">
    <a href="#" @click.prevent="flag=true">login</a>
    <a href="#" @click.prevent="flag=false">register</a>
    <login v-if="flag"></login>
    <register v-else="flag"></register>
</div>
<script>
    new Vue({
        el:"#app",
        data:{
            flag:"true"
        },
        components:{
            "login":{
                template:"<div><h1>login</h1></div>"
            },
            "register":{
                template: "<div><h1>register</h1></div>"
            }
        }
    })
</script>
  • 预览
    在这里插入图片描述
多个组件切换
  • 使用component+is
<div id="app">
    <a href="#" @click.prevent="turns('login')">login</a>
    <a href="#" @click.prevent="turns('register')">register</a>
    <a href="#" @click.prevent="turns('index')">index</a>
   <component :is="comName"></component>
</div>
<script>
    new Vue({
        el:"#app",
        data:{
            comName:"login"
        },
        components:{
            "login":{
                template:"<div><h1>login</h1></div>"
            },
            "register":{
                template: "<div><h1>register</h1></div>"
            },
            "index":{
                template:"<div><h1>index</h1></div>"
            }
        },
        methods:{
            turns(name){
                this.comName=name
            }
        }
    })
</script>
  • 预览
    在这里插入图片描述

总结

  • 关键字:component components
  • 关键语句:Vue.component(“名称”,{})
  • 关键全局定义:extend {} 模板
  • 关键标签:template component
  • 关键传值:
    • 父传子值:props+:绑定
    • 父传子方法: @绑定方法+$emit
    • 子传父值:@绑定方法+$emit(绑定,参数)
    • 兄弟传值:新vue实例+$emit+ $ on
  • 组件场景
    • 两个 flag的两个值 true false
    • 多个 comonent+is

拓展

  • props也可为对象:type和default属性
props:{
                    info:{
                        type:String,
                        default:"默认值"
                    }
                }
  • 子组件数据的来源
    • data 是一个方法,可读可修改

      • data(){return{}}
      • data一个方法的原因:如果这个组件在页面多次被使用,每个组件都有自己的独立数据,不影响
    • props 父组件传过来的值,可读(强制修改会报错)

  • 遇到的vue标签: template component
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我很抱歉,但是我无法直接通过引用内容查看具体的图片和代码。然而,根据你提供的引用信息,我可以告诉你关于vue日历自定义组件的一些信息。 根据引用,这个组件目录可以提供给你一些关于vue日历自定义组件的相关代码和文件。 根据引用,这个vue日历组件支持农历和假期展示,并且可以自定义可选择的日期范围。 根据引用,在组件中使用这个vue日历组件,你需要在main.js中引入它。组件默认情况下会显示一个自定义的左侧icon。某一个日期可以出现选中状态,也可以使用圆点模式来表示选中状态。你可以通过传递一个包含active属性的数组对象来自定义某一天的数据。 总的来说,这个vue日历自定义组件提供了一些可定制化的功能,包括农历展示、假期展示以及可选择日期范围等。你可以根据你的需求在组件中进行相应的配置和使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [vue定义日历组件](https://blog.csdn.net/weixin_38644883/article/details/88067612)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [vue日历组件,支持农历以及假期展示,可以自定义可选择日期范围](https://download.csdn.net/download/qq_29597215/86267518)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值