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 为什么必须是一个函数?


  • 因为函数在每一次调用的时候都会形成一个新的对象,这样就不会对同时使用多次组件的数据产生影响。
相关文章
|
28天前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
4天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
28天前
|
JavaScript 前端开发 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
JavaScript 前端开发
简述下Vue组件化封装过程?
概念 组件系统是 Vue 的另一个重要概念,因为它是一种抽象,允许我们使用小型、独立和通常可复用的组件构建大型应用。仔细想想,几乎任意类型的应用界面都可以抽象为一个组件树: !!! 熟记 : 页面中可复用的结构、样式和功能,抽离成一个文件; 特点: 为了便于 组织和管理代码 , 便于维护和扩展维护 组件化和模块化的不同: 模块化:是从代码逻辑的角度进行划分的;方便代码分层开发,保证每个功能模块的职能单一 组件化:是从UI界面的角度进行划分的前端的组件化方便组件的重用; 全局组件 这些组件是全局注册的。
|
1月前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。
|
1月前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
36 1
vue学习第一章
|
1月前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
27 1
vue学习第三章
|
1月前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
35 1
vue学习第四章
|
1月前
|
JavaScript 前端开发 算法
vue学习第7章(循环)
欢迎来到瑞雨溪的博客,一名热爱JavaScript和Vue的大一学生。本文介绍了Vue中的v-for指令,包括遍历数组和对象、使用key以及数组的响应式方法等内容,并附有综合练习实例。关注我,将持续更新更多优质文章!🎉🎉🎉
24 1
vue学习第7章(循环)
|
1月前
|
JavaScript 前端开发
vue学习第九章(v-model)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生,自学前端2年半,正向全栈进发。此篇介绍v-model在不同表单元素中的应用及修饰符的使用,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
29 1
vue学习第九章(v-model)