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

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

非单文件组件

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>


目录
相关文章
|
2月前
|
前端开发 JavaScript Java
前端限制打包文件数量
前端限制打包文件数量
175 65
|
2月前
|
前端开发
前端引入字体文件
文章介绍了如何在前端项目中引入字体文件,并展示了具体的HTML和CSS代码示例,包括如何使用`@font-face`规则来定义字体和在页面中应用自定义字体。
58 1
前端引入字体文件
|
18天前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
33 0
|
3月前
|
JavaScript 前端开发 开发者
哇塞!Vue.js 与 Web Components 携手,掀起前端组件复用风暴,震撼你的开发世界!
【8月更文挑战第30天】这段内容介绍了Vue.js和Web Components在前端开发中的优势及二者结合的可能性。Vue.js提供高效简洁的组件化开发,单个组件包含模板、脚本和样式,方便构建复杂用户界面。Web Components作为新兴技术标准,利用自定义元素、Shadow DOM等技术创建封装性强的自定义HTML元素,实现跨框架复用。结合二者,不仅增强了Web Components的逻辑和交互功能,还实现了Vue.js组件在不同框架中的复用,提高了开发效率和可维护性。未来前端开发中,这种结合将大有可为。
145 0
|
7天前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
13 1
|
10天前
|
缓存 前端开发 JavaScript
前端serverless探索之组件单独部署时,利用rxjs实现业务状态与vue-react-angular等框架的响应式状态映射
本文深入探讨了如何将RxJS与Vue、React、Angular三大前端框架进行集成,通过抽象出辅助方法`useRx`和`pushPipe`,实现跨框架的状态管理。具体介绍了各框架的响应式机制,展示了如何将RxJS的Observable对象转化为框架的响应式数据,并通过示例代码演示了使用方法。此外,还讨论了全局状态源与WebComponent的部署优化,以及一些实践中的改进点。这些方法不仅简化了异步编程,还提升了代码的可读性和可维护性。
|
18天前
|
前端开发 JavaScript
CSS样式穿透技巧:利用scoped与deep实现前端组件样式隔离与穿透
CSS样式穿透技巧:利用scoped与deep实现前端组件样式隔离与穿透
106 1
|
21天前
|
前端开发 JavaScript 开发者
Web组件:一种新的前端开发范式
【10月更文挑战第9天】Web组件:一种新的前端开发范式
25 2
|
2月前
|
前端开发 JavaScript API
前端JS读取文件内容并展示到页面上
前端JavaScript使用FileReader API读取文件内容,支持文本类型文件。在文件读取成功后,可以通过onload事件处理函数获取文件内容,然后展示到页面上。
61 2
前端JS读取文件内容并展示到页面上
|
22天前
|
JavaScript 前端开发 Java
VUE学习四:前端模块化,ES6和ES5如何实现模块化
这篇文章介绍了前端模块化的概念,以及如何在ES6和ES5中实现模块化,包括ES6模块化的基本用法、默认导出与混合导出、重命名export和import,以及ES6之前如何通过函数闭包和CommonJS规范实现模块化。
60 0
VUE学习四:前端模块化,ES6和ES5如何实现模块化