组件化

注册组件的基本步骤

  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. 使用笛卡尔积生成sku

    /// <summary> /// 生成SKU价格表 /// </summary> /// <param name="model"></p ...

  2. rails 创建项目、创建controller、model等

    rails2之前创建新项目: rails3以及更高版本创建新项目:rails new webname 创建数据表model:rails g model user name:string sex:str ...

  3. 4种MySQL分页查询优化的方法,你知道几个?

    前言 当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询.对于数据库分页查询,也有很多种方法和优化的点.下面简单说一下我知道的 ...

  4. CCF-CSP题解 201903-4 消息传递接口

    求并行的各个进程,且进程内部顺序执行的情况下,会不会出现"死锁". 首先用\(%[^\n]\)将每个进程读入.最后过不了居然是因为\(str[\ ]\)开小了(悲喜交加.存储在\( ...

  5. 理解django的框架为何能够火起来

    理解django的框架为何能够火起来 https://www.yiibai.com/django/django_basics.html https://code.ziqiangxuetang.com/ ...

  6. Java 异常规范

    1. 只针对异常情况使用异常,不要用异常来控制流程 try { int i = 0; while (true) { range[i++].doSomething(); } } catch (Array ...

  7. Maven使用教程二:nexus私服搭建及使用

    nexus安装 从nexus官网 下载最新的安装包 1.打开命令行,切换到nexus-3.2.1-01/bin目录下,回车.例:C:\Nexus\nexus-3.2.1-01\bin 2.输入:nex ...

  8. ASP.NET CORE 使用Consul实现服务治理与健康检查(2)——源码篇

    题外话 笔者有个习惯,就是在接触新的东西时,一定要先搞清楚新事物的基本概念和背景,对之有个相对全面的了解之后再开始进入实际的编码,这样做最主要的原因是尽量避免由于对新事物的认知误区导致更大的缺陷,Bu ...

  9. 守护线程,需要通过调用线程方法:setDaemon(boolean on)来进行设置

    package seday08.thread;/*** @author xingsir * 守护线程又称为后台线程,默认创建出来的线程都是普通线程, 守护线程需要通过调用线程方法:setDaemon( ...

  10. hadoop伪分布模式的配置和一些常用命令

    大数据的发展历史 3V:volume.velocity.variety(结构化和非结构化数据).value(价值密度低) 大数据带来的技术挑战 存储容量不断增加 获取有价值的信息的难度:搜索.广告.推 ...