Vue 组件化开发——组件详解

简介: 将一个复杂的问题拆分成很多个可以处理的小问题,再将其放入整体当中,很大的问题也会迎刃而解。

Vue 组件化开发——组件详解


什么是组件化?


  1. 将一个复杂的问题拆分成很多个可以处理的小问题,再将其放入整体当中,很大的问题也会迎刃而解。


  1. 组件是构成页面中独立结构单元,主要以页面结构的形式存在。


  1. 不同组件也具有基本交互功能,根据业务逻辑实现复杂的项目功能。


  1. 组件化也是类似的思想:
  • 如果将一个页面中的所有的处理逻辑全部放在一起,处理起来就会变得非常复杂,而且不利于后续的管理以及扩展。
  • 但是如果将一个页面拆分成一个个小的功能块,每个功能块完成属于自己这部分独立的功能,那之后的整个页面的管理和维护就变得非常容易。


  1. 组件可以实现复杂的页面结构,提高代码的可复用性。


Vue 组件化思想


  1. 组件化是 Vuejs 中的重要思想。


  • 它提供了一种抽象,让我们可以开发出一个个独立可复用的小组件来构造我们的应用。
  • 任何的应用都可以被抽象成一颗组件树。

1.png

  1. 组件化思想的应用:


  • 有了组件化的思想,我们在之后的开发中就要充分利用它。
  • 尽可能将页面拆分成一个个小的、可复用的组件。
  • 这样让我们的代码更加方便组织和管理,并且扩展性也更强。


注册组件的基本步骤


  1. 组件的使用分为三个步骤:
  • 创建组件构造器。
  • 注册组件。
  • 使用组件。


  1. 注册组件的步骤:
  • 调用 Vue.extend() 方法创建组件构造器
  • 调用 Vue.component() 方法注册组件
  • 在 Vue 实例中的作用范围内使用组件
<div id="app">
    <!-- 3. 使用组件 -->
    <my-cpn></my-cpn>
</div>
<script src="../js/vue.js"></script>
<script>
  // 1. 创建组件构造器
    const myComponent = Vue.extend({
        template: `
      <div>
          <h2>组件标题</h2>
        <p>我是组件中的一个段落内容</p>
        </div>
    `
    })
    // 2. 注册组件,并且定义组件标签的名称
    Vue.component('my-cpn',myComponent)
    let app = new Vue({
        el: 'app'
    })
</script>
  1. 查看运行结果:


  • 和直接使用一个 div 看起来并没有什么区别。
  • 但是我们可以设想,如果很多地方都要显示这样的信息,我们是不是就可以直接使用<my-cpn></my-cpn>来完成呢?


注册组件步骤解析


  1. Vue.extend() :
  • 调用 Vue.exted() 创建的是一个组件构造器。
  • 通常在创建组件构造器时,传入 template 代表自定义组件的模板。
  • 该模板就是在使用到组件的地方,要显示的 HTML 代码。
  • 事实上,这种写法在 Vue2.x 的文档中几乎已经看不到了,会直接使用语法糖,但是很多资料话是会提到,而且这种方式也是后面的基础。


  1. Vue.component() :
  • 调用 Vue.component() 是将刚才注册的组件构造器注册为一个组件,并且给他起一个组件的标签名称。
  • 所以需要传递两个参数:
  • 注册组件的标签名。
  • 组件构造器。


  1. 组件必须挂载在某个 Vue 实例下,否则它不会生效。
  • 下面使用三次,第三次不会生效。
<div id="app">
  <!-- 3.使用组件 -->
    <my-cpn></my-cpn>
    <div>
      <my-cpn></my-cpn>
    </div>
</div>
<!-- 这个并不会渲染出来,因为它没有在new Vue挂载的实例 #app 之下 -->
<my-cpn></my-cpn>


全局组件和局部组件


全局组件


  1. 当通过调用 Vue.component() 注册组件时,组件的注册是全局的。
  • 这就意味着该组件可以在任意 Vue 实例下使用。
<div id="app1">
  <my-cpn></my-cpn>
</div>
<div id="app2">
  <my-cpn></my-cpn>
</div>
<script>
// 创建组件构造器
const myComponent = Vue.extend({
  template: `
  <div>
    <h2>组件标题</h2>
    <p>组件正文的内容</p>
  </div>
  `
})
// 注册组件
Vue.component('my-cpn', myComponent)
const app1 = new Vue({
  el: '#app1',
})
const app2 = new Vue({
  el: '#app2',
})
</script>


局部组件


  1. 如果注册的组件是挂载在某个实例中,那么就是一个局部组件


  • 通过 Vue 实例的 components 属性在实例中注册组件。


  • 在下面这个例子中,app2 中的组件并没有渲染出来,而且会报错。
<div id="app1">
  <my-cpn></my-cpn>
</div>
<div id="app2">
  <my-cpn></my-cpn>
</div>
<script>
// 创建组件构造器
const myComponent = Vue.extend({
  template: `
  <div>
    <h2>组件标题</h2>
    <p>组件正文的内容</p>
  </div>
  `
})
const app1 = new Vue({
  el: '#app1',
  // 在实例内部注册组件
  components: {
    'my-cpn': myComponent
    // 另外一种写法:myCpn: myComponent,这种写法效果和上面的相同。
    // 如果在注册组件的时候使用了驼峰命名,那么在使用的时候需要转换成短横线分隔命名。 
  }
})
const app2 = new Vue({
  el: '#app2',
  // components: {
  //   'my-cpn': myComponent
  // }
})


父组件和子组件


  1. 在前面见到了组件树:


  • 组件和组件之间存在层级关系。


  • 而其中最重要的关系就是父子组件的关系。


2.父子组件关系的代码组成:

<div id="app">
   <parent-cpn></parent-cpn>
 </div>
 <script>
   // 创建一个子组件构造器
   const childComponent = Vue.extend({
     template: `
     <div>
       <p>我是子组件的内容</p>
     </div>
     `
   })
   // 创建一个父组件构造器
   const parentComponent = Vue.extend({
     template: `
       <div>
         我是父组件的内容
         <h2>我是父组件的一个标题</h2>
         <child-cpn></child-cpn>
       </div>
       `,
     components: {
       // 在父组件中注册子组件
       'child-cpn': childComponent
     }
   })
   const app = new Vue({
     el: '#app',
     // 在实例中注册父组件
     components: {
       'parent-cpn': parentComponent
     }
   })
  1. 父子组件错误用法:


  • 当子组件注册到父组件的 components 时,Vue 会编译好父组件的模块。
  • 该模板的内容已经决定了父组件将要渲染的 HTML (相当于父组件中已经有了子组件中的内容了。)
  • 是只能在父组件中被识别的。
  • 类似这种用法,是会被浏览器忽略的。


注册组件语法糖


  1. 在上面注册组件的方式会有些繁琐。
  • 为了简化这个过程,提供了注册的语法糖。
  • 主要是省去了调用Vue.extend()的步骤,而是可以直接使用一个对象来代替。


全局组件注册语法糖

Vue.component('my-cpn',{
  template: `
    <div>
      <h2>组件标题</h2>
      <p>组件正文的内容</p>
    </div>
  `
})


局部组件注册语法糖

// 注册局部组件
let app = new Vue({
  el: 'app',
  components: {
    'my-cpn': {
      template: `
        <div>
          <h2>组件标题</h2>
          <p>组件正文的内容</p>
        </div>
      `
  }
})


模板的分离写法


  1. 除了 Vue 组件的注册过程比较复杂,还有 template 模板的写法也比较麻烦。


  1. 如果将其中的 HTML 分离出来,然后挂载到对应的组件上,必然结构会变得清晰。


  1. Vue 提供了两种方案来定义 HTML 模块内容。


  • 使用标签。
<div id="app">
  <my-cpn></my-cpn>
</div>
<script type="text/x-template" id="myCpn">
  <div>
    <h2>组件标题</h2>
    <p>组件内容</p>
  </div>
</script>
<script>
  const app = new Vue({
    el: '#app',
    // 注册组件
    components:{
      myCpn:{
        template:'#myCpn'
      }
    }
  })
</script>

使用标签。

<div id="app">
  <my-cpn></my-cpn>
</div>
<template id="myCpn">
  <div>
    <h2>组件标题</h2>
    <p>组件内容</p>
  </div>
</template>
<script>
  const app = new Vue({
    el: '#app',
    // 注册组件
    components: {
      myCpn: {
        template: '#myCpn'
      }
    }
  })
</script>


组件可以访问 Vue 实例数据吗?


  1. 组件是一个单独功能模块的封装。


  • 这个模板有属于自己的 HTML 模板,也应该有自己的数据 data。


2.组件不能访问 Vue 实例中的数据,而且即使可以访问,如果把所有的数据都放在 Vue 实例中,Vue 实例就会变得非常臃肿。


  1. 结论:Vue 组件应该有自己保存数据的地方。


组件数据的存放


  1. 组件对象也有一个 data 属性(也可以有 methods 等属性)。
  2. 只是这个 data 必须是一个函数。
  3. 而且这个函数返回一个对象,对象内部保存着数据。


组件的 data 为什么必须是一个函数?


  • 因为函数在每一次调用的时候都会形成一个新的对象,这样就不会对同时使用多次组件的数据产生影响。
相关文章
|
3月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
509 0
|
3月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
3月前
|
JavaScript 前端开发 UED
Vue 表情包输入组件实现代码及详细开发流程解析
这是一篇关于 Vue 表情包输入组件的使用方法与封装指南的文章。通过安装依赖、全局注册和局部使用,可以快速集成表情包功能到 Vue 项目中。文章还详细介绍了组件的封装实现、高级配置(如自定义表情列表、主题定制、动画效果和懒加载)以及完整集成示例。开发者可根据需求扩展功能,例如 GIF 搜索或自定义表情上传,提升用户体验。资源链接提供进一步学习材料。
189 1
|
3月前
|
JavaScript 前端开发 UED
Vue 项目中如何自定义实用的进度条组件
本文介绍了如何使用Vue.js创建一个灵活多样的自定义进度条组件。该组件可接受进度段数据数组作为输入,动态渲染进度段,支持动画效果和内容展示。当进度超出总长时,超出部分将以红色填充。文章详细描述了组件的设计目标、实现步骤(包括props定义、宽度计算、模板渲染、动画处理及超出部分的显示),并提供了使用示例。通过此组件,开发者可根据项目需求灵活展示进度情况,优化用户体验。资源地址:[https://pan.quark.cn/s/35324205c62b](https://pan.quark.cn/s/35324205c62b)。
121 0
|
5月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
711 4
|
4月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
518 77
|
5月前
|
缓存 JavaScript 前端开发
Vue 基础语法介绍
Vue 基础语法介绍
|
3月前
|
JavaScript 前端开发 开发者
Vue 自定义进度条组件封装及使用方法详解
这是一篇关于自定义进度条组件的使用指南和开发文档。文章详细介绍了如何在Vue项目中引入、注册并使用该组件,包括基础与高级示例。组件支持分段配置(如颜色、文本)、动画效果及超出进度提示等功能。同时提供了完整的代码实现,支持全局注册,并提出了优化建议,如主题支持、响应式设计等,帮助开发者更灵活地集成和定制进度条组件。资源链接已提供,适合前端开发者参考学习。
354 17
|
3月前
|
JavaScript 前端开发 UED
Vue 手风琴实现的三种常用方式及长尾关键词解析
手风琴效果是Vue开发中常见的交互组件,可节省页面空间、提升用户体验。本文介绍三种实现方式:1) 原生Vue结合数据绑定与CSS动画;2) 使用Element UI等组件库快速构建;3) 自定义指令操作DOM实现独特效果。每种方式适用于不同场景,可根据项目需求选择。示例包括产品特性页、后台菜单及FAQ展示,灵活满足多样需求。附代码示例与资源链接,助你高效实现手风琴功能。
156 10