组件化

注册组件的基本步骤

  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. zabbix主动模式无法获取网卡和文件系统数据

    zabbix版本为4.2,根据网上教程将zabbixagent设置成主动模式后,将templates中各Items的type改为Zabbix agent (active),同时将Discovery r ...

  2. 小白学 Python 爬虫(23):解析库 pyquery 入门

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  3. SoC的软件开发流程,主要包含一些Linux下的操作命令

    该笔记主要记录SoC的软件开发流程,主要包含一些Linux下的操作命令 1. 编写design file .c .h 2. 编写makefile    可执行文件名,交叉编译环境,compile fl ...

  4. CCF-CSP题解 201503-4 网络延时

    求树的直径. 两遍\(dfs\)就好了. #include <cstdio> #include <cstring> #include <algorithm> #in ...

  5. 《Java练习题》习题集三

    编程合集: https://www.cnblogs.com/jssj/p/12002760.html Java总结:https://www.cnblogs.com/jssj/p/11146205.ht ...

  6. VS2019 开发Django(九)------内置模板和过滤器

    导航:VS2019开发Django系列 紧接上篇,继续介绍Django中的模板,考虑可能篇幅过长,所以分为两部分来讲,今天的主要内容: 1)内置模板和过滤器 母版,继承关系.头部导航和页脚,是需要与其 ...

  7. HttpRunner学习5--使用variables声明变量

    前言 在HttpRunner中,如果需要声明变量,可以通过关键字 variables 来完成,要引用声明的变量,则是通过 $+变量名 (如 $token )来实现.variables 可以在 conf ...

  8. Python 库打包分发、setup.py 编写、混合 C 扩展打包的简易指南(转载)

    转载自:http://blog.konghy.cn/2018/04/29/setup-dot-py/ Python 有非常丰富的第三方库可以使用,很多开发者会向 pypi 上提交自己的 Python ...

  9. python网络编程socket编程(TCP、UDP客户端服务器)

    摘录 python核心编程 使用socket()模块函数创建套接字——通信端点 >>> from socket import * >>> tcpSock = soc ...

  10. springcloud 微服务分布式 框架源码 activiti工作流 前后分离

    1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2. ...