vue --》组件的封装 及 参数的传递

vue组件的定义

● 组件(Component)是Vue.js最强大的功能之一

● 组件可以扩展HTML元素,封装可重用代码

● 在较高层面上,组件是自定义元素,Vue.js的编译器为他添加特殊功能

● 有些情况下,组件也可以表现用 is 特性进行了扩展的原生的HTML元素

● 所有的Vue组件同时也都是Vue实例,所以可以接受相同的选项对象(除了一些根级特有的选项),并提供相同的生命周期钩子

vue组件的功能

1)能够把页面抽象成多个相对独立的模块

2)实现代码重用,提高开发效率和代码质量,使得代码易于维护

Vue组件封装过程

● 首先,使用Vue.extend()创建一个组件

● 然后,使用Vue.component()方法注册组件

● 接着,如果子组件需要数据,可以在props中接受定义

● 最后,子组件修改好数据之后,想把数据传递给父组件,可以使用emit()方法

组件使用流程详细介绍

1、组件创建---有3中方法,extend()      <template id=‘‘>      <script type=‘text/x-template‘  id=‘‘>

  A、调用Vue.extend(),创建名为myCom的组件,template定义模板的标签,模板的内容需写在该标签下

  var myCom = Vue.extend({
    template: ‘<div>这是我的组件</div>‘
  })
  B、<template id=‘myCom‘>标签创建,需要加上id属性

    <template id="myCom">
      <div>这是template标签构建的组件</div>
    </template>
  C、<script type=‘text/x-template‘ id=‘myCom‘>,需加id属性,同时还得加type="text/x-template",加这个是为了告诉浏览器不执行编译里面的代码

    <script type="text/x-template" id="myCom1">
      <div>这是script标签构建的组件</div>
    </script>
2、注册组件----有2中方法,全局注册,局部注册

  A1、全局注册:一次注册( 调用Vue.component( 组件名称,为组件创建时定义的变量 ) ),可在多个Vue实例中使用。

    我们先用全局注册,注册上面例子中创建的myCom组件

    Vue.component(‘my-com‘,myCom)
  A2、全局注册语法糖:不需要创建直接注册的写法

    Vue.component(‘my-com‘,{
      ‘template‘:‘<div>这是我的组件</div>‘
    })
    ‘my-com‘为给组件自定义的名字,在使用时会用到,后面myCom对应的就是上面构建的组件变量。

  A3、如果是用template及script标签构建的组件,第二个参数就改为它们标签上的id值

    Vue.component(‘my-com‘,{
      template: ‘#myCom‘
    })
  B1、局部注册:只能在注册该组件的实例中使用,一处注册,一处使用

    var app = new Vue({
      el: ‘#app‘,
      components: {
      ‘my-com‘: myCom
     }
    })
  B2、局部注册语法糖:

    var app = new Vue({
      el: ‘#app‘,
      components: {
        ‘my-com‘: {
          template: ‘<div>这是我的组件</div>‘
        }
      }
    })
  B3、<template>及<script>创建的组件,局部注册

     var app = new Vue({
        el: ‘#app‘,
        components: {
          ‘my-com‘: {
            template: ‘#myCom‘
          }
        }
      })
3、调用组件

  只需要在调用组件的地方,写上组件名字的标签即可

    <div>
      /*调用组件*/
      <my-com></my-com>
    </div>
4、例子

A、全局注册:新建一个html文件,引入vue.js,并且定义2个vue实例app1和app2

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue组件</title>
<script src="vue.js"></script>
</head>
<body>
<div id="app1">
<my-com></my-com>
</div>
<div id="app2">
<my-com></my-com>
</div>

<script>
/*创建组件*/
var myCom = Vue.extend({
template: ‘<div>这是我的组件</div>‘
});
/*全局注册组件*/
Vue.component(‘my-com‘,myCom);

/*定义vue实例app1*/
var app1 = new Vue({
el: ‘#app1‘
});

/*定义vue实例app2*/
var app2 = new Vue({
el: ‘#app2‘
});
</script>
</body>
</html>

可以看到,全局注册的组件在实例app1和实例app2中都可以被调用。
B、局部注册:将创建的组件注册到实例app1下

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue组件</title>
<script src="vue.js"></script>
</head>
<body>
<div id="app1">
<my-com></my-com>
</div>
<div id="app2">
<my-com></my-com>
</div>

<script>
var myCom = Vue.extend({
template: ‘<div>这是我的组件</div>‘
});

// Vue.component(‘my-com‘,myCom);
/*局部注册组件*/
var app1 = new Vue({
el: ‘#app1‘,
components:{
‘my-com‘:myCom
}
});

var app2 = new Vue({
el: ‘#app2‘
});
</script>
</body>
</html>

可以看到只渲染了app1实例下的组件,app2实例虽然调用了该组件,但是因为这个组件没有在其内部注册,也没有全局注册,所以报错说找不到该组件。

C、template 和script标签创建组件

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue组件</title>
<script src="vue.js"></script>
</head>
<body>
<div id="app1">
<my-com></my-com>
<my-com1></my-com1>
</div>

<template id="myCom">
<div>这是template标签构建的组件</div>
</template>

<script type="text/x-template" id="myCom1">
<div>这是script标签构建的组件</div>
</script>

<script>
Vue.component(‘my-com1‘,{ //全局注册
template: ‘#myCom1‘
});

var app1 = new Vue({
el: ‘#app1‘,
components:{
‘my-com‘:{
template: ‘#myCom‘ //局部注册
}
}
});
</script>
</body>
</html>

5、异步组件

vue作为一个轻量级前端框架,其核心就是组件化开发。我们一般常用的是用脚手架vue-cli来进行开发和管理,一个个组件即为一个个vue页面,这种叫单文件组件。我们在引用组件之时只需将组件页面引入,再注册即可使用。

当项目比较大型,结构比较复杂时,我们一般选用vue-cli脚手架去构建项目。因为vue-cli集成了webpack环境,使用单文件组件,开发更简单,易上手,尤其是在对组件的处理上。对于原生vue.js,我们就得将组件构建在同一个html的script标签下或者html的外部js中,所有组件集中在一块,不容易管理,这也是原生vue,js的一点不便之处

vue.js可以将异步组件定义为一个工厂函数。

使用$.get获取本地文件会跨域,所以要将项目部署到服务器中

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue组件</title>
<script src="vue.js"></script>
<script type="text/javascript" src=‘jquery-3.1.1.min.js‘></script>
</head>
<body>
<div id="app1">
<head-com></head-com>
</div>
<script>
Vue.component(‘head-com‘, function (resolve, reject) {
$.get("a.html").then(function (res) {
resolve({
template: res
})
});
});

var app1 = new Vue({
el: ‘#app1‘
});

</script>
</body>
</html>
显示效果如下:

6、Vue中的props数据流

通过在注册组件中申明需要使用的props,然后通过props中与模板中传入的对应的属性名,去取用这些值

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue组件</title>
    <script src="vue.js"></script>
    <script type="text/javascript" src=‘jquery-3.1.1.min.js‘></script>
</head>
<body>
    <div id=‘app‘>
       <my-component name="jiangjiang" come-from="guilin"></my-component>
       <!-- 然后在模板中通过属性传值的方式进行数据的注入 -->
    </div>
    <script>
        Vue.component(‘my-component‘, {
          props: [‘name‘, ‘comeFrom‘],    //在注册组件的时候通过props选项声明了要取用的多个prop
          // 在注册组件的模板中使用到props选项中声明的值
          template: ‘<p>我叫:{{name}}, 我来自:{{comeFrom}}</p>‘,
          created: function () {
            console.log(‘在created钩子函数中被调用‘)
            console.log(‘我叫:‘, this.name)
            console.log(‘我来自:‘, this.comeFrom)
          }
        })

new Vue({
          el: ‘#app‘
        })

</script>
</body>
</html>

注意:

A、props取值的方式

在注册组件的模板内部template,直接通过prop的名称取值就Ok

template: ‘<p>我叫:{{name}}, 我来自:{{comeFrom}}</p>‘
不在注册组件的模板内部template,用this.prop的方式

console.log(‘我来自:‘, this.comeFrom)
B、在template选项属性中,可以写驼峰命名法,也可以写短横线命名法

在HTML(模板)中,只能写短横线命名法

原因:vue组件的模板可以放在两个地方

a、Vue组件的template选项属性中,作为模板字符串

b、放在.html中[  用script  template标签创建的组件 ],作为HTML

问题在于HTML不区分大小写,所以在vue注册组件中通用的驼峰命名法,不适用于HTML中的Vue模板,在HTML中写入props属性,必须写短横线命名法(把原来props属性中的每个prop大写换成小写,并且在前面加“-”)

将6中的

<div id=‘app‘>
<my-component name="jiangjiang" come-from="guilin"></my-component>
<!-- 然后在模板中通过属性传值的方式进行数据的注入 -->
</div>
改成

<div id=‘app‘>
<my-component name="jiangjiang" comeFrom="guilin"></my-component>
<!-- 然后在模板中通过属性传值的方式进行数据的注入 -->
</div>
显示效果,第二个没有显示

异步组件的实现原理;异步组件的3种实现方式---工厂函数、Promise、高级函数

异步组件实现的本质是2次渲染,先渲染成注释节点,当组件加载成功后,在通过forceRender重新渲染

高级异步组件可以通过简单的配置实现loading   resolve   reject   timeout  4种状态

原文地址:https://www.cnblogs.com/wangqi2019/p/10935769.html

时间: 2024-08-30 13:40:38

vue --》组件的封装 及 参数的传递的相关文章

封装Vue组件的一些技巧

封装Vue组件的一些技巧 本文同步在个人博客shymean.com上,欢迎关注 写Vue有很长一段时间了,除了常规的业务开发之外,也应该思考和反思一下封装组件的正确方式.以弹窗组件为例,一种实现是在需要模板中引入需要弹窗展示的组件,然后通过一个flag变量来控制弹窗的组件,在业务代码里面会充斥着冗余的弹窗组件逻辑,十分不优雅. 本文整理了开发Vue组件的一些技巧,包含大量代码示例. 开发环境 vue-cli3提供了非常方便的功能,可以快速编写一些测试demo,是开发组件必备的环境.下面是安装使用

vue组件篇(2)---封装组件并发布到npm

瞎说说 vue小白,要进行应用开发:你们都用什么UI框架,求指教,不想踩坑(想太多,不踩坑???不存在的!!!too young too simple-) 同学1:pc端我用element UI,感觉组件的API方法.属性比较完善...?? 同学2:哈?我个人感觉他的样式有些生硬,不够炫酷美观??,用iView吧,组件丰富,动画效果cool~~~?? 同学3:真的吗?阔是有人说,iView组件虽然完美的把其他UI组件有的缺点完美避过,但是某某组件不够人性化....?? 同学4:用vue-beau

Vue组件注册与数据传递

父子组件创建流程 1.构建父子组件 1.1 全局注册 (1)构建注册子组件 //构建子组件child var child = Vue.extend({ template: '<div>这是子组件</div>' }); //注册名为'child'的组件 Vue.component('child',child); (2)构建注册父组件 //构建父组件parent,在其中嵌套child组件 var parent = Vue.extend({ template: '<div>这

vue教程3-05 vue组件数据传递、父子组件数据获取

vue教程3-05 vue组件数据传递 一.vue默认情况下,子组件也没法访问父组件数据 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="bower_components/vue/dist/vue.js"><

子组件通过$emit触发父组件的事件时,参数的传递

子组件.vue <template> <div> <el-table :data="comSchemaData" highlight-current-row height="517" @row-click="quoteProps"> <el-table-column label="schema名称" prop="name"> </el-table-col

【vue】-----js组件的封装--------

在js组件网站上,查看那个组件好看就用,把他们结构和样式分别写在  组件文件内.loading.vue组件 做一下组件的测试/引用 运行的效果 封装完好的,js组件 loading  HTML和css样式 1 <template> 2 <div class="loader" v-if="flag"> 3 <div class="loader-inner"> 4 <div class="loade

使用vue实现日历组件的封装

前言 因项目的需要,而且当前组件库并不支持业务,所以,重新对日历组件进行封装.该篇博客就对实现日历的思路进行存档,方便以后的查阅. 先上图:UI小哥哥的原型图.接下来的思路都是根据该图进行解说 逻辑 1.组件的拆分,分出哪些是业务,哪些是基础组件. 整体来说,这就是在日历的基础上添加业务,所以日历组件应该是基础组件,而业务应该是通过插槽插入进去的.那么,右上方的分入分出合计以及每个日历中的分入,分出都是需要插入的.其余的均是日历本身的功能. 2.那么接下来,我们先完成日历组件的封装,首先,我们要

【转】Vue组件一-父组件传值给子组件

Vue组件一-父组件传值给子组件 开始 Vue组件是学习Vue框架最比较难的部分,而这部分难点我认为可以分为三个部分学习,即 组件的传值 - 父组件向子组件中传值 事件回馈 - 子组件向父组件发送消息,父组件监听消息 分发内容 整个博客使用的源代码-请点击 所以将用三篇博客分别进行介绍以上三种情况和使用 Vue的设计者对组件的理解 Vue的设计者,对组件和父组件之间的关系流上做了阐述,即单向数据流图:父组件向子组件传递数据,子组件回馈事件 组件意味着协同工作,通常父子组件会是这样的关系:组件 A

vue组件传参

一.父子组件的定义 负值组件的定义有两种,我称为常规父子组件和特殊父子组件. 1.1.常规父子组件 将其他组件以import引入用自定义标签接收,在当前组件中component里注册该标签,页面上可以直接用<自定义标签></自定义标签>样子使用.当前组件为父组件,被引入的组件为子组件. 引入子组件 注册子组件 使用子组件 1.2.特殊父子组件 在路由中定义好组件,组件中含有children,页面上通过<router-view></router-view>形式