[前端学习]文件组件专题

简介: [前端学习]文件组件专题

非单文件组件

1.基本使用

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

一、定义组件(创建组件)

二、注册组件

三、使用组件(写组件标签)

一、如何定义一个组件?

使用Vue.extend(options)创建,其中options和new Vue(options)时传入的那个options几乎一样,但也有点区别;

区别如下:

1.el不要写,为什么? ——— 最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器。

2.data必须写成函数,为什么? ———— 避免组件被复用时,数据存在引用关系。

备注:使用template可以配置组件结构。

二、如何注册组件?

1.局部注册:靠new Vue的时候传入components选项

2.全局注册:靠Vue.component(‘组件名’,组件)

三、编写组件标签:

<school></school>

代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>基本使用</title>
    <script type="text/javascript" src="../js/vue.js"></script>
  </head>
  <body>
    <!-- 准备好一个容器-->
    <div id="root">
      <hello></hello>
      <hr>
      <h1>{{msg}}</h1>
      <hr>
      <!-- 第三步:编写组件标签 -->
      <school></school>
      <hr>
      <!-- 第三步:编写组件标签 -->
      <student></student>
    </div>
    <div id="root2">
      <hello></hello>
    </div>
  </body>
  <script type="text/javascript">
    Vue.config.productionTip = false
    //第一步:创建school组件
    const school = Vue.extend({
      template:`
        <div class="demo">
          <h2>学校名称:{{schoolName}}</h2>
          <h2>学校地址:{{address}}</h2>
          <button @click="showName">点我提示学校名</button>  
        </div>
      `,
      // el:'#root', //组件定义时,一定不要写el配置项,因为最终所有的组件都要被一个vm管理,由vm决定服务于哪个容器。
      data(){
        return {
          schoolName:'尚硅谷',
          address:'北京昌平'
        }
      },
      methods: {
        showName(){
          alert(this.schoolName)
        }
      },
    })
    //第一步:创建student组件
    const student = Vue.extend({
      template:`
        <div>
          <h2>学生姓名:{{studentName}}</h2>
          <h2>学生年龄:{{age}}</h2>
        </div>
      `,
      data(){
        return {
          studentName:'张三',
          age:18
        }
      }
    })
    //第一步:创建hello组件
    const hello = Vue.extend({
      template:`
        <div> 
          <h2>你好啊!{{name}}</h2>
        </div>
      `,
      data(){
        return {
          name:'Tom'
        }
      }
    })
    //第二步:全局注册组件
    Vue.component('hello',hello)
    //创建vm
    new Vue({
      el:'#root',
      data:{
        msg:'你好啊!'
      },
      //第二步:注册组件(局部注册)
      components:{
        school,
        student
      }
    })
    new Vue({
      el:'#root2',
    })
  </script>
</html>

2.几个注意点

几个注意点:

1.关于组件名:

一个单词组成:

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

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

多个单词组成:

第一种写法(kebab-case命名):my-school

第二种写法(CamelCase命名):MySchool (需要Vue脚手架支持)

备注:

(1).组件名尽可能回避HTML中已有的元素名称,例如:h2、H2都不行。

(2).可以使用name配置项指定组件在开发者工具中呈现的名字。

2.关于组件标签:
              第一种写法:<school></school>
              第二种写法:<school/>
              备注:不用使用脚手架时,<school/>会导致后续组件不能渲染。
3.一个简写方式:
              const school = Vue.extend(options) 可简写为:const school = options
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>几个注意点</title>
    <script type="text/javascript" src="../js/vue.js"></script>
  </head>
  <body>
    <!-- 
      几个注意点:
          1.关于组件名:
                一个单词组成:
                      第一种写法(首字母小写):school
                      第二种写法(首字母大写):School
                多个单词组成:
                      第一种写法(kebab-case命名):my-school
                      第二种写法(CamelCase命名):MySchool (需要Vue脚手架支持)
                备注:
                    (1).组件名尽可能回避HTML中已有的元素名称,例如:h2、H2都不行。
                    (2).可以使用name配置项指定组件在开发者工具中呈现的名字。
          2.关于组件标签:
                第一种写法:<school></school>
                第二种写法:<school/>
                备注:不用使用脚手架时,<school/>会导致后续组件不能渲染。
          3.一个简写方式:
                const school = Vue.extend(options) 可简写为:const school = options
    -->
    <!-- 准备好一个容器-->
    <div id="root">
      <h1>{{msg}}</h1>
      <school></school>
    </div>
  </body>
  <script type="text/javascript">
    Vue.config.productionTip = false
    //定义组件
    const s = Vue.extend({
      name:'atguigu',
      template:`
        <div>
          <h2>学校名称:{{name}}</h2>  
          <h2>学校地址:{{address}}</h2> 
        </div>
      `,
      data(){
        return {
          name:'尚硅谷',
          address:'北京'
        }
      }
    })
    new Vue({
      el:'#root',
      data:{
        msg:'欢迎学习Vue!'
      },
      components:{
        school:s
      }
    })
  </script>
</html>

3.组件的嵌套

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>组件的嵌套</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
  </head>
  <body>
    <!-- 准备好一个容器-->
    <div id="root">
    </div>
  </body>
  <script type="text/javascript">
    Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
    //定义student组件
    const student = Vue.extend({
      name:'student',
      template:`
        <div>
          <h2>学生姓名:{{name}}</h2>  
          <h2>学生年龄:{{age}}</h2> 
        </div>
      `,
      data(){
        return {
          name:'尚硅谷',
          age:18
        }
      }
    })
    //定义school组件
    const school = Vue.extend({
      name:'school',
      template:`
        <div>
          <h2>学校名称:{{name}}</h2>  
          <h2>学校地址:{{address}}</h2> 
          <student></student>
        </div>
      `,
      data(){
        return {
          name:'尚硅谷',
          address:'北京'
        }
      },
      //注册组件(局部)
      components:{
        student
      }
    })
    //定义hello组件
    const hello = Vue.extend({
      template:`<h1>{{msg}}</h1>`,
      data(){
        return {
          msg:'欢迎来到尚硅谷学习!'
        }
      }
    })
    //定义app组件
    const app = Vue.extend({
      template:`
        <div> 
          <hello></hello>
          <school></school>
        </div>
      `,
      components:{
        school,
        hello
      }
    })
    //创建vm
    new Vue({
      template:'<app></app>',
      el:'#root',
      //注册组件(局部)
      components:{app}
    })
  </script>
</html>

4.VueComponent

关于VueComponent:

1.school组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的。

2.我们只需要写<school/>或<school></school>,Vue解析时会帮我们创建school组件的实例对象,
            即Vue帮我们执行的:new VueComponent(options)。
          3.特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent!!!!
          4.关于this指向:
              (1).组件配置中:
                    data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【VueComponent实例对象】。
              (2).new Vue(options)配置中:
                    data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【Vue实例对象】。
          5.VueComponent的实例对象,以后简称vc(也可称之为:组件实例对象)。
            Vue的实例对象,以后简称vm。
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>VueComponent</title>
    <script type="text/javascript" src="../js/vue.js"></script>
  </head>
  <body>
    <!-- 
      关于VueComponent:
            1.school组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的。
            2.我们只需要写<school/>或<school></school>,Vue解析时会帮我们创建school组件的实例对象,
              即Vue帮我们执行的:new VueComponent(options)。
            3.特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent!!!!
            4.关于this指向:
                (1).组件配置中:
                      data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【VueComponent实例对象】。
                (2).new Vue(options)配置中:
                      data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【Vue实例对象】。
            5.VueComponent的实例对象,以后简称vc(也可称之为:组件实例对象)。
              Vue的实例对象,以后简称vm。
    -->
    <!-- 准备好一个容器-->
    <div id="root">
      <school></school>
      <hello></hello>
    </div>
  </body>
  <script type="text/javascript">
    Vue.config.productionTip = false
    //定义school组件
    const school = Vue.extend({
      name:'school',
      template:`
        <div>
          <h2>学校名称:{{name}}</h2>  
          <h2>学校地址:{{address}}</h2> 
          <button @click="showName">点我提示学校名</button>
        </div>
      `,
      data(){
        return {
          name:'尚硅谷',
          address:'北京'
        }
      },
      methods: {
        showName(){
          console.log('showName',this)
        }
      },
    })
    const test = Vue.extend({
      template:`<span>atguigu</span>`
    })
    //定义hello组件
    const hello = Vue.extend({
      template:`
        <div>
          <h2>{{msg}}</h2>
          <test></test> 
        </div>
      `,
      data(){
        return {
          msg:'你好啊!'
        }
      },
      components:{test}
    })
    // console.log('@',school)
    // console.log('#',hello)
    //创建vm
    const vm = new Vue({
      el:'#root',
      components:{school,hello}
    })
  </script>
</html>

5.一个重要的内置关系

1.一个重要的内置关系:VueComponent.prototype.proto === Vue.prototype

2.为什么要有这个关系:让组件实例对象(vc)可以访问到 Vue原型上的属性、方法。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>一个重要的内置关系</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
  </head>
  <body>
    <!-- 
        1.一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype
        2.为什么要有这个关系:让组件实例对象(vc)可以访问到 Vue原型上的属性、方法。
    -->
    <!-- 准备好一个容器-->
    <div id="root">
      <school></school>
    </div>
  </body>
  <script type="text/javascript">
    Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
    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
    const vm = new Vue({
      el:'#root',
      data:{
        msg:'你好'
      },
      components:{school}
    })
    //定义一个构造函数
    /* function Demo(){
      this.a = 1
      this.b = 2
    }
    //创建一个Demo的实例对象
    const d = new Demo()
    console.log(Demo.prototype) //显示原型属性
    console.log(d.__proto__) //隐式原型属性
    console.log(Demo.prototype === d.__proto__)
    //程序员通过显示原型属性操作原型对象,追加一个x属性,值为99
    Demo.prototype.x = 99
    console.log('@',d) */
  </script>
</html>


目录
相关文章
|
1月前
|
前端开发
前端通过input标签封装Upload组件实现文件上传
前端通过input标签封装Upload组件实现文件上传
53 0
|
1月前
|
前端开发 UED
前端解析Excel文件
前端解析Excel文件
34 0
|
2月前
|
前端开发 JavaScript 开发者
从零开始学习前端开发
前端开发是目前互联网行业中最为热门的职业之一。本文将介绍从零开始学习前端开发所需的基础知识和技能,包括HTML、CSS、JavaScript等方面的内容,并提供了一些实践性的建议和学习资源,帮助初学者快速入门。
89 1
|
3月前
|
前端开发 JavaScript
从零开始学习前端开发
前端开发是当前最热门的技术之一。本文将从零开始,详细介绍前端开发的基础知识和实践技巧,为初学者提供全面的学习指南。
30 0
|
3月前
|
设计模式 前端开发 算法
No210.精选前端面试题,享受每天的挑战和学习
No210.精选前端面试题,享受每天的挑战和学习
No210.精选前端面试题,享受每天的挑战和学习
|
2月前
|
前端开发 数据可视化 JavaScript
前端图形学实战: 从零开发一款轻量级滑动验证码组件(vue3 + vite版)
前端图形学实战: 从零开发一款轻量级滑动验证码组件(vue3 + vite版)
88 0
|
2月前
|
存储 开发框架 前端开发
从零开始学习前端开发
前端开发是现代互联网应用程序开发中不可或缺的一部分。本文将带您从零开始学习前端开发,包括HTML、CSS和JavaScript等核心技术,以及常见的开发框架和工具。
|
3月前
|
Web App开发 前端开发 JavaScript
从零开始学习前端开发
在当今数字化时代,前端开发人员的需求越来越高。本文将介绍从零开始学习前端开发所需学习的技能和工具,以及如何将这些知识应用到实际项目中。
|
3月前
|
前端开发 JavaScript 开发工具
从零开始学习前端开发技术
随着互联网的快速发展,前端开发成为了一个备受关注的职业。本文将从零开始介绍前端开发所需的基础知识和技能,并重点介绍常用的HTML、CSS和JavaScript语言,帮助初学者快速入门前端开发。
36 0
|
21天前
|
前端开发 JavaScript Java
通过学习mayfly,我学会了前端如何优雅设计字典值
`shigen`是一位擅长多种编程语言的博主,他在探索[mayfly-go](https://juejin.cn/post/7319365035552309248)项目后,发现了对枚举值管理的优雅设计。他分享了如何将字典和枚举值结构化,使用Vue+typescript实现更易维护的代码。通过创建`TagType`和`EnumValue`类,以及提供静态方法,实现了模块化和简洁的字典处理。示例展示了如何在页面中高效引用和显示字典数据,提高了代码的可读性和可维护性。
17 3
通过学习mayfly,我学会了前端如何优雅设计字典值