vue-day03 组件基础

组件

在vue中,组件是可复用的vue实例。通俗的来说,就是比如之前html,css中经常使用的盒模型布局,其中一个大的div即可看作一个组件,抑或是在不同的功能板块儿中,都可以看做一个组件。
在这里插入图片描述

在vue中注册组件的格式

组件的命名方式

命名方式:
在vue中注册组件的命名方式,你可以选择使用 短横线分隔命名(比较推荐),也可以使用首字母大写(类似java中的命名方式)。 强烈推荐 短横线分隔。

全局注册

Vue.component('blog-bar',{
        props:['title','content'],
        template:`<div><h1>{{title}}</h1><br><span>{{content}}</span></div>`
});

在props属性中,可以自定义组件的封装属性。然后在template中,使用模板字符串来创建你想要的组件的格式,注意需要使用一些标签作为根标签进行包裹,否则会一些标签会丢失。

局部注册

let app2 = new Vue({
        el:"#app2",
        data:{},
        components:{
            "blog-post":{
                props:['title'],
                template:'<h3>{{title}}</h3>'
            }
        }
    })

在vue实例中的components属性里面来注册组件,其语法与全局注册基本类似。

全局注册VS局部注册

全局注册就是 Vue.component 这样会导致我们在一些项目中,加载很多不必要的组件,造成了资源的浪费,局部注册的话就是 在自己创建vue的实例中来注册组件.
注意局部注册的组件在其子组件中不可用。如果想在别的组件中使用另一个局部注册的组件,那么你就在别的组件里面注册就行.可以采用下面的方式:

let app3 = new Vue({
   el:'#app3',
    component:{
        testA:{
            data:{}
            template:'<p>我是局部组件testA</p>'
        }
    }
});

prop属性详细介绍

通过prop向子组件传递数据

在组件中添加props属性可以传递值 比如一个组件用来传递你的博文名称…
在自定义组件中,可以自己添加一些属性 也是通过props来添加,然后传递数据的话就直接{{}}即可。

let app2 = new Vue({
        el:"#app2",
        data:{},
        components:{
            "blog-post":{
                props:['title'],
                template:'<h3>{{title}}</h3>'
            }
        }
    })

props以字符串数组形式的,没有默认值类型—所以你可以灵活的使用v-bind指令来将其绑定数据.props: ['title', 'likes', 'isPublished', 'commentIds', 'author']
但我们通常,为了严谨,所以你应该给每一个prop都指定具体的数据类型(值类型)so 如下:

                props:{
                  title: String,
                  likes: Number,
                  isPublished: Boolean,
                  commentIds: Array,
                  author: Object,
                  callback: Function,
                  contactsPromise: Promise
                }

这样的话会有一个好处,当你提供了默认类型后,浏览器的控制台里面就会提示。(注意,如果提供默认类型的话,则props不能再使用[]而是使用{}).
同理,你也可以对prop添加计算属性进行一些原始数据的转换.比如字符串分隔。。。根据需求来。
然后 是有一个组件认证 —这些你都先可以想想,框架一定为我们提供了什么功能,然后就一看就懂了

   props: {
          // 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证)
          propA: Number,
          // 多个可能的类型
          propB: [String, Number],
          // 必填的字符串
          propC: {
            type: String,
            required: true
          },
          // 带有默认值的数字
          propD: {
            type: Number,
            default: 100
          },
          // 带有默认值的对象
          propE: {
            type: Object,
            // 对象或数组默认值必须从一个工厂函数获取
            default: function () {
              return { message: 'hello' }
            }
          },
          // 自定义验证函数
          propF: {
            validator: function (value) {
              // 这个值必须匹配下列字符串中的一个
              return ['success', 'warning', 'danger'].indexOf(value) !== -1
            }
      }

禁用组件继承:
在组件中添加 inheritAttrs: false,inheritAttrs: false 选项不会影响 style 和 class 的绑定。

几个小例子

计数器

<div id="components-demo">
    <button-counter></button-counter>
    <button-counter></button-counter>
    <button-counter></button-counter>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    Vue.component('button-counter',{
        data:function () {
            return{
                count:0
            }
        },
        template:'<button v-on:click="count++">点击我{{count}}</button>'
    });
    let cpdemo = new Vue({
        el:'#components-demo'
    });

在这里插入图片描述

为了使每个计数器,不会影响到其他的计数器。一个组件的 data 选项必须是一个函数,因此每个实例可以维护一份被返回对象的独立的拷贝。

博文小组件

<div id="app3">
    <blog-all
            v-for="post in posts"
            v-bind:key="post.id"
            v-bind:title="post.title"
            v-bind:author="post.author"
            v-bind:time="post.time"
    >
    </blog-all>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    let app3 = new Vue({
        el:'#app3',
        data:{
            posts:[
                {id:1,title:"前端三剑客知识点概览",author:"杀手一只知更鸟",time:'2022-12-01'},
                {id:2,title:"Java学习路线",author:"debuger",time:'2022-12-07'},
                {id:3,title:"ssm框架整合+springBoot学习",author:"杀手一只知更鸟",time:'2022-12-21'},
                {id:4,title:"前后端分离的完整项目",author:"杀手一只知更鸟",time:'2022-12-21'}
            ]
        },
        components:{
            'blog-all':{
                props:{
                    'id':Number,
                    'author':String,
                    'title':String,
                    'time':String
                },
                template:'<div><h3>{{title}}</h3><p>{{author+time}}</p></div>'
            }
        }
    });

在组件中,可以灵活的使用v-bind属性来动态绑定数据,并且通过v-for指令来遍历渲染对象中的不同的数据。
在这里插入图片描述

未完待续!
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杀死一只知更鸟debug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值