vue(11)----自定义组件,指令,事件

自定义组件

案例: 封装一个 Loading 组件
Loading是用来做什么的?
基于用户体验

  1. 第三方的ui库/组件库
  2. 自定义封装
    1. 过程:
    2. 创建一个目录文件夹,称之为Loading
    3. 在loading中创建一个叫做component目录,用来放模板
    4. 在Loading目录下创建一个index.js
    ~ import Vue from 'vue'
      import tpl from './component/index.html'
      const Loading = {
        // 自定义封装组件,这个loading对象中必须有一个关键key
        install () {
          Vue.component( 'Loading', {
            template: tpl
          })
        }
      }
      export default Loading
    

自定义指令

  1. 指令是用来操作DOM
  2. 指令的使用形式: 属性
  3. 自定义指令方式有两种:
    • 全局注册指令
      Vue.directive( 指令的名称, 指令的配置项 )
    • 局部注册指令
      directives: {
      ‘指令名称’: 指令的配置项
      }
  • 指令的配置项提供了5个钩子函数
  1. bind ( el,binding,vnode,oldVnode){}//调用一次,指令一绑定在元素身上就会触发。

    1. el 指令绑定的元素
    2. binding 指令的详细信息
    3. vnode 当前绑定元素的信息
    4. oldVnode 上一个绑定元素的信息
  2. inserted(el,binding,vnode,oldVnode){}//当前绑定的元素插入父节点时调用。

    1. el 指令绑定的元素
    2. binding 指令的详细信息
    3. vnode 当前绑定元素的信息
    4. oldVnode 上一个绑定元素的信息
  3. update (el,binding,vnode,oldVnode){}//当前指令绑定的元素发生改变。

    1. el 指令绑定的元素
    2. binding 指令的详细信息
    3. vnode 当前绑定元素的信息
    4. oldVnode 上一个绑定元素的信息
  4. componentUpdated(el,binding,vnode,oldVnode){}//当前绑定元素发生改变,或是子元素发生改变。

  5. unbind (el,binding,vnode,oldVnode){}//组件销毁时触发。

  • 案例:打开网页,input自动获得焦点
<script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script>
  <style>
    .box{
      width: 300px;
      height: 300px;
      background: blue;
    }
  </style>
</head>
<body>
  <div id="app">
    <div class="box">
     <button  @click = 'flag = false'> 点击 </button>
     <input type="text"  v-if = "flag" v-focus.st v-model = "msg">
     <input type="text"  v-if = "flag" v-focus v-model = "msg">
    </div>
  </div> 
</body>

    <script>
        //全局定义自定义指令
        Vue.directives('focus', {
            bind(el, binding, vnode, oldVnode) {
            },
            inserted(el, binding, vnode, oldVnode) {
                el.focus()
                if (binding.modifiers.yyb) {
                    el.style.color = 'green';
                } else {
                    el.style.color = 'red';
                }
            },
            update(el, binding, vnode, oldVnode) {
            },
            componentUpdated(el, binding, vnode, oldVnode) {
            },
            unbind(el, binding, vnode, oldVnode) {
            }
        })
        new Vue({
            el: '#app',
            data: {
                msg: 1000,
                flag: true
            },
            //局部自定义指令
            directives: {
                'focus': {
                    bind() {
                    },
                    inserted() {
                    },
                    update() {
                    },
                    componentUpdated() {
                    },
                    unbind() {
                    }
                }
            }
        })
    </script>

自定义事件

v-on:aa = ‘fn’

  • 自定义事件的使用形式
    1. 组件生命周期中发布事件,通过某一个事件处理程序调用
    2. 绑定在组件身上 ,通过 v-on 绑定

<div id="app">
    <button @click = 'fn'> 点击 </button>
  </div>
  
 var vm = new Vue({
    el: '#app',
    methods: {
      fn () {
        this.$emit('aa')
      }
    },
    mounted () {
      this.$on('aa',function(){
        alert('aa')
      })
    }
  })

组件通信

父子组件通信

  • 父子组件通信: 父组件将自己的数据传递给子组件

    1. 父组件将自己的数据通过属性绑定的形式传递给子组件
      • <Son :aa = "money"></Son>
    2. 子组件在自己的配置项中通过 props 来接收这个属性
       Vue.component('Son',{
           template: '#son',
           // props: ['aa'],
           props: {
             // 属性: 属性的数据类型  给数据做属性验证,验证数据类型
             'aa': Number 
           }
         })
      
    3. 这个属性可以直接向全局变量一样使用
      • <p>我老爸给了我:{{ aa }}钱</p>
    Vue.component('Father',{
        template: '#father',
        data () {
          return {
            money: '1000'
          }
        }
      })
      Vue.component('Son',{
        template: '#son',
        // props: ['aa'] //可以写数组也可以写对象,如果写对象,验证数据类型
        props: {
          // 属性: 属性的数据类型  给数据做属性验证,验证数据类型
          'aa': Number 
        }
      })
      new Vue({
        el: '#app'
    

子父组件通信

  1. 自定义事件
  • 流程
    1. 父组件中定义一个数据,然后在methods定义一个方法用来修改这个数据
         Vue.component('Father',{
            template: '#father',
            data () {
              return {
                num: 0
              }
            },
            methods: {
              add ( val ) {
                console.log('add')
                this.num += val
              }
            }
          })
      
    2. 父组件通过自定义事件的形式,将父组件的一个方法传递给子组件
      • <Son @aa = 'add'></Son>
    3. 子组件可以通过 this.$emit( 自定义事件名称,参数1,参数2…) 来订阅这个自定义事件
      • this.$emit('aa',this.money)
  1. 父组件将一个方法直接通过单向数据绑定的形式传递给子组件,子组件通过props接收,然后直接使用

     <div id="app">
        <Father></Father>
    </div>
    <template id="father">
            <div>
              <h3> 这里是father </h3>
              <p> 我这里有 {{ money }} 钱 </p>
              <hr>
              <Son :add = 'add'></Son>
            </div>
          </template>
    <template id="son">
            <div>
              <h3> 这里是son </h3>
              <button @click = "add( money )"> give money </button>
            </div>
          </template>
    
    <script>
        Vue.component('Father', {
            template: '#father',
            data() {
                return {
                    money: 0,
                }
            },
            methods: {
                add(val) {
                    this.money += val;
                }
            }
        });
        Vue.component('Son', {
            template: '#son',
            data() {
                return {
                    money: 1000
                }
            },
            props: ['add'],
        })
        new Vue({
            el: '#app',
        })
    </script>
    
  2. 父组件可以将一个对象型的数据传递给子组件,子组件修改了这个数据,父组件也同样会修改

  • 这个形式违反了单向数据流,用的少

非父子通信

  1. 非父子组件通信第一种形式:ref链绑定。ref不仅可以绑定组件,也可以绑定普通元素。
     <div id="app">
    <Brother ref = "brother"></Brother>
    <hr>
    <Sister ref = 'sister'></Sister>
    <div ref = 'box'></div>
  </div>
  <template id="brother">
    <div>
      <h3> 这里是brother </h3>
      <button @click = 'give'> give sister  money </button>
    </div>
  </template>
  <template id="sister">
    <div>
      <h3> 这里是sister </h3>
      <p> 我有 {{ jk }} </p>
    </div>
  </template>
</body>
<script>
  Vue.component('Brother',{
    template: '#brother',
    data () {
      return {
        money: 1000
      }
    },
    methods: {
      give () {
        this.$parent.$refs.sister.jk = this.money
      }
    }
  })
  Vue.component('Sister',{
    template: '#sister',
    data () {
      return {
        jk: 0
      }
    }
    
  })

  new Vue({
    el: '#app',
    mounted () {
      console.log('====================================');
      console.log(this.$refs);
      console.log('====================================');
    }
  })
</script>
  1. 非父子组件通信第二种形式: 事件总线
    • 事件的发布: $on
    • 事件的订阅: $emit
    • 通过 new Vue 在得到另外一个实例
 <div id="app">
    <Brother></Brother>
    <hr>
    <Sister></Sister>
  </div>
  <template id="brother">
    <div>
      <h3> 这里是brother </h3>
      <button @click = 'give'> give </button>
    </div>
  </template>
  <template id="sister">
    <div>
      <h3> 这里是sister </h3>
      <p> 弟弟给了我 {{ jk }} </p>
    </div>
  </template>
</body>
<script>
  var bus = new Vue()
  Vue.component('Brother',{
    template: '#brother',
    data () {
      return {
        money: 1000
      }
    },
    methods: {
      give () {
       bus.$emit('aa',this.money)
      }
    }
  })
  Vue.component('Sister',{
    template: '#sister',
    data () {
      return {
        jk: 0
      }
    },
    mounted () {
      bus.$on('aa',( val ) => {
        this.jk += val
      })
    }
  })

  new Vue({
    el: '#app',
  })
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值