Vue中的组件

  在应用程序的开发中,组件是不可缺少的。在Vue的使用中,同样也会用到组件。
  vue组件的一般知识点:
  1、组件的名字唯一;
  2、组件以Html形式书写;
  3、组件可以复用;
  4、组件可以嵌套;
  5、组件可以相互调用;
  6、组件分为可视化组件和非可视化组件。
  一般情况下,组件写在一个单独的文件中,在使用的时候按需引入和使用。

  一、组件的定义和使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue组件的定义与使用</title>
    <script src="vue.js"></script>    
</head>
<body>
    <div id="demo1" style="background-color: aquamarine;">
        <p>这是demo1组件</p>
        <my-html1></my-html1>
        <my-html2></my-html2>
        <my-html3></my-html3>
        <my-html5></my-html5>
        <my-html7 inline-template>
            <div>{{title}}</div>                
        </my-html7>
    </div>
    <div id="demo2" style="background-color: darksalmon;">
        <p>这是demo2组件</p>
        <my-html1></my-html1>
        <my-html2></my-html2>
        <my-html4></my-html4>
        <my-html6></my-html6>
    </div>
    <template id="component5">
        <div>
            <p>组件5</p>
        </div>
    </template>    
    <script type="text/x-template" id="component6">
        <div>
          <p>{{ mytitle }}</p>
        </div>
    </script>

    <script>
        var mycompponet5={
            template:"#component5"
        }
        //创建组件模板对象
        const mytemplate=Vue.extend ({
            template:`
            <div>
                <p>标签组件1</p>
            </div>
            `
        });
        //注册全局组件
        Vue.component('my-html1',mytemplate);
        Vue.component('my-html5',mycompponet5);
        Vue.component('my-html6',{
            template:'#component6',
            data(){
                { return {mytitle:"组件6"}    }
            }
        });
        Vue.component('my-html7',{
            data(){
                return {title:'组件7' }
            }
        });
        //注册组件的另外方式是直接写内容
        Vue.component('my-html2',{
            data(){ return {count:1}    },            
            template:`<button v-on:click="count++">按钮组件2,点击数:{{count}}</button>`
        });

        const myhtml3={
            data(){ return { count:0}   },
            template:`<button v-on:click="count++">按钮组件3,点击数:{{count}}</button>`
        }

        //创建vue对象
        const vueApp1=new Vue({
            el:'#demo1',
            components:{
                'my-html3':myhtml3
            }
        });

        const vueApp2=new Vue({
            el:'#demo2',
            components:{
                'my-html4':{
                    data(){ return { count:0}   },
                    template:`<button v-on:click="count++">按钮组件4,点击数:{{count}}</button>`                    
            }
        }
        });        
    </script>
</body>
</html>

  显示结果:

  从上面的代码中可以看出,vue的组件有7种写法之多,实际的编码过程中可以根据个人喜好选择。

  二、组件的嵌套

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue组件的嵌套</title>
    <script src="vue.js"></script>    
</head>
<body>
    <div id="demo" style="background-color: aquamarine;">
        <my-html1></my-html1>
        <my-html2></my-html2>
    </div>

    <script>
        //创建组件模板对象
        const AloneTemplate={
            template:`
            <div>
                <p>独立的组件1</p>
            </div>
            `
        };
        Vue.component('my-html1',{
            data(){ return {count:1}    },            
            template:`<div><button>按钮组件</button><childcomponet></childcomponet></div>`,
            components:{
                'childcomponet':AloneTemplate
            }
        });

        Vue.component('my-html2',{
            data(){ return {count:1}    },            
            template:`<div><button>按钮组件</button><childcomponet></childcomponet></div>`,
            components:{
                'childcomponet':{
                    template:`
                    <div>
                        <p>独立的组件2{{count}}</p>
                    </div>
                    `                    
                }
            }
        });

        //创建vue对象
        const vueApp1=new Vue({
            el:'#demo'
        });

    </script>
</body>
</html>

  上面是组件嵌套的两种写法。

  三、组件的传值与通信

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue的通信</title>
    <script src="vue.js"></script>    
</head>
<body>
    <div id="demo" style="background-color: aquamarine;">
        <html-a v-bind:incomepara1="worker" v-bind:incomepara2="program"></html-a>
    </div>
    <script>
        const AloneTemplate={
            data(){ return { name:'人员列表' } },
            template:`
            <div>
                <p>{{name}}</p>
                <p>人员1:{{ incomepara1.name +"--"+incomepara1.age}}</p>
                <p>人员2:{{incomepara2.name}}--{{incomepara2.age}}</p>
            </div>
            `,
            props:['incomepara1','incomepara2']
        };
        const vueApp=new Vue({
            el:'#demo',
            data:{
                worker:{    name:"json",age:37    },
                program:{   name:"sdf",age:31   }
            },
            components:{'html-a':AloneTemplate}
        });
    </script>
</body>
</html>

  注意:
  1、props是一个数组,它起到桥梁的作用,可以传递多个参数,具体的参数可以是数组、变量名,也可是对象,传递对象就可以传递丰富的参数值。
  2、props可以理解为代理,对于组件而言,通过v-bind让props的参数指向父项的具体参数,对于组件内部就可以直接使用了。
  3、v-bind的绑定时括号里面可以是运算表达式。
  4、参数传递是对象的写法:

props:{
        age:Number,//表示年龄是数字
        name:[String,Number],//表示姓名可以是字符串或者数字
        mydate:{
                    Date,
                    default:'2000-1-1'
                },
        arrlist:{
                    type:Array,
                    default:[],
                    required:true    //表示必须输入
        },
        myobj
       }

  下面是一个子组件与父组件相互通信的例子:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Vue Component Communication</title>
  <script src="vue.js"></script>
</head>
<body>
  <script type="text/x-template" id="mycomponent">
    <div style="background-color: aquamarine;width: 500px;">
        <h2>这是子组件</h2>
        姓名:<input type="text" v-model="myPerson.name"/>
        年龄:<input type="number" v-model="myPerson.age"/>
        <h3>这是来自父组件的信息:我是{{ proxyperson.name }},今年{{proxyperson.age}}岁。</h3>
        <button @click="emitEvent">发送信息给父组件</button>
    </div>
  </script>
  <div id="app" style="background-color: rgb(140, 91, 201);width: 600px;">
        <h2>这是父组件</h2>
        姓名:<input type="text" v-model="dawn.name"/>
        年龄:<input type="number" v-model="dawn.age"/>
        <h3>这是来自子组件的信息:我是{{ childperson.name }},今年{{childperson.age}}岁。</h3>
        <mycomponent :proxyPerson="dawn" @custom-event="handleEvent"></mycomponent> </br>
  </div>
  <script>
    Vue.component('mycomponent', {
      data(){
        return {  myPerson:{  name:'John',age:23  }
        }
      },
      template: '#mycomponent',
      props: ['proxyperson'],
      methods: {
        emitEvent() { this.$emit('custom-event', this.myPerson);  }
      }
    });
    new Vue({
      el: '#app',
      data: {
          dawn:{  name:'SDF',age:35 },
          childperson:{ name:'',age:0 }
      },
      methods: {
        handleEvent(obj) {  this.childperson=obj; }
      }
    });
  </script>
</body>
</html>

  显示结果:

  父组件中的信息变化与子组件中的信息同步,这是因为prop起到了绑定对象的作用,子组件中的信息变化在点击按钮【发送信息给父组件】后因为对象绑定了,在自定义的事件custom-event中调用了父组件的方法handleEvent(obj),所以也是实时变化同步。

  组件之间的通讯也可以借助父对象来进行,这样父对象起到桥梁的作用,不过这样的方法不值得推荐,特殊的情况下可以使用。

<!DOCTYPE html>
<html>
<head>
  <title>Vue组件间通信示例-人员列表</title>
  <script src="vue.js"></script>
</head>
<body>
    <div id="app">
      <add-person :mypersons="parentpersonlist"></add-person>
      <person-list :mypersons="parentpersonlist"></person-list>
    </div>
  <!-- 组件 AddPerson -->
  <template id="add-person">
      <div><label>姓名:</label><input v-model="name" type="text"><button @click="addPerson">增加人员</button></div>
  </template>
  <template id="person-list">
      <div><ul><li v-for="person in persons">{{ person }}</li></ul></div>
  </template>
  <script>
    //组件:AddPerson
    Vue.component('add-person', {
      data(){
        return {  childpersons:this.mypersons,name:''  }
      },
      template: '#add-person',
      methods: {
        addPerson() {
          this.childpersons.push(this.name);
          this.$emit('update:parentpersonlist');
        }
      },
      props: ['mypersons']
    });
    //组件:PersonList
    Vue.component('person-list', {
      data(){ return { persons:[] } },
      template: '#person-list',
      props: ['mypersons'],
      created() { this.persons=this.mypersons;  }
    });
    new Vue({
      el: '#app',
      data:{  parentpersonlist:['张1', '李2', '王3']  }
    });
  </script>
</body>
</html>

  结果显示:

  2023年一月份的时候学习vue,写了三篇文章,分别是:
  1、Vue组件化编程的基础知识要点
  2、Vue组件化编程的组件通信
  3、三种简洁易行的方法解决基于Vue.js的组件通信

  一年过去了,我都快忘记了,以前是断断续续地学,并没有做个项目,看来学习需要实时跟进并且要加以适当的练习。
  编程就是这样,学会容易,上手也很快,但是不做项目加以巩固,等于没有学!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/337035.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

postgresql(Windows)初始化数据库教程

省流&#xff1a;本文章内容讲的是如何初始化postgresql数据库环境&#xff0c;前提是已经安装好postgresql数据库&#xff0c;安装步骤参考postgresql&#xff08;Windows&#xff09;安装教程 # 开始&#xff1a;安装postgresql-12.14-2-windows-x64.exe完成后进行初始化数据…

gin中间件篇

1. 全局中间件 所有请求都经过此中间件 package mainimport ("fmt""time""github.com/gin-gonic/gin" )// 定义中间 func MiddleWare() gin.HandlerFunc {return func(c *gin.Context) {t : time.Now()fmt.Println("中间件开始执行了&quo…

《Linux高性能服务器编程》笔记04

Linux高性能服务器编程 本文是读书笔记&#xff0c;如有侵权&#xff0c;请联系删除。 参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 文章目录 Linux高性能服务器编程第09章I/O复用9.1 select系统调用9.2 po…

JVM之java内存区域[1](程序计数器、栈)

文章目录 版权声明零 运行时数据区一 程序计数器1.1 加载阶段1.2 执行阶段1.3 多线程情况 二 栈2.1 java虚拟机栈2.2 java虚拟机栈帧的组成2.2.1 局部变量表2.2.2 操作数栈2.2.3 帧数据 2.3 栈内存溢出2.4 设置帧大小2.5 本地方法栈 版权声明 本博客的内容基于我个人学习黑马程…

如何快速打开github

作为一个资深码农&#xff0c;怎么能不熟悉全球最大的同性交友社区——github呢&#xff0c;但头疼的是github有时能打开&#xff0c;有时打不开&#xff0c;这是怎么回事&#xff1f; 其实问题出在github.com解析DNS上&#xff0c;并不是需要FQ。下面提供一个方法&#xff0c;…

C++:基于C的语法优化

C&#xff1a;基于C的语法优化 命名空间命名空间域域作用限定符展开命名空间域 输入输出缺省参数全缺省参数半缺省参数 函数重载参数类型不同参数个数不同参数类型的顺序不同 引用基本语法按引用传递返回引用引用与指针的区别 内联函数autoauto与指针和引用结合 范围for循环nul…

官方版2345加速浏览器(好用的浏览器分享)

官方版2345加速浏览器&#xff08;好用的浏览器分享&#xff09; 2345加速浏览器拥有智能拦截骚扰广告&#xff0c;识别欺诈网站&#xff0c;云收藏夹等功能&#xff0c;高速上网、不假死、不卡机&#xff0c;是一款强大的多功能网页浏览器。 使用2345加速浏览器,您可以轻松应对…

DHCP配置(路由器,交换机)

DHCP接口地址池配置 拓扑 PC配置DHCP点击应用。 路由器配置命令 <Huawei>sy Enter system view, return user view with CtrlZ. [Huawei]int g0/0/1[Huawei-GigabitEthernet0/0/1]ip address 10.1.1.1 24[Huawei-GigabitEthernet0/0/1]q[Huawei]dhcp enable Info: T…

【日常聊聊】边缘计算的挑战和机遇

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 边缘计算的挑战和机遇 一&#xff1a;数据安全与隐私保护 二&#xff1a;网络稳定性与可靠性 三&#xff1a;实时性与性能优…

电压检测芯片适用于哪些应用领域?

原文链接&#xff1a; 电压检测芯片适用于哪些应用领域&#xff1f; - 知乎 (zhihu.com) 电压检测基本涉及到电子世界的方方面面。 我上一份工作是做无人机飞控研发&#xff0c;无人机在使用过程中是需要事件监测电压的&#xff0c;还需要针对电压对航行进行预估&#xff0c;…

推荐新版AI智能聊天系统网站源码ChatGPT NineAi

Nine AI.ChatGPT是基于ChatGPT开发的一个人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过学习和理解人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人类一样来聊天交流&#xff0c;甚至能完成撰写邮件、视频脚本、文案、翻译、代…

SpringMVC(八)处理AJAX请求

一、处理AJAX之准备工作: 首先我们创建一个新的工程: 我们将pom.xml复制过来: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-in…

两条链表相同位数相加[中等]

优质博文IT-BLOG-CN 一、题目 给你两个非空的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照逆序的方式存储的&#xff0c;并且每个节点只能存储一位数字。请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。你可以假设除了数字0之外&#xff0c;这…

HCIA-HarmonyOS设备开发认证-HarmonyOS简介

目录 前言目标一、HarmonyOS简介1.1、初识HarmonyOS1.2、HarmonyOS典型应用场景 二、HarmonyOS架构与安全2.1、HarmonyOS架构 前言 本章主要介绍HarmonyOS分布式操作系统的概念、关键技术与能力以及HarmonyOS典型的应用场景。 目标 学习完成本课程后&#xff0c;您将能够&…

二、用户管理(上)

目录 1.用户/组基本概念 用户基本信息文件&#xff1a;vim /etc/passwd&#xff08;冒号为分隔&#xff0c;分为7列字段&#xff09; 用户密码信息文件&#xff1a;/etc/shadow 组信息文件&#xff1a;/etc/group。 2.用户/组管理 查看当前用户&#xff1a;whoami 创建用…

解锁黑匣子:Chain-of-Note如何为(RAG)带来透明度

英文原文地址&#xff1a;https://ai.plainenglish.io/unlocking-the-black-box-how-chain-of-note-brings-transparency-to-retrieval-augmented-models-rag-ae1ebb007876 论文地址&#xff1a;https://arxiv.org/pdf/2311.09210.pdf 2023 年 11 月 16 日 介绍 检索增强语…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于混合博弈的配电网与多综合能源微网优化运行》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 这个标题涉及到配电网和多综合能源微网的优化运行&#xff0c;而优化的方法基于混合博弈理论。让我们逐步解读这个标题的关键部分&#xff1a; 基于混合…

django邮件通知功能-

需求&#xff1a; 1&#xff1a;下单人员下订单时需要向组长和投流手发送邮件通知 2&#xff1a;为何使用邮件通知功能&#xff1f;因为没钱去开通短信通知功能 设计 1&#xff1a;给用户信息表添加2个字段 第一个字段为&#xff1a;是否开通邮件通知的布尔值 第二个字段为: 用…

一键完成,批量转换HTML为PDF格式的方法,提升办公效率

在当今数字化的时代&#xff0c;HTML和PDF已经成为两种最常用的文件格式。HTML用于网页内容的展示&#xff0c;而PDF则以其高度的可读性和不依赖于平台的特性&#xff0c;成为文档分享和传播的首选格式。然而&#xff0c;在办公环境中&#xff0c;我们经常需要在这两种格式之间…

外包干了5个月,技术退步明显...

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…