vue组件化开发

  • 将一个页面分割成若干个组件,一个页面js+css+html,将自己类容分割出来,方便开发,更好了维护我们的代码,每个组件封装自己的js+html+css,样式命名冲突

组件分类

  • 页面级组件( 例如详情页页面)

  • 基础组件(页面的一部分,例如轮播图)

  • 组件的目的为了实现复用

指令和组件

  • 在标签内增加的行内属性,实现功能指令

  • 组件就是一个自定义(扩展)的标签<hello></hello>,封装代码的,组件的标签名不能破坏原有的html标签

组件:全局组件(不需要引用),局部组件(需要引用)

  • 在vue中一个对象就是一个组件

  • 在组件中data是一个函数,目的是不受别人干扰,因为组件是独立的

  • 使用组件的步骤,

    • 1.声明组件,并且引入到当前页面

    • 2.在组件的父级模板中调用这个组件

    • 组件名称不能和标签相同

  • 全局组件

    1. Vue.component('my-handsone',{
    2. //template只会有一个根元素,而且不能直接放置文本节点
    3. template:'<h1>{{msg}}</a></h1>',
    4. data(){
    5. return { //可以用来定义数据
    6. msg:"帅吗",
    7. types:[1,2,3]
    8. }
    9. }
    10. });
    11. let vm=new Vue({
    12. el:"#app",
    13. data:{}
    14. })
  • 局部组件
    1. //一个对象就是一个组件
    2. let webeautiful={
    3. template:'<h1>{{msg}}</h1>',
    4. data(){
    5. return {
    6. msg:"很帅呀"
    7. }
    8. }
    9. };
    10. let vm=new Vue({
    11. el:"#app",
    12. //挂载在vue实例中components
    13. components:{
    14. webeautiful
    15. }
    16. })

    组件的数据传递

    • 父传子属性传递 子组件通过props接收

    • props的api

      • type 接收数据的类型

      • default 默认数据的值

      • required 必须传递数据 不能和default同时引用

      • validator 自定义验证

    • 子传父组件,事件触发 $emit->@方法="父组件的方法"

    • 平级交互 eventBus 但是不用 -vuex

    • 父组件调用子类的方法 ref=>this.$ref.xxx.子类方法

    • slot 插槽 (设置一些空闲的位置等等使用)

    父亲传递给儿子数据

    • 先在儿子组件上绑定一个属性名,然后赋值给这个属性 :m="msg",

    • 儿子接受父亲传递的数据,用props接收传递的属性名字,例如 props:{m:{type:Array}}

      1. // 父亲到儿子,默认组件是独立的,相互不能引用数据,可以通过属性方式传递给儿子
      2. let vm=new Vue({
      3. el:"#app",
      4. //根实例上的data都是对象,组件中的都是函数
      5. data:{
      6. money:100
      7. },
      8. //父级传递给子集数据通过绑定属性,如果传递多个可以数组中写多个
      9. template:'<div><child :m="money" o="美女"></child></div>',
      10. components:{
      11. child:{
      12. //子集接收给父级给的数据,通过props属性接收
      13. props:['m','o'],
      14. computed:{
      15. b(){
      16. //这里的this指向子集child
      17. //父亲的数据儿子不能更改 错误写法 this.o="丑呀"
      18. return "大大"+this.o;
      19. }
      20. },
      21. template:"<div>儿子 {{m}} {{b}}</div>"
      22. }
      23. }
      24. })

      父亲接收儿子传递的参数

      • 儿子通过自定义事件方法中给父亲发射自己的数据

      • 先在儿子组件实例中created中发射一个数据

        • 例如 created(){//传递自己的数据

        1. this.$emit('childs',this.msg);

        }

      • 在儿子组件上要绑定这个自定义事件方法,然后里面赋值父亲接收的函数

        • 例如儿子组件 <child @childs="父亲接收的函数"></child>

      • 最后父亲接收的函数很简单,参数就是儿子传递的数据

        • 例如父亲接收的函数 fn(data){//这里面的data就是儿子发射给父亲的参数}

          1. //实例化一个Vue函数
          2. let vm=new Vue({
          3. //child 是儿子 触发了自己的一个方法,绑定了父亲的一个函数方法
          4. template:'<div><child @childs="say"></child></div>',
          5. //方法挂载
          6. methods:{
          7. //父亲的一个方法
          8. say(data){
          9. console.log(data);
          10. }
          11. },
          12. //定义一个儿子组件
          13. components:{
          14. //儿子名字
          15. child:{
          16. //事件和数据初始化之后
          17. created(){
          18. //儿子发射一个方法 传递自己的数据
          19. this.$emit('childs',this.msg);
          20. },
          21. template:'<div>子</div>',
          22. data(){
          23. return {
          24. msg:"我饿了"
          25. }
          26. },
          27.  
          28. }
          29. },
          30. }).$mount("#app"); //手动将vue挂载在#app标签上

      父亲和儿子实现双向数据绑定

      父亲传递给儿子数据,儿子触发一个父亲方法,将最新的值传递给父亲,父亲更改后,属性会重新传递儿子,儿子会刷新

      • 父亲先在儿子组件上通过绑定一个属性,然后给这个属性赋值,给儿子传递数据

        • 例如<child :m="msg"></child>

      • 儿子接收父亲的传递的数据props

        • props:{m:{type=Array}}

      • 儿子拿到数据后,要修改数据,(儿子无法把父亲传递的参数重新赋值)

      • 然后儿子重新发射一个自定义事件方法,后面跟要修改的值

        • this.$emit("ee",1000);

      • 此时儿子组件上要绑定发射的自定义方法,赋值父亲的接收的函数fn

        • <child :m="msg" @ee="fn"></child>

      • 父亲接收函数,参数就是儿子发射过来的数据

        • fn(data){//此时把儿子发射过来的数据data,重新赋值给第一次传递过去的msgreturn this.msg=data;}

      • 这样就成功了实现父与子之间的数据双向绑定

        1. let vm = new Vue({
        2. el:'#app',
        3. //通过在儿子组件上绑定一个属性向儿子传递数据
        4. // @ee="fn" 接收儿子传递过来数据,ee是儿子那边自定义的事件方法,必须绑定在儿子组件上
        5. template:'<div>父亲+{{money}}<child :m="money" @ee="fn"></child></div>',
        6. data:{
        7. money:100
        8. },
        9. methods:{
        10. fn(data){
        11. //父亲接收儿子的数据函数
        12. return this.money=data;
        13. }
        14. },
        15. components:{
        16. child:{
        17. //接收父亲传递过来的属性值
        18. props:{m:{}},
        19. template:'<div>{{m}}<button @click="more"></button></div>',
        20. methods:{
        21. more(){
        22. //向父亲发射一个自定义方法,并传递过去自己的值
        23. this.$emit('ee',1000)
        24. }
        25. }
        26. }
        27. }
        28. })

        实现父亲月儿子之间的数据双向数据绑定 在高版本中有sync修饰符

        • 父亲先通过在儿子身上绑定一个属性,向儿子传递数据

        • 这时候,属性后面我们跟一个sync修饰符

        • 例如 <child :m.sync="msg"></child>

      • 这时候,儿子要通过props接受父亲传递的参数

        • props:{

          1. m:{
            type:Array //规定是数据类型
            }

          }

      • 儿子接受到数据,发现不满意,发射一个自定义事件方法给父亲

        • this.$emit('update:m',1000);

      • 此时我们发现父亲的数据m自动更改了,变成1000

  1. let vm = new Vue({
  2. el:'#app',
  3. template:'<div>父{{msg}}<child :a.sync="msg"/></div>',
  4. data:{
  5. msg:'美女'
  6. },
  7. components:{
  8. child:{
  9. props:['a'], //<comp :foo="bar" @update:foo="val => bar = val"></comp>
  10. template:'<div>child {{a}} <button @click="change">换</button></div>',
  11. methods:{
  12. change(){ //固定的写法
  13. //2.3.0版本以后才会用
  14. //用了sync,下面必须用update
  15. this.$emit('update:a','丑女');
  16. }
  17. }
  18. }
  19. }
  20. })

父亲调用子组件的一些方法

第一步先定义儿子有一个fn方法

methods:{fn(){ console.log("王阿姨好漂亮"); }}

第二步在儿子身上标记一个表示ref

<child ref="msg"></child>

第三步父亲在视图加载完成后,调用儿子的fn方法

mounted(){this.$refs.msg.fn();}

this.$refs.msg 调用儿子身上的msg表示,这时候this.$refs.msg指向的就是儿子的实例

实例.fn() 这就调用到了儿子的fn方法

    1. // ref如果写在dom上,表示获取dom,如果写在组件上,表示当前组件的实例
    2. let vm=new Vue({
    3. el:"#app",
    4. template:'<child ref="c"></child>',
    5. //一定要放在mounted下面,因为mounted方法表示数据和视图渲染完成,
    6. mounted(){
    7. //当前的ref指向的是child组件的实例,通过实例调用下面的fn方法
    8. this.$refs.c.fn();
    9. },
    10. components:{
    11. child:{
    12. template:'<div>child</div>',
    13. methods:{
    14. fn(){
    15. alert("王阿姨好漂亮")
    16. }
    17. }
    18. }
    19. }
    20. })

    兄弟组件之间的数据通讯(就是平级组件之间的数据通讯)

    • 兄弟组件之间数据互通,要借助第三个vue实例

    • eventBus使用起来不好管理,命名冲突,而且复杂,一般不用

      • 我们通常叫这个实例叫eventBus

        • let eventBus=new Vue;

      • 将兄弟发射的自定义事件方法,挂载到eventBus实例上

        • eventBus.$emit('aa',''c');

      • 然后通过$on方法,将兄弟发射的自定义事件方法绑定里面去

      • 后面的回调函数一定要是箭头函数,不改变实例的this,方便赋值

        • 例如 eventBus.$on('aa',(data)=>{console.log(data) }

        1. let eventBus=new Vue;
        2. //eventBus使用起来不好管理,命名冲突,而且复杂,一般不用
        3. let C={
        4. template:'<div>{{val}}<button @click="ss">变C</button></div>',
        5. data(){
        6. return {
        7. val:"C"
        8. }
        9. },
        10. methods:{
        11. ss(){
        12.  
        13. eventBus.$emit('bb','C');
        14. }
        15. },
        16. created(){
        17. //
        18. eventBus.$on('aa',(data)=>{
        19. this.val=data;
        20. })
        21. }
        22. };
        23. let D={
        24. template:'<div>{{val}}<button @click="ee">变D</button></div>',
        25. data(){
        26. return {
        27. val:"D"
        28. }
        29. },
        30. created(){
        31. //
        32. eventBus.$on("bb",(data)=>{
        33. this.val=data;
        34. })
        35. },
        36. methods:{
        37. ee(){
        38. //
        39. eventBus.$emit('aa','D');
        40. }
        41. }
        42. }
        43. let vm = new Vue({
        44. el:'#app',
        45. //1,找共同父级,时间交互,非常复杂,不采用
        46. template:'<div><C></C><D></D></div>',
        47. data:{
        48.  
        49. },
        50. components:{
        51. C,
        52. D
        53. }
        54. })

        使用 slot 分发内容

        slot 可以将不同的标签分开发送到指定的节点中

        slot 有一个name属性

        slot上的name属性,有一个默认值default

        没有指定slot名字的都叫default 会塞到name=default的组件内

        1. <div id="app">
        2. <hello>
        3. 123
        4. <ul slot="bottom">
        5. <li>我很帅</li>
        6. </ul>
        7. <ul slot="top">
        8. <li>你丑</li>
        9. </ul>
        10. 456
        11. </hello>
        12. </div>
        13. <template id="hello">
        14. <div>
        15. <!--slot是vue提供的内置插件,具名slot 在写内容时第一预留出来slot插口,如果没有使用则使用默认内容,没有指定slot名字的都叫default 会塞到name=default的组件内-->
        16. <slot name="default">nihao </slot>
        17. <slot name="top">这是上</slot>
        18. <slot name="bottom">这是下</slot>
        19. </div>
        20. </template>
        21. <script>
        22. let vm = new Vue({
        23. el:'#app',
        24. components:{
        25. hello:{
        26. template:'#hello'
        27. }
        28. }
        29. })
        30. </script>

        vue动画组件 transition

        • transition有一个name属性

          • 假设我们name="fade"

        • transition动画组件对应三个css样式

        • 进入开始 .fade-enter 的样式

        • 开始过渡阶段 .fade-enter-active

        • 出去终点 .fade-leave-active

        • 这三个样式里面,我们可以任意写样式

        如果文章有帮助到您,请点右侧的推荐关注哈,O(∩_∩)O谢谢~ >>>>

vue组件知识总结的更多相关文章

  1. Vue组件(知识)

    form最后一节. 组件基础 组件的复用:  data必须是函数 组织 通过Prop向子组件传递data 单个根元素 通过event向父组件发送消息: 使用事件抛出一个value, 在组件上用v-mo ...

  2. JS组件系列——又一款MVVM组件:Vue(二:构建自己的Vue组件)

    前言:转眼距离上篇 JS组件系列——又一款MVVM组件:Vue(一:30分钟搞定前端增删改查) 已有好几个月了,今天打算将它捡起来,发现好久不用,Vue相关技术点都生疏不少.经过这几个月的时间,Vue ...

  3. Vue组件库的那些事儿,你都知道吗?

    前段时间一直在研究Vue组件库,终于在组内派上了用场.来给大家贡献一篇关于Vue组件库的相关知识.经验不多,如果有不合理的地方还请多多指出哦--- 回想一下,在你们公司或者你们小组是否有一个以上的项目 ...

  4. vue初级知识总结

    从我第一篇博客的搭建环境开始,就开始学习vue了,一直想将这些基本知识点整理出来,但是一直不知如何下手,今天刚好实战了两个小demo,所以就想趁这机会将以前的一起整理出来,这是vue最基础的知识,我有 ...

  5. Vue基础知识简介

    基础知识: vue的生命周期: beforeCreate/created.beforeMount/mounted.beforeUpdate/updated.beforeDestory/destorye ...

  6. 阿里oss上传图片react组件alioss-react,vue组件alioss-vue (不用我先收藏着,后端看下前端处理方法)

    1.介绍 最近开发了一个项目,其中需要一个上传图片到阿里云的 oss 上面,就是上传图片到阿里云的 oss 上面. 因为之前开发过 vue 的阿里云 oss 上传,所以直接复制粘 vue 的组件. 因 ...

  7. angular里使用vue/vue组件怎么在angular里用

    欢迎加入前端交流群交流知识&&获取视频资料:749539640 如何在angularjs(1)中使用vue参考: https://medium.com/@graphicbeacon/h ...

  8. vue路由知识整理

    vue路由知识整理 对于单页应用,官方提供了vue-router进行路由跳转的处理.我们已经可以通过组合组件来组成应用程序,当你要把 vue-router 添加进来,我们需要做的是,将组件(compo ...

  9. 认识Vue组件

    前言 Vue.js是一套构建用户界面的渐进式框架(官方说明).通俗点来说,Vue.js是一个轻量级的,易上手易使用的,便捷,灵活性强的前端MVVM框架.简洁的API,良好健全的中文文档,使开发者能够较 ...

随机推荐

  1. Hexo 添加Live2D看板娘

    title: Hexo 添加 Live2D看板娘 二次元什么的最喜欢了[大好きです] 准备 项目地址 live2d模型 部分模型预览 开始 首先进入Hexo博客根目录安装live2d插件 $ npm ...

  2. Java实现日期时间对象的使用

    利用类对象计算日期 在利用Java语言进行信息系统开发中,经常需要对日期进行计算和转换,比如,设置了某活动的开始日期和结束日期,系统需要判断当前是否是该活动时间,在Java开发的信息系统中,通常日期以 ...

  3. [C++ STL] list使用详解

    一.list介绍: List由双向链表(doubly linked list)实现而成,元素也存放在堆中,每个元素都是放在一块内存中,他的内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得 ...

  4. Oracle 参考脚本

    一.创建物化视图 --新建表空间 CREATE TABLESPACE MLOG_TBS LOGGING DATAFILE 'mlog_tbs.dbf' SIZE 32M AUTOEXTEND ON N ...

  5. H5调用百度地图API获取地理位置

    <script src="http://api.map.baidu.com/api?v=2.0&ak=填入申请的AK"></script> < ...

  6. 专题二:HTTP协议详解

    我们在用Asp.net技术开发Web应用程序后,当用户在浏览器输入一个网址时就是再向服务器发送一个HTTP请求,此时就使用了应用层的HTTP协议,在上一个专题我们简单介绍了网络协议的知识,主要是为了后 ...

  7. [ CodeForces 1065 B ] Vasya and Isolated Vertices

    \(\\\) \(Description\) 求一个\(N\)个点\(M\)条边的无向图,点度为 \(0\) 的点最多和最少的数量. \(N\le 10^5,M\le \frac {N\times ( ...

  8. poj1240 Pre-Post-erous!

    思路: 根据前序序列和后序序列递归构造m叉树,确定每个节点的子节点数量.再用组合数公式累乘. 实现: #include <iostream> using namespace std; ][ ...

  9. JNDI链接SQLServer数据库步骤

    1.配置context.xml文件 在我们的WebRoot目录下,就是和WEB-INF同级的目录下,新建一个META-INF的目录(假如不存在),在该目录下创建一个context.xml文件,并且在c ...

  10. iOS从手机相册选择一张照片并显示 Objective-C

    要先给app设置访问相册的权限: 在项目的Info.plist文件里添加Privacy - Photo Library Usage Description权限 ViewController.h: #i ...