Vue - 标准开发方式、组件(全局、局部、props、事件传递)、插槽的使用

news2024/11/25 19:24:20

目录

一、Vue

1.1、标准开发方式

1.2、组件的使用

1.2.1、全局组件

1.2.2、局部组件

1.2.3、props 传递静态数据

1.2.4、props 传递动态数据

1.2.5、事件传递

1.2.6、插槽slot


一、Vue


1.1、标准开发方式

Vue 的标准开发方式是 SPA(Single Page Application):单页面web 应用,也就是收,日后的项目中只有一张页面(index.html).

为什么要使用 SPA 开发方式?

  1. Vue 官方推荐:一个应用中只能存在一个 Vue 实例.
  2. 复用:Vue 提供了 Component 组件,不仅减少了 Vue 实例的代码量,还可以实现复用.
  3. 解耦合:一个组负责完成项目中的一个功能或者一组功能,实现业务隔离.

1.2、组件的使用

1.2.1、全局组件

全局组件:直接注册到 Vue 根实例组件中.

定义方式:Vue.component(' ', {})  ,第一个参数是组件名,第二个参数是配置对象.

Ps:无论是使用全局组件还是局部组件,都必须在组件 template 中添加唯一根元素.

如下代码:

    <div id="app">
        <!-- 使用组件 -->
        <register></register>
    </div>

    <script src="../js/vue.js"></script>
    <script>
        //定义全局组件(生效的前提是要有 Vue 实例, 并在实例的作用域中使用)
        Vue.component('register', {
            template: `<div><h1>注册</h1><span>{{msg}}</span><span>{{counterSqrt}}</span><comp></comp></div>`,
            data() { //组件中定义数据,必须函数的形式(和 Vue 实例定义唯一的区别)
                return { //返回值是一个对象,对象内部就是数据
                    msg: "我是注册全局组件中的数据",
                    count: 2
                }
            },
            methods: { //给组件定义一些方法
                test() {
                    console.log("我是组件中的方法");
                }
            },
            computed: { //给组件定义一些计算属性
                counterSqrt() {
                    return this.count * this.count;
                }
            },
            components: { //给组件中定义一些组件
                comp: {
                    template: `<div>我是全局组件的子组件</div>`
                }
            },
            beforeCreate() { //组件也有自己的生命周期
                console.log("beforeCreate:", this.msg);//此时 msg 因该是 undefine
            }
            //......
        });

        const app = new Vue({ //没有这里,组件就不会生效
            el: "#app"
        });

效果如下:

 

1.2.2、局部组件

局部组件:只能在注册组件中使用组件.

代码如下:


    <div id="app">
        <login></login>
        <reg></reg>
    </div>

    <script src="../js/vue.js"></script>
    <script>

        //定义局部组件(这是另一种方式,现在外部定义好,再到局部注册组件中引入)
        //Ps:在子组件中不可使用父组件的数据! 比如 parent 数据
        const login = {
            template: `<div><h1>登录</h1><div>{{ child }}{{ counterSqrt }}</div><comp></comp></div>`,
            data() {
                return {
                    child: "我是注册组件的子组件 login 中的数据",
                    count: 3
                }
            },
            methods: { //给组件定义一些方法
                test() {
                    console.log("我是组件中的方法");
                }
            },
            computed: { //给组件定义一些计算属性
                counterSqrt() {
                    return this.count * this.count;
                }
            },
            components: { //给组件中定义一些组件
                comp: {
                    template: `<div>我是子组件的子组件</div>`
                }
            },
            beforeCreate() { //组件也有自己的生命周期
                console.log("beforeCreate:", this.child);//此时 child 因该是 undefine
            }
            //......
        }

        let app = new Vue({
            el: "#app",
            data: {
                parent: "我是父组件中的数据"
            },
            components: { //注册组件
                login, //也可以单独在外面定义好组件,然后引入
                reg: {
                    template: `<div><div>{{ child }}</div></div>`,
                    data() { //注意组件中数据的写法
                        return {
                            child: "我是子组件 reg 中的数据"
                        }
                    }
                }
            }
        });
    </script>

效果如下:

1.2.3、props 传递静态数据

父组件向子组件传递静态数据:在使用的组件标签上,声明静态数据 key=value (key 是自定义的),最后在子组件的 props 中声明对应的  key 即可

代码如下:

    <div id="app">
        <!-- 父组件向子组件传递静态数据:在使用的组件标签上,声明静态数据 key=value (key 是自定义的),最后在子组件的 props 中声明对应的  key 即可 -->
        <login name="hello?" count="1"></login>

    </div>

    <script src="../js/vue.js"></script>
    <script>

        const login = {
            template: `<div><h1>登录</h1><div>{{ name }} --- {{ count }}</div></div>`,
            data() {
                return {
                    //这里相当于添加了 name: "hello?", count="1"
                }
            },
            props: ['name', 'count'] //用来接收父组件传来的数据, 这就相当于在子组件的 data 中添加了这个静态数据
        }

        const app = new Vue({
            el: "#app",
            components: {
                login //注册组件
            }
        });

    </script>

效果如下:

1.2.4、props 传递动态数据

向子组件传递动态数据:

  1. 在组件标签上声明 key=value (key 是自定义的,value 就是 Vue 实例中的 data),子组件内部使用 props 数组声明 key 
  2. 声明的自定义 key 可以通过 v-bind 进行属性的动态绑定

Ps:Vue 官方明确提出只允许单向数据流,也就是只能从父传递到子,否则会报警告

代码如下:

    <div id="app">
        <!-- 向子组件中传递动态数据:
            1.在组件标签上声明 key=value (key 是自定义的,value 就是 Vue 实例中的 data),子组件内部使用 props 数组声明 key 
            2.声明的自定义 key 可以通过 v-bind 进行属性的动态绑定

            最后的效果:
            1.修改 input 中的值 
            2.由于 v-model 动态绑定到 Vue实例中的 data 的 count 数据也随之变化
            3.由于 login 组件中声明的属性 aa 动态绑定了 count,导致 属性aa 也随之变化

            注意:Vue 官方明确提出只允许单向数据流,也就是只能从父传递到子,否则会报警告
        -->
        <login :aa="count"></login>
        <input type="text" v-model="count">
    </div>

    <script src="../js/vue.js"></script>
    <script>

        const login = {
            template: `<h1><div>登录</div><h2>{{ aa }}</h2><button @click="add()">点我增加数字<button></h1>`,
            data() {
                return {

                }
            },
            props: ['aa'],
            methods: {
                add() {
                    this.aa++;//props 声明的数据,就相当于直接 data 中添加了该数据
                }
            }

        }

        const app = new Vue({
            el: "#app",
            data: {
                count: "1"
            },
            components: {
                login
            }
        });

    </script>

最后的效果:

  1. 修改 input 中的值 
  2. 由于 v-model 动态绑定到 Vue实例中的 data 的 count 数据也随之变化
  3. 由于 login 组件中声明的属性 aa 动态绑定了 count,导致 属性aa 也随之变化

如下图

1.2.5、事件传递

父向子传递事件:在组件标签上定义 @key=value (@自定义事件名=父组件中的事件名) 即可

代码如下:

    <div id="app">
        <!-- 父向子传递事件:在组件标签上定义 @key=value (@自定义事件名=父组件中的事件名) 即可 -->
        <login @aa="testParent()" @bb="testParent2" @cc="testParent3"></login>
    </div>

    <script src="../js/vue.js"></script>
    <script>
        const login = {
            template: `<div><h2>登录</h2><button @click="testChild()">点给我调用父组件中的事件</button></div>`,
            data() {
                return {
                    count: 10
                }
            },
            methods: {
                testChild() {
                    alert("我是子组件中的事件!");
                    //通过 this.$emit 来调用父组件中的事件 
                    //参数1:组件标签上定义的事件名
                    //后续参数: 参数1 后面还可以继续传递参数,作为父组件事件中的参数
                    this.$emit("aa");
                    this.$emit("bb", this.count); //Vue 官方说只能单向传递(父传子),但是这种方式可以实现
                    this.$emit("cc", { count: this.count, name: "cyk", isGood: true });
                }
            }
        }

        const app = new Vue({
            el: "#app",
            methods: {
                testParent() {
                    alert("1.我是父组件中的事件!");
                },
                testParent2(count) {
                    alert("2.我是父组件中的事件!");
                    console.log("获取到子组件的值:" + count);
                },
                testParent3(obj) {
                    alert("3.我是父组件中的事件!");
                    console.log("获取到子组件的值: count=" + obj.count + ", name=" + obj.name + ", isGood=" + obj.isGood);

                }
            },
            components: {
                login
            }
        });
    </script>

效果如下:

1.2.6、插槽slot

插槽就是用来扩展现有组件的.

代码如下:

    <div id="app">

        <!-- 插槽: 用来扩展现有组件 -->
        <login></login>
        <!-- 默认: 会将信息填入所有插槽 -->
        <hr>
        <login><span>hello</span></login>
        <!-- 具名插槽: 给 slot 标签添加 name 属性作为身份标识  -->
        <hr>
        <login><button slot="aa" @click="parent()">点我</button></login>
    </div>

    <script src="../js/vue.js"></script>
    <script>

        const login = {
            template: `<div><slot name="aa"></slot><h1>登录</h1><slot name="bb"></slot></div>`,
        }

        const app = new Vue({
            el: "#app",
            methods: {
                parent() {
                    alert("我是父组件的事件");
                }
            },
            components: {
                login
            }
        });

    </script>

效果如下:

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【HCIP】ppp实验

实验要求 1、R1 和 R2 使用 PPP 链路直连&#xff0c;R2和R3 把2条 PPP 链路捆绑为 PPP MP 直连 2、按照图示配置 IP 地址 3、R2对R1的PPP进行单向 chap 验证 4、R2和R3的PPP进行双向 chap 验证 配置 1、如图&#xff0c;R1 和 R2 已使用 PPP 链路直连 2、R2 和 R3上配置…

Linux | Linux权限详解

目录 前言 一、访问角色的分类 1、用户的切换 2、root用户的理解 3、用户切换的理解 二、权限的理解 三、权限管理 1、文件的访问者 2、文件类型与访问权限 &#xff08;1&#xff09;文件类型 &#xff08;2&#xff09;访问权限 3、文件权限的修改 &#xff08…

敏捷开发中,Sprint回顾会的目的

Sprint回顾会的主要目的是促进Scrum团队的学习和持续改进。在每个Sprint结束后&#xff0c;团队聚集在一起进行回顾&#xff0c;以达到以下目标&#xff1a; 识别问题&#xff1a; 回顾会允许团队识别在Sprint&#xff08;迭代&#xff09;期间遇到的问题、挑战和障碍。这有助于…

专业图表绘制软件 OmniGraffle Pro mac v7.22.1中文版软件介绍

OmniGraffle Pro mac是一款Mac平台上的专业绘图软件&#xff0c;主要用于创建各种图形&#xff0c;包括流程图、组织结构图、网络拓扑图、UI原型等。该软件提供了强大的绘图工具和丰富的样式库&#xff0c;可以让用户快速创建出高质量的图形&#xff0c;并支持导入和导出各种常…

BI零售数据分析:以自身视角展开分析

随着零售业务不断扩展&#xff0c;市场竞争不断加剧&#xff0c;各层级的销售管理人员都急需一张能快速查看销售数据分析报表&#xff0c;能从中知道自己管辖内的业务最近或过去的情况&#xff0c;并依次为依据科学优化销售管理措施。这就要求零售数据分析报表信息足够多、数据…

计算机毕业设计 基于SpringBoot产业园区智慧公寓管理系统的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

【Vue】vue2与WebApi跨域CORS问题

系列文章 C#底层库–记录日志帮助类 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/124187709 文章目录 系列文章前言一、技术介绍1.1 为什么会产生跨越1.2 什么是跨越 二、问题描述三、问题解决3.1 方法一&#xff1a;前端Vue修改3.2 方法二&#…

喜报!震坤行荣登“2023上海百强企业”两项百强榜单!

喜报&#xff01;震坤行荣登“2023上海百强企业”两项百强榜单&#xff01; 9月12日&#xff0c;上海市企业联合会、上海市企业家协会、上海市经济团体联合会和解放日报社在中国金融信息中心会议厅联合召开2023上海百强企业新闻发布会&#xff0c;上海市企业联合会会长刘家平主…

信号完整性分析基础知识之有损传输线、上升时间衰减和材料特性(六):衰减和dB

线路中的损耗对信号的主要影响是当信号沿线路长度传播时幅度减小。如果将幅度为 V 的正弦波电压信号引入传输线&#xff0c;则其幅度将随着传输线向下移动而下降。图 9-16 显示了如果我们可以冻结时间并观察直线上存在的正弦波&#xff0c;则正弦波在不同位置可能会是什么样子。…

如何让你的桌面干净得像一张白纸(详细教程)

文章目录 固定到任务栏固定到快速访问固定到“开始”屏幕添加桌面右键菜单最终效果展示程序员专属工具箱 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你的加入&#xff1a;全栈弄潮儿的…

AQS原理及源码解析

概要 AQS是AbstractQueuedSynchronizer类的简称&#xff0c;为了方便&#xff0c;后面都以AQS来指代。AQS通过对互斥锁、共享锁和条件等待的基础实现和封装&#xff0c;同时为juc包下其他类提供扩展&#xff0c;完善了java体系的锁、线程池和并发集合类的实现&#xff0c;主要包…

确保第三方 API 安全的 5 个最佳实践

应用程序编程接口 &#xff08;API&#xff09; 已成为设置功能和灵活性不可或缺的一部分。但它们也是潜在的攻击媒介&#xff0c;需要在安全团队的雷达上占据很高的位置。 当组织考虑应用程序编程接口 &#xff08;API&#xff09; 安全性时&#xff0c;他们通常专注于保护内部…

AssetBundle的正确加载

需求描述 在加载一个AssetBundle资源包&#xff08;后续简称AB包&#xff09;的时候我们还需要考虑其对应的依赖&#xff0c;所以加载AssetBundle资源包并非总是简单地调用相关的加载API即可&#xff0c;缺乏依赖那么AssetBundle资源包中的资源就无法正常加载或使用。 通过Asse…

Ubuntu防火墙设置

查看当前防火墙状态 设定信息端口号为12345的访问 sudo ufw allow 12345

自动化测试有必要学吗?一篇从功能测试进阶到自动化测试...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 问题&#xff1a;…

vue视频直接播放rtsp流;vue视频延迟问题解决;webRTC占cpu太大卡死问题解决

播放多个视频 <div class"video-box"><div class"video"><iframe style"width:100%;height:100%;" name"ddddd" id"iframes" scrolling"auto" :src"videoLeftUrl"></iframe>&l…

【分享】国产AI工具大整理,都是好东西(赶紧看 待会儿删)

哈喽&#xff0c;大家好&#xff0c;我是木易巷~ 我认同一个观点&#xff0c;那就是未来的世界将会只存在两种人&#xff1a;会使用AI的人和不会使用AI的人。相信许多人已经开始感受到了“AI焦虑”&#xff0c;担心自己的技能将被AI超越。然而&#xff0c;我认为AI并不是人类的…

Linux进阶-ipc消息队列

目录 system-V IPC 消息队列 消息队列和信号管道的对比 消息队列和信号的对比 消息队列和管道的对比 消息队列函数API msgget()&#xff1a;打开或创建消息队列 msgsnd()&#xff1a;发送消息 msgrcv()&#xff1a;接收消息 msgctl()&#xff1a;控制消息队列 msgsn…

移动互联网客户端可能没什么路可走了.......

2010~2020可以算移动客户端的黄金十年了&#xff0c;微信、淘宝、抖音等国民级应用都诞生于这十年间&#xff0c;也顺带产生了不少技术上的黑科技&#xff08;比如动态化、跨平台、热修复&#xff09;。 然而现在头部公司的稳定&#xff0c;App独立生存的空间被不断挤压&#…

el-menu页面离开弹窗,当前激活菜单的高亮问题

问题描述 在A页面监控路由离开&#xff0c;&#xff0c;弹出弹窗后提示未保存点击取消&#xff0c;此时左侧的菜单激活是B高亮&#xff0c;正常应该是激活A菜单。 1&#xff0c;A页面页面离开的弹窗&#xff0c;在A页面弹窗点击取消 ##解决方法 1.在菜单组件增事件&#xf…