详解vue.js2.0父组件点击触发子组件方法


Posted in Javascript onMay 10, 2017

之前关于vue.js2.0父组件的一点学习,最近需要回顾,就顺便发到随笔上了

<body> 
  <div id="counter-event-example"> 
   <p>{{ total }}</p> 
   <button-counter v-on:ee="incrementTotal"></button-counter> 
   <button-counter v-on:ee="incrementTotal"></button-counter> 
  </div> 
 
  <script> 
    Vue.component('button-counter', { 
     template: '<button v-on:click="increment">{{ counter }}</button>', 
     data: function () { 
      return { 
       counter: 0 
      } 
     }, 
     methods: { 
      increment: function () { 
       this.counter += 1 
       this.$emit('ee', 'cc' ) 
      } 
     }, 
    }) 
    new Vue({ 
     el: '#counter-event-example', 
     data: { 
      total: 'arg' 
     }, 
     methods: { 
      incrementTotal: function (b) { 
       this.total = b + '1'; 
      } 
     } 
    }) 
  </script> 
</body>

子组件通过$emit触发父组件的事件,$emit后面的参数是向父组件传参,注意,父组件的事件处理函数直接写函数名即可,不要加(),参数直接传递到了父组件的methods的事件处理函数了。

另外,写一个小拾遗。vue子组件用了定义模板组件功能,然后在父组件里定义一个HTML元素绑定这个子组件后才能在父组件通过这个HTML元素使用。

再说一个非常方便的v-ref

<!DOCTYPE html> 
<html lang="en"> 
<head> 
  <meta charset="UTF-8"> 
  <title>Document</title> 
  <script src="vue.js"></script> 
</head> 
<body> 
<div id="parent">  
  <input type="text" name="" id="" v-model="msg" /> 
  <input type="button" id="" value="dianji" @click="clickDt" /> 
  <user-profile ref="profile"></user-profile>  
</div>  
  
<script>  
  Vue.component('user-profile', {  
    template: '<span>{{ msg }}</span>',  
    data: function () {  
      return { 
        msg: 123 
      }; 
    },  
    methods: {  
      greet: function (msg) {  
        console.log(msg);  
      }  
    }  
  
  })  
//   var parent = new Vue({el: '#parent'});  
//   var child = parent.$refs.profile;  
//   child.greet();  
  new Vue({ 
    el:"#parent", 
    data:{ 
      msg:"" 
    }, 
    methods: { 
        clickDt(){ 
        this.$refs.profile.greet(this.msg); 
      } 
    } 
  }) 
</script>  
</body> 
</html>

Vue2.0组件间数据传递

Vue1.0组件间传递

  1. 使用$on()监听事件;
  2. 使用$emit()在它上面触发事件;
  3. 使用$dispatch()派发事件,事件沿着父链冒泡;
  4. 使用$broadcast()广播事件,事件向下传导给所有的后代

Vue2.0后$dispatch(),$broadcast()被弃用,见https://cn.vuejs.org/v2/guide/migration.html#dispatch-和-broadcast-替换 

1,父组件向子组件传递场景:Father上一个输入框,根据输入传递到Child组件上。

父组件:

<template>
 <div>
  <input type="text" v-model="msg">
  <br>
  //将子控件属性inputValue与父组件msg属性绑定
  <child :inputValue="msg"></child>
 </div>
</template>
<style>

</style>
<script>
 export default{
  data(){
   return {
    msg: '请输入'
   }
  },
  components: {
   child: require('./Child.vue')
  }
 }
</script>

子组件:

<template>
 <div>
  <p>{{inputValue}}</p>
 </div>
</template>
<style>

</style>
<script>
  export default{
    props: {
     inputValue: String
    }
  }
</script>

2,子组件向父组件传值场景:子组件上输入框,输入值改变后父组件监听到,弹出弹框

 父组件:

<template>
 <div>
//message为子控件上绑定的通知;recieveMessage为父组件监听到后的方法
  <child2 v-on:message="recieveMessage"></child2>
 </div>
</template>
<script>
 import {Toast} from 'mint-ui'
 export default{
  components: {
   child2: require('./Child2.vue'),
   Toast
  },
  methods: {
   recieveMessage: function (text) {
    Toast('监听到子组件变化'+text);
   }
  }
 }
</script>

子组件: 

<template>
 <div>
  <input type="text" v-model="msg" @change="onInput">
 </div>
</template>
<script>
 export default{
  data(){
   return {
    msg: '请输入值'
   }
  },
  methods: {
   onInput: function () {
    if (this.msg.trim()) {
     this.$emit('message', this.msg);
    }
   }
  }
 }
</script>

vue2.0父子组件以及非父子组件如何通信

1.父组件传递数据给子组件

父组件数据如何传递给子组件呢?可以通过props属性来实现

父组件:

<parent>
  <child :child-msg="msg"></child>//这里必须要用 - 代替驼峰
</parent>

data(){
  return {
    msg: [1,2,3]
  };
}

子组件通过props来接收数据:

方式1:

props: ['childMsg']

方式2 :

props: {
  childMsg: Array //这样可以指定传入的类型,如果类型不对,会警告
}

方式3:

props: {
  childMsg: {
    type: Array,
    default: [0,0,0] //这样可以指定默认的值
  }
}

这样呢,就实现了父组件向子组件传递数据.

2.子组件与父组件通信

那么,如果子组件想要改变数据呢?这在vue中是不允许的,因为vue只允许单向数据传递,这时候我们可以通过触发事件来通知父组件改变数据,从而达到改变子组件数据的目的.

子组件:

<template>
  <div @click="up"></div>
</template>

methods: {
  up() {
    this.$emit('upup','hehe'); //主动触发upup方法,'hehe'为向父组件传递的数据
  }
}

父组件:

<div>
  <child @upup="change" :msg="msg"></child> //监听子组件触发的upup事件,然后调用change方法
</div>
methods: {
  change(msg) {
    this.msg = msg;
  }
}

3.非父子组件通信

如果2个组件不是父子组件那么如何通信呢?这时可以通过eventHub来实现通信.

所谓eventHub就是创建一个事件中心,相当于中转站,可以用它来传递事件和接收事件.

let Hub = new Vue(); //创建事件中心

组件1触发:

<div @click="eve"></div>
methods: {
  eve() {
    Hub.$emit('change','hehe'); //Hub触发事件
  }
}

组件2接收:

<div></div>
created() {
  Hub.$on('change', () => { //Hub接收事件
    this.msg = 'hehe';
  });
}

这样就实现了非父子组件之间的通信了.原理就是把Hub当作一个中转站!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript的Function详细
Nov 14 Javascript
js模拟实现Array的sort方法
Dec 11 Javascript
js 替换
Feb 19 Javascript
JavaScript省市级联下拉菜单实例
Feb 14 Javascript
jquery实现图片平滑滚动详解
Mar 22 jQuery
Vue与Node.js通过socket.io通信的示例代码
Jul 25 Javascript
JavaScript中创建原子的方法总结
Aug 26 Javascript
ES6基础之解构赋值(destructuring assignment)
Feb 21 Javascript
详解vue 自定义marquee无缝滚动组件
Apr 09 Javascript
Vue.js构建你的第一个包并在NPM上发布的方法步骤
May 01 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
Sep 24 Javascript
微信小程序学习总结(三)条件、模板、文件引用实例分析
Jun 04 Javascript
详解vue-router 2.0 常用基础知识点之router-link
May 10 #Javascript
JavaScript使用readAsDataURL读取图像文件
May 10 #Javascript
angular.js指令中的controller、compile与link函数的不同之处
May 10 #Javascript
详解vue-router 2.0 常用基础知识点之导航钩子
May 10 #Javascript
详解vue-router 2.0 常用基础知识点之router.push()
May 10 #Javascript
JavaScript通过filereader接口读取文件
May 10 #Javascript
关于vue-router路径计算问题
May 10 #Javascript
You might like
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
PHP远程采集图片详细教程
2014/07/01 PHP
[原创]php实现 data url的图片生成与保存
2016/12/04 PHP
javascript读取RSS数据
2007/01/20 Javascript
两个select之间option的互相添加操作(jquery实现)
2009/11/12 Javascript
jQuery html()等方法介绍
2009/11/18 Javascript
EXT窗口Window及对话框MessageBox
2011/01/27 Javascript
基于jQuery倒计时插件实现团购秒杀效果
2016/05/13 Javascript
js获取元素的外链样式的简单实现方法
2016/06/06 Javascript
jQuery根据name属性进行查找的用法分析
2016/06/23 Javascript
AngularJS基础 ng-copy 指令实例代码
2016/08/01 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
详解如何用模块化的方式写vuejs
2017/12/16 Javascript
JS中Promise函数then的奥秘探究
2018/07/30 Javascript
vue动态改变背景图片demo分享
2018/09/13 Javascript
vue使用Google地图的实现示例代码
2018/12/19 Javascript
关于layui toolbar和template的结合使用方法
2019/09/19 Javascript
[00:57]辉夜杯战队访谈宣传片—VG
2015/12/25 DOTA
利用python操作SQLite数据库及文件操作详解
2017/09/22 Python
python之array赋值技巧分享
2019/11/28 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
2020/01/20 Python
Python线程协作threading.Condition实现过程解析
2020/03/12 Python
Pytorch生成随机数Tensor的方法汇总
2020/09/09 Python
Python爬虫开发与项目实战
2020/12/16 Python
CSS3样式linear-gradient的使用实例
2017/01/16 HTML / CSS
意大利一家专营包包和配饰的网上商店:Borse Last Minute
2019/08/26 全球购物
英国现代、当代和设计师家具店:Furntastic
2020/07/18 全球购物
西班牙在线光学:Visual-Click
2020/06/22 全球购物
事业单位鉴定材料
2014/05/25 职场文书
企业安全生产标语
2014/06/06 职场文书
十佳少年事迹材料
2014/12/25 职场文书
中班下学期幼儿评语
2014/12/30 职场文书
2015年保安个人工作总结
2015/04/02 职场文书
python字典进行运算原理及实例分享
2021/08/02 Python
sql server偶发出现死锁的解决方法
2022/04/10 SQL Server
vue项目如何打包之项目打包优化(让打包的js文件变小)
2022/04/30 Vue.js