组件化

注册组件的基本步骤

  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. 【Mock MVC】使用学习

    [Mock MVC]使用学习 转载:https://www.cnblogs.com/yangchongxing/p/10658311.html

  2. mysql慢查询相关

    如何查看执行较慢的sql: 1.使用show variables like '%query%'; 查询结果: ft_query_expansion_limit 20have_query_cache Y ...

  3. C语言每日一练——第6题

    一.题目要求 计算500~800区间素数的个数cnt,并按所求素数的值从大到小的顺序,计算其间隔间的减.加之和,即第1个素数-第2个素数+第3个素数-第4个素数+第5个素数.....的值sum.最后把 ...

  4. salt python msgpack.exceptions.

    msgpack.exceptions.UnpackValueError: 'utf-8' codec can't decode byte 0x82 in position 22: invalid st ...

  5. keras模型保存和权重保存

    模型保存和读取(包括权重): model.save('./model.h5') from keras import models model = models.load_model(./model.h ...

  6. 剑指offer笔记面试题2----实现Singleton模式

    题目:设计一个类,我们只能生成该类的一个实例. 解法一:单线程解法 //缺点:多线程情况下,每个线程可能创建出不同的的Singleton实例 #include <iostream> usi ...

  7. 开源Odoo13更新的模块功能信息(译文)

    本文来源江苏欧度软件:www.odooyun.com 本次Odoo13已于10月初发布,更新的模块有:Odoo会计模块.Odoo活动项目模块.Odoo13审批模块.Odoo评价.客户关系管理(CRM) ...

  8. ProcessExplorer 工具下载

    链接:https://pan.baidu.com/s/1RPYkFqIMvBX2OKvTm0bgkw 提取码:4v5v

  9. 【Dos】复制指定文件夹下所有文件到另外指定文件夹下

    bat代码如下: @echo off @set /p fromFile=from: @set /p toFile=to: rem 找到所有文件 dir /b /s %fromFile%\ *.gz & ...

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

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