2023/1/7 Vue学习笔记-4-组件的理解

news2024/11/19 19:37:05

1 对组件的理解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
模块与组件、模块化与组件化:
1.模块:
(1)理解:向外提供特定功能的js程序,一般就是一个js文件
(2)为什么:js文件很多很复杂
(3)作用:复用js,简化js的编写,提高js运行效率

2.组件:
(1)理解:用来实现局部(特定)功能效果的代码集合(html/css/js/image…)
(2)为什么:一个界面的功能很复杂
(3)作用:复用编码,简化项目编码,提高运行效率

3.模块化:
当应用中的js都以模块来编写,那这个应用就是一个模块化的应用。

4.组件化:
当应用中的功能都是多组件的方式来编写的,那这个应用就是一个组件化的应用。

2 非单文件组件

非单文件组件 : 一个文件中包含有n个组件。
单文件组件 : 一个文件中只包含有1个组件。(主要使用这种方式)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.1/vue.js"></script>
</head>
<body>
<div id="component">
    <h2>学校名称:{{ schoolName }}</h2>
    <h2>学校地址:{{ schoolAddress }}</h2>
    <hr/>
    <h2>学生名称:{{ studentName }}</h2>
    <h2>学生年龄:{{ studentAge }}</h2>
</div>

<script type="text/javascript">
    new Vue({
        el: '#component',
        data: {
            schoolName: '北京大学',
            schoolAddress: '北京',
            studentName: 'zhaoshuai-lc',
            studentAge: 26
        }
    })
</script>
</body>
</html>

在这里插入图片描述
局部注册:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.1/vue.js"></script>
</head>
<body>
<div id="component">
    <h2>{{ msg }}</h2>
    <hr/>
    <!--    3 编写组件标签-->
    <school></school>
    <school></school>
    <school></school>
    <hr/>
    <student></student>
    <student></student>
    <student></student>
</div>

<script type="text/javascript">
    // 1 创建一个school组件
    const school = Vue.extend({
        template: `
          <div>
          <h2>学校名称:{{ schoolName }}</h2>
          <h2>学校地址:{{ schoolAddress }}</h2>
          <button @click="showName">点我提示学校名</button>
          </div>
        `,
        // el: '#component', 一定不要写el配置项,组件就是一块砖,哪里需要哪里搬。
        data() { // 组件 data 必须写函数式
            return {
                schoolName: '北京大学',
                schoolAddress: '北京'
            }
        },

        methods: {
            showName() {
                alert(this.schoolName)
            }
        }

    })
    // 1 创建一个student组件
    const student = Vue.extend({
        template: `
          <div>
          <h2>学生名称:{{ studentName }}</h2>
          <h2>学生年龄:{{ studentAge }}</h2>
          </div>
        `,
        data() {
            return {
                studentName: 'zhaoshuai-lc',
                studentAge: 26
            }
        }
    })
    new Vue({
        el: '#component',
        data: {
            msg: 'hello-world'
        },
        // 2 注册组件 (局部注册)
        components: {
            school,
            student
        }
    })
</script>
</body>
</html>


在这里插入图片描述
全局注册:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.1/vue.js"></script>
</head>
<body>
<div id="component">
    <h2>{{ msg }}</h2>
    <hr/>
    <!--    3 编写组件标签-->
    <school></school>
    <school></school>
    <school></school>
    <hr/>
    <student></student>
    <student></student>
    <student></student>
</div>

<script type="text/javascript">
    // 1 创建一个school组件
    const school = Vue.extend({
        template: `
          <div>
          <h2>学校名称:{{ schoolName }}</h2>
          <h2>学校地址:{{ schoolAddress }}</h2>
          <button @click="showName">点我提示学校名</button>
          </div>
        `,
        // el: '#component', 一定不要写el配置项,组件就是一块砖,哪里需要哪里搬。
        data() { // 组件 data 必须写函数式
            return {
                schoolName: '北京大学',
                schoolAddress: '北京'
            }
        },

        methods: {
            showName() {
                alert(this.schoolName)
            }
        }

    })
    // 1 创建一个student组件
    const student = Vue.extend({
        template: `
          <div>
          <h2>学生名称:{{ studentName }}</h2>
          <h2>学生年龄:{{ studentAge }}</h2>
          </div>
        `,
        data() {
            return {
                studentName: 'zhaoshuai-lc',
                studentAge: 26
            }
        }
    })
    // 2 注册组件 (全局注册)
    Vue.component('school', school)
    Vue.component('student', student)

    new Vue({
        el: '#component',
        data: {
            msg: 'hello-world'
        }
    })
</script>
</body>
</html>

Vue中使用组件的三大步骤:

一、定义组件(创建组件)
二、注册组件
三、使用组件(写组件标签)

3 组件的几个注意点

1.关于组件名:
一个单词组成:

第一种写法(首字母小写):school
第二种写法(首字母大写):School

多个单词组成:

第一种写法(kebab-case命名):my-school
第二种写法(CamelCase命名):MySchool(需要Vue脚手架支持)

备注:
1)组件名尽可能回避HTML中已有的9元素名称,例如:h2、H2都不行。
2)可以使用name配置项指定组件在开发者工具中呈现的名字。

2.关于组件标签:

第一种写法:<school></school>
第二种写法:<school/>
备注:不适用脚手架时,<school/>会导致后续组件不能渲染。

3.一个简写方式:

const school = Vue.extend(options) 可简写为:const school = options
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.1/vue.js"></script>
</head>
<body>
<div id="component">
    <h2>{{ msg }}</h2>
    <hr/>
    <!--    3 编写组件标签-->
    <my-school></my-school>
</div>
<script type="text/javascript">
    // 1 创建一个school组件
    const MySchool = Vue.extend({
        template: `
          <div>
          <h2>学校名称:{{ schoolName }}</h2>
          <h2>学校地址:{{ schoolAddress }}</h2>
          </div>
        `,
        data() { // 组件 data 必须写函数式
            return {
                schoolName: '北京大学',
                schoolAddress: '北京'
            }
        }
    })

    new Vue({
        el: '#component',
        data: {
            msg: 'hello-world'
        },
        // 2 注册组件
        components: {
            'my-school': MySchool
        }
    })
</script>
</body>
</html>

4 组件的嵌套

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.1/vue.js"></script>
</head>
<body>
<div id="component">
    <!--    编写组件标签-->
    <!--    <app></app>-->
</div>
<script type="text/javascript">
    // 创建一个student组件
    const student = Vue.extend({
        template: `
          <div>
          <h2>学生名称:{{ studentName }}</h2>
          <h2>学生地址:{{ studentAddress }}</h2>
          </div>
        `,
        data() { // 组件 data 必须写函数式
            return {
                studentName: '北京大学',
                studentAddress: '北京'
            }
        }
    })

    // 创建一个school组件
    const school = Vue.extend({
        template: `
          <div>
          <h2>学校名称:{{ schoolName }}</h2>
          <h2>学校地址:{{ schoolAddress }}</h2>
          <student></student>
          </div>
        `,
        data() { // 组件 data 必须写函数式
            return {
                schoolName: '北京大学',
                schoolAddress: '北京'
            }
        },
        // 注册组件 (局部)
        components: {
            student
        }
    })

    // 创建app组件
    const app = Vue.extend({
        template: `
          <div>
          <school></school>
          </div>
        `,
        components: {
            school
        }
    })
    new Vue({
        template: `
          <app></app>`,
        el: '#component',
        // 注册组件
        components: {
            app
        }
    })
</script>
</body>
</html>

5 VueComponent构造函数

关于VueComponent:

 1.school组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.exend生成的。
 2.<school></school>,Vue解析时会帮我们创建school组件的实例对象,即Vue帮我们执行的:new VueComponent(options)。
 3.特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent!!
 4.关于this指向:
(1)组件配置中:
 data函数、methods中的函数、watch中的函数、computed中的函数,他们的this均是【VueComponent实例对象】
(2)new Vue()配置中:
 data函数、methods中的函数、watch中的函数、computed中的函数,他们的this均是【Vue实例对象】
5.VueComponent的实例对象,以后简称vc(也可称之为:组件实例对象)。Vue的实例对象,以后简称vm。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.1/vue.js"></script>
</head>
<body>
<div id="VueComponent"></div>
<script type="text/javascript">

    // 创建一个school组件
    const school = Vue.extend({
        template: `
          <div>
          <h2>学校名称:{{ schoolName }}</h2>
          <h2>学校地址:{{ schoolAddress }}</h2>
          </div>
        `,
        data() { // 组件 data 必须写函数式
            return {
                schoolName: '北京大学',
                schoolAddress: '北京'
            }
        }
    })

    console.log('@', school)
    /*
    构造函数:
    @ ƒ VueComponent (options) {
            this._init(options);
        }*/

    new Vue({
        template: `
          <school></school>`,
        el: '#VueComponent',
        // 注册组件
        components: {
            school
        }
    })
</script>
</body>
</html>

VM 管理 VC:
在这里插入图片描述

6 Vue实例与组件实例

既然vc和vm中的内容一样,为什么不能把vc和vm直接划上等号?
vc是由VueComponent缔造的,vm是由Vue缔造的。这两个缔造的过程肯定不可能完全一样。

比如说在创建组件实例对象、传入配置项的时候,是不可以写el的,但是在创建vm的时候,配置对象中就可以写el。也就是说vm可以写自己为哪个容器服务,但是vc不能指定服务容器,只能跟着vm走。

再比如说,vc的数据配置项(data)就必须写成函数。
可以说,它们俩身上99%的东西一样,但是有这1%就是不一样。就像是两个双胞胎,长得一模一样,但是不能说他们是同个人。

打开官网——学习——教程——组件基础——基本实例中,也有说到:组件是可复用的Vue实例…因为组件是可复用的Vue实例,所以它们与new Vue接收相同的选项…

7 一个重要的内置关系

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.1/vue.js"></script>
</head>
<body>
<div id="prototype">

</div>
<script type="text/javascript">
    function Demo() {
        this.a = 1
        this.b = 2
    }

    const demo = new Demo();
    console.log(Demo.prototype) // 显示原型属性
    console.log(demo.__proto__) // 隐式原型属性
    console.log(Demo.prototype === demo.__proto__)
    // 程序员通过显示原型属性操作原型对象,追加一个x属性,值为99
    Demo.prototype.x = 99 // 设置对象
    console.log('@', demo.x)
    console.log('@', demo.__proto__.x) // 程序通过demo.__proto__取对象

    new Vue({
        el: '#prototype',
        data: {}
    })
</script>
</body>
</html>

一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype
为什么要有这个关系:让组件实例对象(vc)可以访问到Vue原型上的属性、方法
在这里插入图片描述

<!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></title>
    <script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.1/vue.js"></script>
</head>
<body>
<div id="prototy">
    <school></school>
</div>

<script type="text/javascript">
    Vue.config.productionTip = false
    Vue.prototype.x = 99

    // 定义school组件
    const school = Vue.extend({
        name: 'school',
        template: `
          <div>
          <h2>学校名称:{{ name }}</h2>
          <h2>学校地址:{{ address }}</h2>
          <button @click="showX">点我输出x</button>
          </div>
        `,
        data() {
            return {
                name: '北京大学',
                address: '北京'
            }
        },
        methods: {
            showX() {
                console.log(this.x)
            }
        },
    })

    // 创建一个vm
    new Vue({
        el: '#prototy',
        data: {
            msg: '你好'
        },
        components: {
            school
        }
    })

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

在这里插入图片描述

8 单文件组件

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--准备好一个容器-->
<div id="single">
</div>
<script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.1/vue.js"></script>
<script type="text/javascript" src="./main.js"></script>
</body>
</html>

main.js

import App from './App'

new Vue({
    el: '#single',
    template: `
      <app></app>
    `,
    components: {
        App
    }
})

App.vue

<template>
  <div>
    <School></School>
    <Student></Student>
  </div>
</template>

<script>
// 引入组件
import School from "./School"
import Student from "./Student"

export default {
  name: 'App',
  components: {Student, School},
  // 注册组件
  component: {
    School,
    Student
  }
}
</script>

<style>
</style>

School.vue

<template>
  <!--  组件的结构-->
  <div class="sc">
    <h2>学校名称:{{ schoolName }}</h2>
    <h2>学校地址:{{ schoolAddress }}</h2>
  </div>
</template>

<script>
// 组件交互相关的代码(数据、方法)
// 直接暴露组件的配置对象
export default {
  name: 'School', // 跟文件名保持一致
  data() {
    return {
      schoolName: '北京大学',
      schoolAddress: '北京'
    }
  },
  methods: {}
}
</script>

<style>
/*组件的样式*/
.sc {
  background-color: aquamarine;
}
</style>

Student.vue

<template>
  <!--  组件的结构-->
  <div class="sc">
    <h2>学生名字:{{ name }}</h2>
    <h2>学生年龄:{{ address }}</h2>
  </div>
</template>

<script>

export default {
  name: 'Student',
  data() {
    return {
      name: 'zhaoshuai-lc',
      address: '27'
    }
  },
  methods: {}
}
</script>

<style>
/*组件的样式*/
.sc {
  background-color: aquamarine;
}
</style>

在这里插入图片描述

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

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

相关文章

元编程:constexpr +特例化 判断质数

重点&#xff1a; 1.constexpr 函数支持在编译期间完成计算 2.特例化是模板中一种定义 using namespace std;//编译期进行判断 constexpr bool isPrime(unsigned int p) {for (unsigned int d2;d<p/2;d){if (p % d 0){return false;}}return p > 1; }template<int…

【安全硬件】Chap.6 芯片生产猜疑链与SoC设计流程;可能会存在的安全威胁Untrusted IC Supply Chain Threats

【安全硬件】Chap.6 芯片生产猜疑链与SoC设计流程&#xff1b;可能会存在的安全威胁Untrusted IC Supply Chain Threats背景1. IC和半导体产业的全球化2. 芯片生产猜疑链——Untrusted IC Supply Chain Threats可能会存在的安全威胁3. SoC Design Flow主要参考来源背景 在现代 …

专属 Python 开发者的完美终端工具

目录 前言 1.Rich 兼容性 2.Rich 安装说明 3.Rich 的 Print 功能 4.自定义 Console 控制台输出 5.Console 控制台记录 6.表情符号 7.表格 8.进度条 9.按列输出数据 10.Markdown 11.语法突出显示 12.错误回溯(traceback) 前言 今天给大家推荐一个非常精美的终端工…

数学建模——线性规划

目录 一. 线性规划 1.基本概念 线性规划的标准形式为&#xff1a; 线性规划的解&#xff1a; 线性规划三要素&#xff1a; 灵敏度分析&#xff1a; 2.matlab的实现 二. 整形规划 1.整型规划分类 2.基础模型 2.1 非线性约束条件的线性化 3.模型求解 一.钢管下料问题…

【模板初阶】

目录 1. 泛型编程 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.4.1 隐式实例化 2.4.2 显式实例化 2.5 模板参数的匹配原则 3. 类模板 3.1 类模板的定义格式 3.2 类模板的实例化 4 总结 1. 泛型编程 如何实现一个通用的…

【Linux】简单理解静态库(.a)和动态库(.so)

在程序运行的基础原理这篇文章中&#xff0c;最后的代码进行链接过程&#xff0c;我们提到了动态库和静态库的概念。那么什么是动态库和静态库呢&#xff1f;我们来简单理解一下 静态库和动态库1.静态库1.1 静态链接优点1.2 静态链接缺点2.动态库2.1 动态链接的优点2.2 动态链接…

Ae 案例:制作漏光效果

本文介绍使用 Ae 内置效果插件制作漏光效果 Light Leak的一般方法与步骤。效果视频1、新建合成。持续时间&#xff1a;10 秒。2、新建纯色图层&#xff0c;命名为“漏光效果”&#xff0c;然后添加分形杂色 Fractal Noise效果。调整出如云朵一般柔和且层次多的分形杂色图。分形…

TCP中的状态转移(三种情况)

文章目录前言一、 TCP的生命周期二、另外两种挥手情况三、经典四问总结前言 博主个人社区&#xff1a;开发与算法学习社区 博主个人主页&#xff1a;Killing Vibe的博客 欢迎大家加入&#xff0c;一起交流学习~~ 在正常情况下&#xff0c;TCP要经过三次握手建立连接&#xff0c…

部署Web项目 (Linux)

部署Web项目 -- Linux一、Linux 环境搭建二、Linux 常用命令三、搭建 Java 部署环境3.1 JDK3.2 Tomcat3.3 MySQL四、部署 Web 项目4.1 什么是部署4.2 数据库建表4.3 构建项目并打包4.4 拷贝到 Tomcat 中4.5 验证一、Linux 环境搭建 这里我们使用的方法是购买云服务器 (CentOS …

组合数素数判定++和* *t=*afor循环你真的门儿清吗救济金发放

目录 P63_习题4-1_组合数 为什么m n-m P64_习题4-3_素数判定 为什么要floor 到底为什么判断到sqrt(n)即可 和* *t*a for循环你真的门儿清吗 为什么要把较大的数组放在main函数外 P82_eg4-3_救济金发放_UVa133 P63_习题4-1_组合数 防止溢出&#xff0c;又因为m < n…

【JavaScript】module let Object.setPrototypeOf()以及箭头函数

案例&#xff1a;选项卡 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthde…

python 3 添加环境变量后 仍然无法用cmd输入python访问,而是弹出应用商店 | 两种解决方法

问题描述 今天重装python3.10后发现即使正确添加环境变量时&#xff0c;仍然无法用cmd输入python或python3访问&#xff0c;而是弹出应用商店。但是如果输入cmd里输入py是可以运行的&#xff08;证明python是正常安装好的&#xff09;。 这里给出两种解决方法&#xff0c;一种…

指针进阶(详解)

指针进阶一.字符指针二.指针数组1.一次打印多个字符串2.模拟二维数组三.数组指针1.定义2.应用四.函数指针五.函数指针数组六.指向函数指针数组的指针七.回调函数在开始这篇之前&#xff0c;前面有两篇指针初阶&#xff0c;如果需要的话可以去看看哟&#xff01;指针初阶1&#…

网络安全等级保护确定定级对象

声明 本文是学习github5.com 网站的报告而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 网络安全等级保护确定定级对象 信息系统 定级对象的基本特征 作为定级对象的信息系统应具有如下基本特征&#xff1a; 具有确定的主要安全责任主体&#xff1…

【MySQL进阶教程】SQL优化

前言 本文为 【MySQL进阶教程】SQL优化 相关知识&#xff0c;下边将对主键优化&#xff0c;order by优化&#xff0c;group by优化&#xff0c;limit优化&#xff0c;count优化&#xff0c;update优化等进行详尽介绍~ &#x1f4cc;博主主页&#xff1a;小新要变强 的主页 &am…

利用Python为女神制作一个专属网站

快跟随小编一起学习一下如何利用Python语言制作一个专属的网站送给女神吧&#xff01; 如觉得博主文章写的不错或对你有所帮助的话&#xff0c;还望大家多多支持呀&#xff01;关注、点赞、收藏、评论。 目录如觉得博主文章写的不错或对你有所帮助的话&#xff0c;还望大家多多…

1995-2019年全球清廉指数

1995-2019年全球清廉指数 1、时间&#xff1a;1995-2019年 2、来源&#xff1a;透明国际&#xff08;Transparency International&#xff09; 3、区域&#xff1a;全球170多个国家 4、指标说明&#xff1a; 清廉指数&#xff08;Corruption Perceptions Index&#xff0c…

【自学C++】C++ short

C short C short教程 C 中的 short 用来表示一个 整数&#xff0c;也可以叫做短整型&#xff0c;如果我们需要表示的整数比较小&#xff0c;那么我们可以使用 short 来定义&#xff0c;这样可以节省系统资源。 C short定义详解 语法 short int varname value; short varn…

【django】关联模型类中数据的增删改查操作总结

文章目录一、多对一正向操作1、改方法一方法二2、删3、查反向操作案例1&#xff1a;查询百度渠道下的所有学生信息案例2&#xff1a;新增一个百度渠道下的学生1、增直接创建Student对象2、改方法一&#xff1a;add()案例1&#xff1a;将s1,s2,s3添加到百度渠道中方法二:替换对象…

【Java】遨游在多线程的知识体系中(二)

前言&#xff1a;一、分析上篇多线程不安全原因1. count 操作是三个步骤&#xff0c;load add save2. 多个线程之间的调度是无序的&#xff0c;两个线程的上述三个操作可能存在多种不同的相对顺序3. 线程针对变量的修改不是原子的4. 内存可见性5.指令重排序二、synchronize 关键…