vue的组件和prop

news/2024/7/23 22:07:55 标签: vue

组件基础

组件的作用
组件是可复用的vue实例,且带有一个名字。

组件就是我们自定义的一个元素
但是要注意的是:必须用在vue的模版中使用

全局组件

全局组件挂载:实例化一个vue对象,建立一个组件,然后挂载
注意下面代码有个data函数,此函数是专门用来给模板里面传输数据的

    <div id="app">
        <hc-c></hc-c>

    </div>
    <script>
        Vue.component('hc-c',{
            data(){
                return {
                    count:0
                }
            },
            template:`
                <button @click="count++">你点了我{{ count }}</button>
            `
        })
        let vm = new Vue({
            el:"#app",   
        })
    </script>

在这里插入图片描述

局部组件

局部组件挂载:先建立一个组件,通过实例化的vue对象的components属性来挂载

    <div id="app">
        <hc-c></hc-c>

    </div>
    <script>
         let hcc={
            data(){
                return {
                    count:0
                }
            },
            template:`
                <button @click="count++">你点了我{{ count }}</button>
            `
        }
        let vm = new Vue({
            el:"#app",
            components:{
                "hc-c":hcc
            }
        })
    </script>

prop属性

作用: 捕获组件的属性
需要注意的是:template模板只能有一个根标签,所以用div框起来

下述代码通过proprs捕获zyl-new上的两个属性,然后template里面调用,最终替换zyl-new,渲染页面

<body>
    <div id="father">
        <zyl-new 
        url= "https://dss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=1896307544,583046469&fm=26&gp=0.jpg"
        title= "壁纸一"
        ></zyl-new>
    </div>
    

    <script>
        Vue.component('zyl-new',{
            props:['url','title'],
            template:`
            <div>
                <img :src="url" alt="">
                <span>{{ title }}</span>
            </div>
            `
        })

        let vm=new Vue({
            el:"#father"
        })
    </script>
</body>

在这里插入图片描述

循环嵌套
下述代码通过给zyl-new标签绑定一个属性,此属性在实例化的Vue的data里面是定义了的,那么此时的zyl-new便获取到了data里面的数据,保存在vl属性里。第一个组件便通过props捕获数据再通过v-for循环得出两个组件并给每个组件加上属性。第二个组件则再去捕获第一个组件遍历出的两个标签,达到效果。

<body>
    <div id="father">
        <zyl-new :vl='vl'></zyl-new>
    </div>
    <script>
   	 //第一个组件
        Vue.component('zyl-new', {
            props: ['vl'],
            template: `
            <div>
                <zyl-Son :ur="item.ur" :tit="item.tit" v-for="item in vl">
                    
                </zyl-Son>
            </div>

            `
        })

	//第二个组件
        Vue.component('zyl-Son', {
            props: ['ur', 'tit'],
            template: `
                <div>
                    <img :src='ur' alt="">
                    <span>{{ tit }}</span>
                </div>
            `
        })

        let vm = new Vue({
            el: "#father",
            data: {
                vl: [
                    {
                    ur: "https://dss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=1896307544,583046469&fm=26&gp=0.jpg",
                    tit: "壁纸一"
                },
                {
                    ur: "https://dss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3394484960,2663273820&fm=26&gp=0.jpg",
                    tit: "壁纸二"
                }
            ]
            }
        })
    </script>
</body>

在这里插入图片描述

组件属性驼峰命名

可以看到zyl-new标签有个属性:title-new。而我们可以在props将其-省略并将N大写,可以达到一样的效果。

<body>
    <div id="father">
        <zyl-new 
        title-new= "壁纸一"
        ></zyl-new>
    </div>
    

    <script>
        Vue.component('zyl-new',{
            props:['titleNew'],
            template:`
            <div>
                <span>{{ titleNew }}</span>
            </div>
            `
        })

        let vm=new Vue({
            el:"#father"
        })
    </script>
</body>

prop验证

作用: 当数据格式不符合条件时,会报错,但程序不会终止运行

<body>
    <div id="father">
        <zyl-new 
        :title-new= "test"
        ></zyl-new>
    </div>
    

    <script>
        Vue.component('zyl-new',{
            props:{
                titleNew:String
            },
            template:`
            <div>
                <span>{{ titleNew }}</span>
            </div>
            `
        })

        let vm=new Vue({
            el:"#father",
            data:{
                test:123
            }
        })
    </script>
</body>

在这里插入图片描述
可以看到程序报错,但123出来了

绑定多个验证

props:{
                titleNew:[String,Number]
            }

required
作用:可以使用required选项来声明这个参数是否必须传入,如果没有属性传入便会报错。

props: {
            fooMessage: {
                type: Number,
                required: true
            }
        }

此处的type是绑定数据类型

default
作用:使用default选项来指定当父组件未传入参数时props变量的默认值

props: {
            fooMessage: {
                type: Number,
                default: 128
            }
        }

validator
当校验规则很复杂,默认提供的校验规则无法满足的时候可以使用自定义函数来校验。

非 prop 特性

所谓非 prop 特性,就是指它可以直接传入组件,而不需要定义相应的 prop。

尽管为组件定义明确的 prop 是推荐的传参方式,组件的作者却并不总能预见到组件被使用的场景。所以,组件可以接收任意传入的特性,这些特性都会被添加到组件的根元素上。

    <div id="father">
        <zyl-mew type="radio" class="one" style="color: red;"></zyl-mew>
    </div>
    <script>
        Vue.component('zyl-mew',{
            template:`
                <div>
                    <input/>
                    我是组件
                </div>
            `
        })

        let vm=new Vue({
            el:"#father"
        })
    </script>

在这里插入图片描述

可以看到上述代码没有通过prop去捕获对应的属性,而自定义标签上的属性直接传递到了模板的根节点上了。

prop特性禁用特性继承

当我们不想让属性继承到根节点时,可以通过inheritAttrs: false结合$attrs来操作属性

$attrs:获取标签中除class和style之外的标签上的属性。
inheritAttrs: false 禁用特性继承
    <div id="father">
        <zyl-mew abc="123" type="radio" class="one" style="color: red;"></zyl-mew>
    </div>
    <script>
        Vue.component('zyl-mew',{
            // props:["type"],
            inheritAttrs: false,
            template:`
                <div>
                    <input v-bind="$attrs"/>
                    我是组件
                </div>
            `
        })

        let vm=new Vue({
            el:"#father"
        })
    </script>

在这里插入图片描述


http://www.niftyadmin.cn/n/1570154.html

相关文章

macos 全局快捷键 打开 iterm_Mac必备的20大快捷键,速成Mac老司机

回想第一次使用 macOS &#xff0c;找不到关机键&#xff0c;没事还在桌面点右键找刷新。作为 10 年的 Windows 党表示真的很脸红&#xff0c;不同操作系统的操作习惯相差还是巨大的&#xff0c;好在小编现在是 macOS 和 Windows 双修了。所以小编还是觉得最简单也是最实用的。…

vue的插槽

最简单的使用 <div id"father"><zyl-mew>12312</zyl-mew></div><script>Vue.component(zyl-mew,{template:<div><slot></slot></div>})let vmnew Vue({el:"#father"})</script>可以看到通过s…

python3.7安装包多大_安装python 3.7

一、安装依赖包 yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make 二、再执行安装一个工具&#xff0c;不安装会导致pip安装失败 yum install libffi-devel -y 三、下载python3.7的包&#xff0c;有两种方法&am…

Vue——组件监听

用处 我们在创建组件后&#xff0c;如果想给组件里面的标签绑定事件&#xff0c;就需要用到组件监听了。 自定义事件绑定到组件中 也就是给自定义标签建一个非原生事件&#xff0c;然后将这个事件绑定到主键里。需要用到 Vue的内建方法$emit 来操作 <div id"father&…

div自适应窗口大小_【Word VBA】 91页,5万多字,表格数目不详,统一调整大小

Word 由于一般人都只用来打打字&#xff0c;所以用到VBA的场景不多。但是对于写手、科研工作者&#xff0c;经常要用Word写文章&#xff0c;遇到一个长篇文章&#xff0c;需要批量调整格式内容时&#xff0c;VBA就有用武之地了。比如最近拿到了一个91页Word&#xff0c;里面有不…

Vue的component标签

作用 可以在一个组件上进行多样化渲染。例如&#xff1a;选项卡 is属性 <div id"father"><component is"one"></component><component is"two"></component></div><script>Vue.component(one, {tem…

小程序动态class_ROS class loader动态加载原理剖析

什么是classloader&#xff1f;classloader直译过来是类加载器&#xff0c;类加载器主要用来动态加载库文件&#xff0c;动态加载是一种机制&#xff0c;计算机程序可以通过这种机制在运行时将库&#xff08;或者其它二进制文件&#xff09;加载到内存中&#xff0c;检索库中包…

vue中的混入

混入 基础 混入 (mixin) 提供了一种非常灵活的方式&#xff0c;来分发 Vue 组件中的可复用功能。 一个混入对象可以包含任意组件选项。当组件使用混入对象时&#xff0c;所有混入对象的选项将被“混合”进入该组件本身的选项。 案例&#xff1a; <div id"father&quo…