组件化

注册组件的基本步骤

  1. 创建组件构造器 (调用Vue.extend()方法)
  2. 注册组件 (调用Vue.component()方法)
    • 注册组件语法糖

      • 省去了调用Vue.extend()的步骤,而是可以直接使用一个对象来代替
  3. 使用组件 (在Vue实例的作用范围内使用组件)

组件模板的分离写法

  1. 语法糖简化了Vue组件的注册过程,但是template模块中js和html代码混杂的写法仍让我们苦恼
  2. 于是Vue提供了两种方式,来分离模板中的js和html代码

    - 使用标签 ,再通过id来关联
      <script type="text/x-template" id="cpn">  模板内容  </script>
    Vue.component('cpn', {
    template: '#cpn'
    }) //全局组件
- 使用`<template>`标签,再通过id来关联
```js
<template id="cpn"> 模板内容 </template>
注册组件方式于上相同
```

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

  • 组件是一个单独功能模块的封装

    • 这个模板有属于自己的HTML模板,也应该有自己的数据data
  • 组件中的数据是保存再哪里呢?顶层的Vue实例中的data吗
    • 通过实践,我们发现是不能访问的,即使可以,如果将所有的数据都放在Vue实例中,Vue也会变的非常臃肿
    • 结论:Vue组件应该有自己保存数据的地方
  • 组件中的data为什么是函数且返回对象类型?
    • 为了组件的复用性和各个组件的独立性,当多次调用的时候,能为各个组件中的数据单独开辟存储空间,互补影响

父子组件的通信

  • 在上面提到,子组件是不能引用父组件或者Vue实例的数据的
  • 但是,在开发中,往往一些数据确实需要从上层传递到下层:
    • 比如在一个页面中请求到了很多数据
    • 其中一部分数据,并非是我们整个页面的大组件来展示的,而是需要下面的子组件进行展示
    • 这时,并不会让子组件再次发送一个网络请求,而是直接让大组件(父组件)/将数据传递给小组件(子组件)
  • 如何进行父子间的通信呢?
    1. 通过props(properties:属性)向子组件传递数据(父->子)
    2. 通过自定义事件emit向父组件发送消息(子->父)

1父级向子级传递数据:

  • 在子组件中,使用选项props来声明需要从父组件中接收到的数据(props:数组或者对象)
  • 在使用子组件时通过绑定自定义属性来将数据从父组件传到子组件当中
  • props驼峰标识:props定义了驼峰标识的变量数据时,在使用时要用-小写,aMessage -> a-message
  • props数据验证:props使用对象可以进行数据验证和设置默认值(type,defult)
  •     <div id='app'>
    <cpn :message='message'></cpn>
    </div> <template id="cpn">
    <h2>{{ message }}</h2>
    </template> <script src='./vue1/js/vue.js'></script>
    <script>
    const app=new Vue({
    el:'#app',
    data:{
    message:'你好啊'
    },
    components:{
    cpn:{
    template:'#cpn',
    props:{
    message:{
    type:string,
    defult(){
    return {}
    }
    },
    }
    }
    }
    })

2子级向父级传递数据:

  • 使用自定义事件和$emit
  • 通常是子组件发生了一些事件,然后告诉父组件我们发生了什么事件,并且告诉父组件对应事件的数据
  •     <div id='app'>
    <cpn @itemclick='cpnclick'></cpn>
    </div> <template id="cpn">
    <div>
    <button v-for="item in aaa" @click='btnclick(item)'>{{item.name}}</button>
    </div>
    </template>
    <script> const cpn = {
    template:'#cpn',
    data(){
    return {
    aaa:[
    {id:'aaa',name:'热门推荐'},
    {id:'bbb',name:'手机数码'},
    {id:'ccc',name:'家用家电'}
    ]
    }
    },
    methods:{
    btnclick(item){
    //emit 发射
    this.$emit('itemclick',item)
    }
    }
    } const app=new Vue({
    el:'#app',
    data:{
    message:'你好啊'
    },
    components:{
    cpn
    },
    methods:{
    cpnclick(item){
    console.log('cpnclick',item);
    }
    }
    })

3父级组件访问子级组件

  • 使用$children(通常不推荐使用)或者$refs (refrence:引用)
  • this.$children是一个数组类型,它包含了所有子组件对象
  • $refsref指令通常一起使用,首先我们通过ref给某一个子组件绑定一个特定的ID,其次,通过this.$refs.ID就可以访问到该组件了
  •  <child-cpn ref='child'></cpn>
    <button @click='showRefscpn'></button>
    showRefscpn(){
    console.log(this.$refs.child.message)
    }

4.子级组件访问父级组件

  • 可以通过$parent来实现 ,this.$parent
  • 但是在开发中一般不会这样做,因为应该避免直接访问父组件的数据,因为这样耦合度太高了

插槽的使用(slot)

  • 在子组件中使用,就可以为子组件开启一个插槽
  • 具名插槽:
  •   <div id="app">
    <cpn><span slot="center">标题</span></cpn>
    <cpn><button slot="left">返回</button></cpn>
    </div> <template id="cpn">
    <div>
    <slot name="left"><span>左边</span></slot>
    <slot name="center"><span>中间</span></slot>
    <slot name="right"><span>右边</span></slot>
    </div>
    </template>

模块化

为什么要模块化

  • 随着ajax异步请求的出现,慢慢形成了前后端的分离,客户端的代码也越来越多,为了对应代码的剧增,通常会将代码阻止在多个js文件当中,但是,这种维护方式,依然不能避免一些灾难性的问题

    • 当js文件过多的时候,比如有几十个的时候,弄清楚他们的顺序是一件比较尴尬的事情
    • 多个变量名冲突的问题
    • 即使使用匿名函数解决了重名问题,但是如果讲匿名函数中的变量和方法给其他文件调用

如何模块化

  •   模块化雏形
    var moudle=(function(){
    var obj={};
    obj.flag=true;
    obj.myfunc=function(info){
    console.log(info)
    }
    return obj
    })()
  • 上面的是模块化概念的雏形,前端发展到现在,也有了很多现有的规范和对应的实现方案

    • es6 :export{}导出 ,import{} form '文件路径'导出

      • 引入时需要在上type <script src='...' type='module'></script>
      • export default + 导出成员,在导入是可以自定义命名
    • commonjs: moudle.exports={xx}导出,let={xx}=require('文件路劲')导入
    • AMD
    • CMD

vue组件化思想和模块化的更多相关文章

  1. 三. Vue组件化

    1. 认识组件化 1.1 什么是组件化 人面对复杂问题的处理方式 任何一个人处理信息的逻辑能力都是有限的,所以当面对一个非常复杂的问题时我们不太可能一次性搞定一大堆的内容. 但是我们人有一种天生的能力 ...

  2. 基于layui的框架模版,采用模块化设计,接口分离,组件化思想

    代码地址如下:http://www.demodashi.com/demo/13362.html 1. 准备工作 编辑器vscode,需要安装liveServer插件在前端开启静态服务器 或者使用hbu ...

  3. Vue 组件化开发的思想体现

    现实中的组件化思想化思想体现 标准(同一的标准) 分治(多人同时开发) 重用(重复利用) 组合(可以组合使用) 编程中的组件化思想 组件化规范:Web Components 我们希望尽可能多的重用代码 ...

  4. vue组件化之模板优化及注册组件语法糖

    vue组件化之模板优化及注册组件语法糖 vue组件化 模板 优化  在 https://www.cnblogs.com/singledogpro/p/12054895.html 这里我们对vue.js ...

  5. vue组件化初体验 全局组件和局部组件

    vue组件化初体验 全局组件和局部组件 vue组件化 全局组件 局部组件  关于vue入门案例请参阅 https://www.cnblogs.com/singledogpro/p/11938222.h ...

  6. 二、vue组件化开发(轻松入门vue)

    轻松入门vue系列 Vue组件化开发 五.组件化开发 1. 组件注册 组件命名规范 组件注册注意事项 全局组件注册 局部组件注册 2. Vue调试工具下载 3. 组件间数据交互 父组件向子组件传值 p ...

  7. vue - Vue组件化编程

    今天是对vue组件化的一个理解,最主要的单文件组件,然后就可以脚手架的学习了,本来昨晚就该上传的,但是用的那个上传博客园的Python脚本不行了,换了一个新的. 组件化让我越来越感觉到框架的力量了 一 ...

  8. vue组件化的应用

    前言:vue组件化的应用涉及到vue-cli的内容,所以在应用之前是需要安装node和vue-cli的,具体如何安装我就不一一赘述了.可能一会儿我心情好的时候,可以去整理一下. 1.应用的内容:在一个 ...

  9. Vue组件化开发

    Vue的组件化 组件化是Vue的精髓,Vue就是由一个一个的组件构成的.Vue的组件化设计到的内容又非常多,当在面试时,被问到:谈一下你对Vue组件化的理解.这时候又有可能无从下手,因此在这里阐释一下 ...

随机推荐

  1. docker入门-安装篇

    一.docker介绍 1:docker官网 www.docker.com 2:github  https://github.com/docker/docker.github.io 3:开源的容器引擎, ...

  2. Java垃圾回收机制你还不明白?一线大厂面试必问的!

    什么是自动垃圾回收? 自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制. 所谓使用中的对象(已引用对象),指的是程序中有指针指向的对象:而未使用中的对象(未 ...

  3. hdu 1255 覆盖的面积 (扫描线求矩形交)

    覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  4. Fragment中不能使用自定义带参构造函数

    通过Fragment自定义的静态方法将值从activity传到fragment中,然后就想到这样不是多次一举吗,为什么不直接写个带参构造函数将值传过去呢?试了一下,发现Fragment有参构造函数竟然 ...

  5. 使用VMware安装CentOS 7

    环境:Windows10 , VMware Workstation 15 Player, CentOS 7 为什么选择CentOS ? 主流: 目前的Linux操作系统主要应用于生产环境,主流企业级L ...

  6. linux下安装与配置nfs服务器

    NFS 什么是NFS?(NAS) NFS(网络文件系统):它的主要功能是通过网络让不同的机器系统之间可以彼此共享文件和目录.NFS服务器可以允许NFS客户端将远端NFS服务器端的共享目录挂载到本地的N ...

  7. 两种最常用的 HTTP 操作方法是:GET 和 POST。

    什么是 HTTP? 超文本传输协议(HTTP)的设计目的是保证客户机与服务器之间的通信. HTTP 的工作方式是客户机与服务器之间的请求-应答协议. web 浏览器可能是客户端,而计算机上的网络应用程 ...

  8. weblogic启动节点服务java.lang.ClassCastException:com.octestring.vde.backend.BackendRoot cannot be cast to com.octestring.vde.backend.standard.BackendStandard类型转换异常

    weblogic启动节点服务器报错,java.lang.ClassCastException:com.octestring.vde.backend.BackendRoot cannot be cast ...

  9. doPost()和doGet()方法的区别?

    GET和POST请求都是http的请求方式,用户通过不同的http的请求方式完成对资源(url)的不同操作.GET,POST,PUT,DELETE就对应着对这个资源的查 ,改 ,增 ,删 4个操作,具 ...

  10. MAT分析android内存泄漏

    转载请标明出处:https://www.cnblogs.com/tangZH/p/10955429.html 泄漏,泄漏,漏~ 内存泄漏怎么破,什么是内存泄漏?与内存溢出有什么区别? 内存泄漏(Mem ...