组件化

注册组件的基本步骤

  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. Windows基础

    目录 一. 硬件概述 二.常见硬件设备 三.文件系统 四. 文件类型和DOS命令 五 .批处理 六 .TCP/IP概述和Windows配置 七.网络设置.DNS.邮件★ 一. 硬件概述 1.计算机的发 ...

  2. synchronized和volatile区别

    不同一: synchronized可以修饰方法, volatile只能修饰变量 不同二: synchronized是同步的 volatile修饰的变量具有可见性.

  3. 如何为.NETCore安装汉化包智能感知

    引言 具体不记得是在群里还是什么地方有人问过,.NETCore有没有汉化包,答案是有,目前微软已经为我们提供了.NETCore多种语言的语言包.下面看看如何安装与使用吧. 在哪下载? 在微软官方下载 ...

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

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

  5. spring+activemq实战之配置监听多队列实现不同队列消息消费

    摘选:https://my.oschina.net/u/3613230/blog/1457227 摘要: 最近在项目开发中,需要用到activemq,用的时候,发现在同一个项目中point-to-po ...

  6. 基于C#WPF框架——动画

    WPF提供了一个更高级的模型,通过该模型可以只关注动画的定义,而不必考虑它们的渲染方式.这个模型基于依赖项属性基础架构.本质上,WPF动画只不过是在一段时间间隔内修染方式.这个模型基于依赖项属性基础架 ...

  7. 张亦总结《AG百家乐庄闲,龙虎中下三路技巧和三株路的运用》

    ​​关于三珠路的各种打法,这里我做个详细的讲解 三珠路的打法源于澳门赌王叶汉,需要了解赌王叶汉的著作<BJL投注公式>的可以加我Q:<10353581>进行详细解答 叶汉的打法 ...

  8. public class 和 class的区别

    问题:public class 和 class的区别 public class 公共类 class 普通类 一个java源文件中可以有多个class,但是最多只能有一个public class 可以没 ...

  9. 去除TextView设置lineSpacingExtra后,最后一行多出的空白

    转载请标明出处:https://www.cnblogs.com/tangZH/p/11985745.html 有些手机中,给TextView设置lineSpacingExtra后会出现最后一行的文字也 ...

  10. 解决mysql导入数据量很大导致失败及查找my.ini 位置(my.ini)在哪

    数据库数据量很大的数据库导入到本地时,会等很久,然而等很久之后还是显示失败: 这是就要看看自己本地的没mysql是否设置了超时等待,如果报相关time_out这些,可以把mysql.ini尾部添加ma ...