Vue 组件

组件

官网

组件是什么?

在 Vue 里,一个组件本质上是一个拥有预定义选项的一个 Vue 实例。

组件的使用

  1. 定义(注册)组件
  2. 调用(使用)组件

将组件就看成是一个函数

1. 组件的注册

  1. 全局组件注册

当前 Vue 项目中,任何组件中都可以去使用

Vue.component(Name,Options)
// Name - 组件的名字
// Options - 组件的选项配置
  1. 局部组件注册

在哪个组件中注册的,就只能使用在哪个组件中

在组件的 components 配置选项中去定义
new Vue() 生成的 Vue 实例,一般我们叫他 根组件

new Vue({
   components: {
      Name1:Options1,
    Name2: Options2
   }
})
// Name1、Name2 局部组件名字
// Options1、Options2 局部组件对应的选项

2. 组件的调用

将组件名当成自定义标签使用即可。

<!-- 这个 div 。是可以看成是 根组件的 template 的 -->
<div id="app">
    <name1></name1>
    <name2></name2>
</div>

组件的一些注意事项

  1. 组件没有 el 选项。因为后续调用组件在哪里,这个组件的挂载点就是哪里
  2. 必须有 template 或者 render 选项,用来规定组件的模板内容
  3. data 选项必须是一个函数返回对象的形式
  4. 组件名不能是现有的html标签名,也不能是其他已经注册过的组件名
  5. 全局注册组件时,必须要放置在 new Vue 之前
  6. 组件名可以使用短横线写法与驼峰写法。但是调用组件时需要使用短横线写法。下列三种情况时可以不听这个规则
  1. 写在 template 选项中
  2. 写在 里面的
  3. .vue 后缀的单文件组件中时
  1. 组件的template模板 必须只能有一个根元素。
template: `<div>
    元素....
</div>`,
  1. prop的名字可以是用短横线与驼峰写法。但是调用组件时设置这个prop的时候,需要使用短横线写法。下列三种情况下可以不听这个规则

1 . 使用 template字符串模板
2 . 使用 <script type="text/x-template"></script>
3 . 使用 .vue 后缀的单文件组件中时

  1. prop是不允许修改,应为要遵循单向数据流这个规定
  2. 父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。
  3. 调用组件时,写在组件标签内的内容,默认是不会被渲染的

组件之间的通信方式

两个组件之间如何进行数据传递等一些操作

组件间的关系是如何确定的呢?

组件间的关系不是看定义组件时,而是看调用组件时

  • 一、父组件如何通信子组件 父 -> 子
<body>
        <!-- 
            一、父->子 通信

            就是使用 prop 传递数据给子组件即可
        -->
        <div id="app">
            <parent></parent>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.js"></script>
        <script>
            Vue.component("parent",{
                data(){
                    return {
                        son1name: "小绿",
                        son2name: "小粉",
                        son3name: "小黄",
                    };
                },
                template:`
                    <div>
                        <p>我是爹,这里有三个儿子,分别是小绿,小粉,小黄</p>
                        <button @click="son1name = '小绿绿'">修改 小绿</button>
                        <button @click="son2name = '小粉粉'">修改 小粉</button>
                        <button @click="son3name = '小黄黄'">修改 小黄</button>

                        <son :name="son1name"></son>
                        <son :name="son2name"></son>
                        <son :name="son3name"></son>
                    </div>
                `
            });
            Vue.component("son",{
                props:{
                    name:{
                        type: String,
                        required: true,
                    },
                },
                template:`
                    <div>
                        <p>我是儿子,我是{{ name }}</p>
                    </div>
                `,
            });
            var vm = new Vue({
                el: "#app",
            });
        </script>
</body>
  • 二、子组件如何通信父组件 子 -> 父
  • 三、兄弟组件之间如何通信 兄 -> 弟 弟 -> 兄

组件的 data 必须写成函数形式

data:function(){
    return {'lbw':'pdd'}//template中可以使用lbw
},

原因是 组件是可以进行复用的。如果 data 直接写成 对象,复用的时候,会造成数据污染(复用后影响其它实例)

组件的属性props选项

Vue组件通过props属性来声明一个自己的属性,然后父组件就可以往里面传递数据。

将组件看成是一个函数,props 就是这个函数接收到的参数集合

prop 就是 props 中的具体一个参数
name - prop
hobby - prop
GSTL - prop

<body>
    <div id="app"></div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.js"></script>
    <script>
        Vue.component("pdd", {
        props: ["name", "hobby", "GSTL"],
        template: `
            <div>
                <p>大家好, 我的名字是 {{ name }} </p>
                <p>我的喜好是 {{ hobby }} </p>
                <p>我的战队是 {{ GSTL }} </p>
            </div>
        `,
        });
        var vm = new Vue({
            el: "#app",
            template: `
            <div id="app">
            <pdd name="娇妹" hobby="反向抽烟" GSTL="夕阳红战队"></pdd>
            </div>
        `,
        });
    </script>
</body>

效果图:
在这里插入图片描述

如果调用组件时,没有传递某个 porp 下来,那么组件中的这个 prop 的值是 undefined

我们也能够设置 prop 的默认值,也就是说调用时如果没有传递的化,我就使用默认值

Vue.component("pdd", {
    props: {
        name: {
        //接收到的数据类型
        type: String,
        //设置默认值
        default: "娇妹",
        },
    },
    template: `
        <div>Hello. {{ name }}</div>
    `,
});
var vm = new Vue({
    el: "#app",
    template: `
        <div>
            <pdd></pdd>
            <pdd name="骚猪"></pdd>
        </div>
    `,
});

效果图:
在这里插入图片描述

props数据校验

props: {
    // value 直接写要的类型
    key1: String
    // value 写成对象,在对象中再通过 type 属性去控制类型
    key2: {
        type: Number
    }
    //多种数据类型的参数校验
    key3: [ Number, String ]
}

传递prop的时候,默认都是字符串格式,需要转化的化,只需加上 v-bind 即可

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值