Vue(组件化编程:非单文件组件、单文件组件)

news2024/11/26 20:51:23

一、组件化编程

1. 对比传统编写与组件化编程(下面两个解释图对比可以直观了解)

传统组件编写:不同的HTML引入不同的样式和行为文件

组件方式编写:组件单独,复用率高(前提组件拆分十分细致) 

理解为封装行为:html,css,js封装在一个文件中

解释模块化和组件化的区别:

组件化:css,js,html三件套使用在同一部分的代码封装在一个组件中

模块化:只是将js文件进行拆分为多个文件

 

2. 组件化编程区分 

非单文件组件:一个文件中包含n个组件 

单文件组件:一个文件中只包含一个组件:后缀名是.vue(项目中多使用此方法)

3. 非单文件组件的引出 

使用两类数据进行划分组件包装部分,引出单文件组件的使用

  • 可以给每一部分进行划分并命名

  <div id="root">
      <h2>学校名称:{{schoolName}}</h2>
      <h2>学校地址:{{addrss}}</h2>
      <hr />
      <h2>学生名称:{{studentName}}</h2>
      <h2>学生年龄:{{age}}</h2>
  </div>
//vue数据
 const vm = new Vue({
      el: "#root",
      data: {
        schoolName: "清华",
        addrss: "北京",
        studentName: "李华",
        age: "18",
      },
  });

 

 4. 单文件组件的使用

(1)局部注册(在vue配置项components中注册)

  • Vue.extend({}):创建组件(可以给此组件进行命名)

    • 出现很多配置项:但是几乎和Vue实例的配置项相同

    • const school = Vue.extend({})

    • 注意:此处不可以使用el绑定模板(template:``配置进行展示容器内容)

    • // el: "#root",//组件定义:一定不写el配置项:因为最终都要被vm管理,
      //由vm决定服务于哪个容器
      // 利用函数式写data:如果使用对象式,当其他模板调用时候修改也会修改原来的数据
       template: `
            <div>
              <h2>学校名称:{{schoolName}}</h2>
              <h2>学校地址:{{address}}</h2>
              <button @click="showName">点我提示学校名</button>
            </div>
            `,
    • 注意:此处的data使用的是函数式返回(不是对象式):因为多次一使用同一个组件,当后使用组件部分改变data中数据,前面组件使用组件的数据也会改变

    •   data() {
              return {
                schoolName: "清华",
                address: "北京",
              };
            },
  • components:{'组件名','...'} :注册组件(在Vue实例中使用此配置项):局部注册

 components: {
        // 完整写法:重新组件命名,创建组件的名字不是组件名,注册组建的名字才是组件名
        // xuexiao: school,
        // xueshneg: student,
        // 简写:相同的名字
        school,
        student,
      },
  • 组件标签:使用组件(将组件标签写在容器中,可以写多个组件标签=复用)

 <!-- 第三步编写组件标签 -->
      <school></school>
      <school></school>

给单文件组件添加事件:直接在组件的配置模板中绑定事件,并在组件中添加配置回调方法

(2)全局注册 :Vue.component('组件名',创建名)

创建组件并进行全局注册:此时的组件标签就可以在任何Vue绑定的模板中使用

 //1. hello全局组件创建
    const hello = Vue.extend({
      template: `
        <div>
        <h2>你好{{name}}</h2>
        </div>
      `,
      data() {
        return {
          name: "TOM",
        };
      },
    });
    
    
// 2. 全局注册组件(组件名字,组件在哪):可以使用在任何vue绑定的模板中
Vue.component("hello", hello);

 5. 单文件组建的注意点

  • 组件名:

    • 一个单词组件名:就是纯小写或者首字母大写(例如school、School)

    • 多个单词组件名:

      • kebab-case命名:my-school

      • CamelCase命名:MySchool(需要脚手架支持)

    • 备注:

      • 组件名回避html标签

      • 使用name配置项指定组件在开发者工具中呈现的名字(创建组件时候直接使用配置项name:进行命名=开发者工具中名字展示)

    • 组件标签:

      • 第一种写法:school组件标签写法 <school></school>

      • 第二种写法:<school/> (需要脚手架环境支持),以为不在脚手架环境复用多个组件标签只会渲染一个组件

    • 组件创建时候的简写方式:没有了extend()

    // 简写创建组件
    const school = {
      name: "xlf",
      template: `  <div>
         <h2>学校名称:{{name}}</h2>
         <h2>学校地址:{{address}}</h2>
       </div>`,
      data() {
        return {
          name: "xlf",
          address: "北京",
        };
      },
    };

 6. 组件的嵌套

以下展示说明大组件种包含着小组件也就是所谓的嵌套

 

  • 创建student子组件:必须在子组件创建好之后然后在父组件中注册

  • 创建school父组件:直接在此组件使用components(注册student,注册在哪里需要在那个模板中使用标签)

//子组件创建
 const student = Vue.extend({
      name: "student",
      template: `
			<div>
      <h2>学生姓名{{name}}</h2>
      <h2>学生年龄{{age}}</h2>
    	</div>
			`,
      data() {
        return {
          name: "德华",
          age: "18",
        };
      },
    });
//父组件创建并注册子组件(在负组件中使用子组件标签)
    const school = Vue.extend({
      name: "school",
      template: `
			<div>
      <h2>学校名称:{{name}}</h2>
      <h2>学校地址;{{address}}</h2>
			<student></student>
    	</div>
			`,
      data() {
        return {
          name: "清华",
          address: "北京",
        };
      },
      // 在组件内直接注册
      components: {
        student,
      },
    });
//最后总结在vue中
   new Vue({
      template: `<school></school>`,
      el: "#root",
      data: {},
      // 2.注册组件
      components: {
        school,
      },
    });

 开发中一创建app组件:管理所有组件(用法都是套娃)

 // 1.定义组件:注册给谁就在谁的模板上写组件标签
    const school = Vue.extend({
      name: "school",
      template: `
			<div>
      <h2>学校名称:{{name}}</h2>
      <h2>学校地址;{{address}}</h2>
			<student></student>
    	</div>
			`,
      data() {
        return {
          name: "清华",
          address: "北京",
        };
      },
      // 在组件内直接注册
      components: {
        student,
      },
    });
    // 定义app组件:注册亲子级组件,并及那个子级组件模板写入
    const app = Vue.extend({
      template: `
			<div>
      <hello></hello>
      <school></school>
      </div>
			`,
      components: {
        hello,
        school,
      },
    });

    new Vue({
      template: `<app></app>`,
      el: "#root",
      data: {},
      // 2.注册组件
      components: {
        app,
      },
    });

7. Vue.Component(组件实例化)

使用一个组件:进行了解Vue.Component

<div id="root">
      <!-- 3.使用标签 -->
      <school></school>
</div>

//vue
 // 1.定义组件school
    const school = Vue.extend({
      template: `
      <div>
      <h1>学校名称:{{name}}</h1>
      <h1>学校地址:{{address}}</h1>
    </div>
      `,
      data() {
        return {
          name: "清华",
          address: "北京",
        };
      },
});
new Vue({
      el: "#root",
      // 2.注册组件
      components: {
        school,
      },
});
  • 查看一下创建的组件:构造函数表示使用需要new一下(封装在源码)

  • 构造函数时Vue.extend生成的

  • 只需要使用组件标签就会创建组件实例=vc实例(使用两次组件标签就会实例化两次vc)

console.log(school);

 

  •  特别注意:每次调用Vue.extend就会创建一个全新的vc

  • 测试:在上面school组件基础上创建第二个个组件并对一个组件进行修改然后查看两个组件实例之间的区别

 // 定义组件hello
    const hello = Vue.extend({
      template: `
      <div>
      <h2>学校名称:{{msg}}</h2>
      <button @click="showName">点我显示学校名字</button>
    </div>
      `,
      data() {
        return {
          msg: "hello",
        };
      },
      methods: {
        showName() {
          console.log("showName", this);
        },
      },
    });
    // 检验VuComponent的不同
    school.a = 99;
    console.log(school === hello); //false
    console.log(school.a); //99
    console.log(hello.a); //没有

  •  this指向:
    • vm:vue的配置项中this指向的都是vm(Vue实例对象)
    • vc:组件中的配置项中this指向的都是vm(VueComponent实例对象)

 8. 重要的内置关系

组件是可复用的Vue实例

  • vc存在的属性配置vm都有

  • 但是vm存在的其中el,组件实例vc就没有

  • 并且组件中的data必须使用函数方式(return返回数据)

区分显示原型对象和隐式原型对象 

 // 定义构造函数
    function demo() {
      this.a = 1;
      this.b = 2;
    }
    const d = new demo();
    // 以下构造函数原型对象和实例对象原型对象最后都指向一个原型对象
    console.log(demo.prototype); //显示原型属性(一般放东西)
    console.log(d.__proto__); //隐式原型对象(一般开始找)
    console.log(demo.prototype === d.__proto__);//true
  //程序员通过显示原型属性操作原型对象,追加一个x属性,值为99
    demo.prototype.x = 99;

 

Vue.Component.prototype.__proto__===Vue.prototype 

Vue.Component原型对象的原型对象执行Vue原型对象

让组件实例对象那个vc可以访问到Vue原型上的属性、方法

 9. 单文件组件方式:.vue后缀

vue文件需要(处理加工变成js文件)两种处理方式

  • webpack:插件搭建工作流

  • vue脚手架

vue文件命名

 

 安装插件可以生成vue模板:<v  自动生成模板

 

<template>
  
</template>

<script>
export default {
//注意组件模块化引入,所以需要把js暴露

}
</script>

<style>

</style>

此处需要使用暴露方式把文件暴露出去:也就是允许其他文件引入

  • export :直接分别暴露:直接使用并取消组件的创建方法直接暴露options

  •  esprot {name}  :统一暴露

  •  默认暴露

 

(1) 创建两个组件:School组件、Student组件(这个类似)

<template>
  <div class="demo">
    <h2>学校名称:{{ schoolName }}</h2>
    <h2>学校地址:{{ address }}</h2>
    <button @click="showName">点我提示学校名</button>
  </div>
</template>

<script>
export default {
  name: "School",
  data() {
    return {
      schoolName: "清华",
      address: "北京",
    };
  },
  methods: {
    showName() {
      alert(this.schoolName);
      console.log(this); //指向当前组件
    },
  },
};
</script>

<style>
.demo {
  background-color: pink;
}
</style>

(2)引入组件文件并在app组件中嵌套注册:注意模板需要div包裹

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

<script>
// 先引入组件
import School from './School.vue'
import Student from './Student.vue'
// 再进行对外暴露并注册组件
export default {
  name: 'App',
  components: {
    School,
    Student
  }
}
</script>

<style>
</style>

(3) 组件分配完毕之后需要由vm统一管理

创建:main.js

  • 直接引入app组件

  • 绑定模板并注册app组件:注意在main模块中配置template配置项可以取消在html也买那种使用app标签进行组件实例

import App from './App.vue'
// 浏览器不支持模块化语法

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

(4)需要容器:index.html与vue实例进行关联

  • 先创建模板

  • 引入vue文件

  • 引入main文件

  <div id="root"></div>
    <script src="../vue/vue.js"></script>
    <!-- 入口文件 -->
    <script src="./main.js"></script>

浏览器不能能直接支持ed6模块化语法:也就是引入模块化(需要配置脚手架环境进行运行)

 

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

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

相关文章

【Fluent】Error: Model information is incompatible with incoming mesh.

一、问题背景 在原有workbench数据文件上&#xff0c;修改几何数据&#xff0c;然后重新划分网格&#xff0c;在更新网格后&#xff0c;workbench就弹出错误Error&#xff01; Model information is incompatible with incoming mesh. 因为当时并不影响我打开fluent求解器&am…

C语言数组介绍和用法

文章目录 前言一、数组的定义二、数组的大小三、数组的访问方法四、使用for循环遍历数组五、数组地址的访问方法六、二维数组七、二维数组的遍历总结 前言 本篇文章将带大家学习C语言中的数组&#xff0c;数组在C语言中是一个比较重要的点&#xff0c;大家需要好好理解并多加使…

Linux Shell 介绍及常用命令汇总

文章目录 Part.I shell 简介Chap.I 概念汇编Chap.II 命令概览 Part.II shell 常用命令大全Chap.I 关于文件和目录Chap.II 关于磁盘和内存Chap.III 关于进程调度 Reference Part.I shell 简介 Chap.I 概念汇编 下面是一些概念 shell 与 bash 的区别与联系&#xff1a;bash 是 b…

2023五一杯B题:快递需求分析问题

题目 网络购物作为一种重要的消费方式&#xff0c;带动着快递服务需求飞速增长&#xff0c;为我国经济发展做出了重要贡献。准确地预测快递运输需求数量对于快递公司布局仓库站点、节约存储成本、规划运输线路等具有重要的意义。附件1、附件2、附件3为国内某快递公司记录的部分…

从力的角度再次比较9-2分布和8-3分布

( A, B )---1*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有1个节点&#xff0c;AB各由11张二值化的图片组成&#xff0c;让A中有3个0&#xff0c;8个1.B中全是0&#xff0c;排列组合A的所有可能&#xff0c;统计迭代次数的顺序。在前面实验中得到了8-3分布的数据 A-B 迭代次数 …

孔乙己文学,满街长衫,为谁而穿?解构孔乙己文学

鲁迅先生创作《孔乙己》的背景是20世纪初期的中国社会。那时&#xff0c;中国正处于民国的初期&#xff0c;社会动荡不安&#xff0c;人民生活贫困。在这个背景下&#xff0c;鲁迅开始写作并发表了一系列揭露社会黑暗面的作品。《孔乙己》是其中之一&#xff0c;它讲述了一个被…

利用snpEff对基因型VCF文件进行变异注释的详细方法

利用snpEff对VCF文件进行变异注释 群体遗传研究中&#xff0c;在获得SNP位点后,我们需要对SNP位点进行注释&#xff0c;对这些SNP位点进行更深的了解。 snpEff是一个用于对基因组单核苷酸多态性(SNP)进行注释的软件&#xff0c;snpEff软件可以用于对VCF文件进行变异注释&#x…

VC++ | VS2017编译报错-20230428

VC | VS2017编译报错-20230428 文章目录 VC | VS2017编译报错-202304281.报错1-1.解决办法 2.报错2-1.解决办法2-1-1.做如下设置2-1-2.代码调整 1.报错 1>------ 已启动生成: 项目: NvtUSBTool, 配置: Debug Win32 ------ 1>NvtUSBTool.cpp 1>$(PRJ_ROOT_DIR)nvtusbt…

Linux文件系统权限

目录标题 文件权限文件和目录的一般权限文件的权限针对三类对象进行定义文件和目录中&#xff0c;r、w、x的作用 设置文件和目录的一般权限修改文件或目录的权限—chmod(change mode)命令权限值的表示方法—使用3位八进制数表示权限值的表示方法—使用字符串表示修改文件或目录…

视频转gif如何做?三步教你视频转gif制作

如何将视频做成gif表情包呢&#xff1f;想要把视频中的精彩画面截取出来做成gif动画表情&#xff0c;却又不想下载软件的时候&#xff0c;该怎么办呢&#xff1f;有没有简单实用的工具呢&#xff1f; 一、什么工具能够截取视频做gif呢&#xff1f; GIF中文网作为一款专业的在…

react之按钮鉴权

使用HOC来完成 HOC&#xff1a;高阶组件&#xff0c;是React中复用组件逻辑的一种高级技巧。HOC自身不是React API的一部分&#xff0c;他是一种基于React的组合特性而形成的设计模式。 作用&#xff1a;用于复用组件的业务逻辑 VUE mixinReact Hoc 用户数据渲染带操作按钮渲…

C#手术麻醉临床信息系统源码,实现体征数据自动采集绘制

手麻系统源码&#xff0c;自动生成电子单据 基于C# 前端框架&#xff1a;Winform后端框架&#xff1a;WCF 数据库&#xff1a;sqlserver 开发的手术麻醉临床信息系统源码&#xff0c;应用于医院手术室、麻醉科室的计算机软件系统。该系统针对整个围术期&#xff0c;对病人进…

本地安装kibana kibana设置中文汉化

一、Kibana简介 Kibana是一个开源的基于浏览器的分析和可视化平台&#xff0c;可以用于搜索&#xff0c;查看&#xff0c;删除Elasticsearch索引并与存储在Elasticsearch索引中的数据进行交互。可以执行高级数据分析&#xff0c;并且以各种图标、表格和地图的形式可视化数据。…

【hello Linux】进程信号

目录 1. 进程信号的引出及整体概况 2. 信号的产生 1. 键盘产生 2. 进程异常 3. 系统调用 4. 软件条件 3. 信号的保存 1. 信号相关的常见概念 2. sigset_t 3. 信号集操作函数 4. sigprocmask&#xff1a;对block位图的操作 5. sigpending&#xff1a;对pending位图的操作 6. 捕捉…

三分钟看懂Python分支循环规范:if elif for while

人生苦短&#xff0c;我用python 分支与循环 条件是分支与循环中最为核心的点&#xff0c; 解决的问题场景是不同的问题有不同的处理逻辑。 当满足单个或者多个条件或者不满足条件进入分支和循环&#xff0c; 这里也就说明这个对相同问题处理执行逻辑依据具体参数动态变化&…

智慧医疗服务平台有哪些优势?

对于引用了智慧医疗服务平台的机构来说&#xff0c;其优势体现在哪些方面呢&#xff1f; 一、提高医疗资源利用效率。 在传统的医疗模式中&#xff0c;医生需要耗费大量的时间和精力去处理病人的病历、诊断、治疗等问题。而在智慧医疗服务平台的支持下&#xff0…

稳定排序和不稳定排序

稳定排序和不稳定排序 稳定排序 插入排序、冒泡排序、归并排序、基数排序 其时间复杂度 直接插入排序 最好情况:初始有序,为O(n); 最坏情况:初始逆序,为O(n) 平均时间复杂度T(n) O(n) 折半插入排序 时间复杂度为O(n) 冒泡排序 最好时&#xff0c;基本有序&#xff0c;…

Python 科研绘图可视化(后处理)Matplotlib - 2D彩图

Introduction 科研可视化是将数据和信息转化为可视化形式的过程&#xff0c;旨在通过图形化展示数据和信息&#xff0c;使得科研工作者能够更好地理解和分析数据&#xff0c;并从中发现新的知识和洞见。科研可视化可以应用于各种领域&#xff0c;如生物学、物理学、计算机科学…

制造策略 ETO、MTO、ATO、MTS

ETO 按交货周期跨度从长到短来讲&#xff0c;首先就是 ETO&#xff0c;Engineer To Order – 面向订单设计、定制生产或特殊生产。 就是客户给的订单&#xff0c;你要生产的话&#xff0c;你之前的原产品改动很大&#xff0c;或者基本上用不上&#xff0c;要完全按照客户的要求…

虚机制

一、虚机制的引入 利用动态编联实现——虚函数来解决上述问题 二、虚函数 必须是实例方法&#xff0c;不能是类方法。 若基类中析构函数为虚函数&#xff0c;则派生类中的析构函数不论写不写virtual关键字都是虚函数。派生类中新的虚函数应尽量避免与基类中的虚函数重名。 三、…