dispatch emit broadcast

1、broadcast 事件广播

遍历寻找所有子孙组件,假如子孙组件和componentName组件名称相同的话,则触发$emit的事件方法,数据为 params.
  如果没有找到 则使用递归的方式 继续查找孙组件,直到找到为止,否则继续递归查找,直到找到最后一个都没有找到为止。 

2、dispatch 查找所有父级,直到找到要找到的父组件,并在身上触发指定的事件。
 @param { componentName } 组件名称
 @param { eventName } 事件名
 @param { params } 参数

vue2.0

父传子:Props
子传父:子:$emit(eventName) 父$on(eventName)
父访问子:ref
非父子组件通信:https://vuefe.cn/guide/components.html#非父子组件通信
vue2.0 移除:1.$dispatch() 2.$broadcast() 3.events

vue1.0

<template>
  <div id="app">
    <p>{{title}}</p>
    <p v-text="title"></p>
    <p v-text="title2"></p>
    <p v-html="title2"></p>
  </div>
</template>
<script>
export default {
  data () {
    return {
      title: ‘this is a title!‘,
      title2: ‘<span>?<span> this is a title!‘
    }
  }
}
</script>
  • {{title}}v-text="title"等同
  • export default最后生成 new vue({ 参数})
  • 新的ES6写法等同于旧的写法
    //新的ES6
    data () {
    return {
      title: ‘this is a title!‘
    }
    }
    //旧的写法
    data: function (){
    return {
      title: ‘this is a title!‘
    }
    }
  • v-html 解析渲染html标签

v-for 及v-bind控制class、v-on绑定事件、v-model双向绑定

<template>
  <div id="app">
    <p>{{title}}</p>
    <!-- <p v-text="title"></p> -->
   <!-- <p v-text="title2"></p> -->
    <!-- <p v-html="title2"></p> -->
    <input v-model="newItem" v-on:keyup.enter="addNew">
    <ul>
      <li v-for = "item in items" v-bind:class="{finished: item.isFinished}" v-on:click="toggleFinished(item)">
        {{item.label}}
      </li>
    </ul>
  </div>
</template>
<script>
import Store from ‘./store‘
export default {
  data () {
    return {
      title: ‘this is a todolist!‘,
      title2: ‘<span>?<span> this is a todolist!‘,
      items: Store.fetch(),
      newItem: ‘‘
    }
  },
  watch: {
    items: {
      handler (items) {
        Store.save(items)
      },
      deep: true
    }
  },
  methods: {
    toggleFinished (item) {
      item.isFinished = !item.isFinished
    },
    addNew () {
      this.items.push({
        label: this.newItem,
        isFinished: false
      })
      this.newItem = ‘‘
    }
  }
}
</script>

<style>
.finished{
  text-decoration: underline;
}

html {
  height: 100%;
}

body {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
}

#app {
  color: #2c3e50;
  margin-top: -100px;
  max-width: 600px;
  font-family: Source Sans Pro, Helvetica, sans-serif;
  text-align: center;
}

#app a {
  color: #42b983;
  text-decoration: none;
}

.logo {
  width: 100px;
  height: 100px
}
</style>

store.js

const STORAGE_KEY = ‘todos-vuejs‘
export default {
    fetch () {
        return JSON.parse(window.localStorage.getItem(STORAGE_KEY) || ‘[]‘)
    },
    save (items) {
        window.localStorage.setItem(STORAGE_KEY, JSON.stringify(items))
    }
}
  • v-bind:class简写:class
  • v-on:click简写@click
  • v-on:keyup.enter简写@keyup.enter 回车keyup事件
  • v-model 双向绑定

JSON.parse()和JSON.stringify()

  • parse用于从一个字符串中解析出json 对象。例如
    var str=‘{"name":"cpf","age":"23"}‘

经 JSON.parse(str) 得到:

Object: age:"23"
        name:"cpf"
        _proto_:Object

ps:单引号写在{}外,每个属性都必须双引号,否则会抛出异常

  • stringify用于从一个对象解析出字符串,例如

var a={a:1,b:2}

经 JSON.stringify(a)得到:

“{“a”:1,"b":2}”

自定义事件

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

父组件向子组件传递

1、采用props

父组件

<component-a msgfromfather=‘you die!!!!‘></component-a>

子组件

<template>
  <div class="hello">
    <h1>{{ msgfromfather }}</h1>
    <button v-on:click="onClickMe">click!</button>
  </div>
</template>

<script>
export default {
  data () {
    return {
    }
  },
  props: [‘msgfromfather‘],
  methods: {
    onClickMe () {
      console.log(this.msgfromfather)
    }
  }
}
</script>
<style scoped>
h1 {
  color: #42b983;
}
</style>
  • props监听父组件传递过来的信息
  • 传递过来后,可直接引用,就如已经传递过来数据塞到data
2、使用event,$broadcast()从父组件传递消息下去

父组件

<template>
<button v-on:click="talkToMyBoy(‘be a good boy‘)">talkToMyBoy</button>
  </div>
</template>
<script>
import Store from ‘./store‘
import ComponentA from ‘./components/componentA‘
export default {
  components: {
    ComponentA
  },
  methods: {
    talkToMyBoy (msg) {
      //console.log(msg);
      this.$broadcast(‘onAddnew‘,msg)
    }
  }
}
</script>

子组件

<template>
  <div class="hello">
    <h1>{{ listentomyfather }}</h1>
  </div>
</template>
<script>
export default {
  data () {
    return {
      listentomyfather: ‘Hello from componentA!‘
    }
  },
  events: {
    ‘onAddnew‘ (msg) {
      //console.log(msg)
      this.listentomyfather = msg
    }
  }
}
</script>

子组件向父组件传递

1.子组件$emit()触发,父组件$on()监听
<template>
  <div class="hello">
    <button v-on:click="onClickMe">telltofather</button>
  </div>
</template>

<script>
export default {
  methods: {
    onClickMe () {
      this.$emit(‘child-tell-me-something‘,this.msg)
    }
  }
}
</script>

父组件

<template>
<div id="app">
<p>child tell me: {{childWords}}</p>
<component-a v-on:child-tell-me-something=‘listenToMyBoy‘></component-a>
</div>
</template>

<script>
import Store from ‘./store‘
import ComponentA from ‘./components/componentA‘
export default {
  components: {
    ComponentA
  },
  data () {
    return {
      childWords: ‘‘
    }
  },
  methods: {
    listenToMyBoy (msg) {
      this.childWords = msg
    }
  }
}
</script>
2.不使用v-on,使用event ,子组件$dispatch(),从子组件传递消息上去

子组件

<template>
  <div class="hello">
    <button v-on:click="onClickMe">talktomyfather</button>
  </div>
</template>

<script>
export default {
  methods: {
    onClickMe () {
      this.$dispatch(‘child-tell-me-something‘,this.msg)
    }
  }
}
</script>

父组件

<template>
  <div id="app">
    <p>child tell me: {{childWords}}</p>
    <component-a></component-a>
  </div>
</template>

<script>
import Store from ‘./store‘
import ComponentA from ‘./components/componentA‘
export default {
  components: {
    ComponentA
  },
  data () {
    return {
      childWords: ‘‘
    }
  },
  events: {
    ‘child-tell-me-something‘ (msg) {
      this.childWords = msg
    }
  }
}
</script>

作者:俊瑶先森
链接:http://www.jianshu.com/p/240125faeb79
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 
时间: 2024-10-26 13:31:35

dispatch emit broadcast的相关文章

vue2.0弃用$dispatch和$broadcast

$dispatch 和 $broadcast 已经被弃用.请使用更多简明清晰的组件间通信和更好的状态管理方案,如:Vuex. 因为基于组件树结构的事件流方式实在是让人难以理解,并且在组件结构扩展的过程中会变得越来越脆弱.这种事件方式确实不太好,我们也不希望在以后让开发者们太痛苦.并且$dispatch 和 $broadcast 也没有解决兄弟组件间的通信问题. 对于$dispatch 和 $broadcast最简单的升级方式就是:通过使用事件中心,允许组件自由交流,无论组件处于组件树的哪一层.由

vue之自行实现派发与广播-dispatch与broadcast

要解决的问题 主要针对组件之间的跨级通信 为什么要自己实现dispatch与broadcast? 因为在做独立组件开发或库时,最好是不依赖第三方库 为什么不使用provide与inject? 因为它的使用场景,主要是子组件获取上级组件的状态,跨级组件间建立了一种主动提供与依赖注入的关系. 然后有两种场景它不能很好的解决: 父组件向子组件(支持跨级)传递数据: 子组件向父组件(支持跨级)传递数据. 代码如下: emitter.js function broadcast(componentName,

AngularJS里面$emit, $broadcast,$on,$http.Jsonp,constant是使用笔记

本片主要介绍$emit, $broadcast,$on经常开发的用法! 这张图差不多表明了$emit, $broadcast在aj里面的机制和用场! 这篇文章介绍了aj里面使用jsonp的原理和注意的地方! 下面直接显示下我运行起来的界面! 然后贴上DOM和js代码,本篇不多说,分享一些常用的东西! DOM+js  代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U

父子间通信四 ($dispatch 和 $broadcast用法)

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>js测试父子之间通信</title> <script type="text/javascript" src="lib/boot.js"></script> <style> .box{

$emit,$broadcast,$on用法,来源于http://www.tuicool.com/articles/qIBNve

$emit只能向parent controller传递event与data $broadcast只能向child controller传递event与data $on用于接收event与data app.controller('SelfCtrl', function($scope) { $scope.click = function () { $scope.$broadcast('to-child', 'child'); $scope.$emit('to-parent', 'parent');

angularjs中的事件传播$emit,$broadcast,$on

在这里写的技术点 一部分参考AngularJs权威教程一部分参考的是其它的博主的知识点 事件 :如同浏览器响应浏览器层的事件,比如鼠标点击.页面滚动那样,Angular应用也可以响应Angular事件.       这使我们在我们应用中嵌套各组件之间进行通信,即使这些组件在创建的时候并未考虑其他组件.我们可以认为事件是在应用中传播的事件信息片段,通常包含应用中发生的事件信息 注意: AnjularJs事件系统并不与浏览器中的事件系统相通,这意问着我们只能在作用域上监听Angular事件而不是在D

Angular中Controller之间的信息传递(第二种办法):$emit,$broadcast,$on

此处不做详细讲解,提供一个小例子,看了便懂 <html ng-app=""> <div ng-controller="ctrlController"> <div ng-controller="ctrl1Controller"></div> <div ng-controller="ctrl2Controller"></div> </div> &l

$on , $emit , $broadcast , $apply

$scope.$on('事件名称',function(event,data){ //监听事件 }); $scope.$emit('事件名称','传递的数据');//子元素向父元素发送事件请求,传递数据; $scope.$broadcast('事件名称','传递的数据');//父元素向子元素发送事件请求,传递数据; $scope.$apply();//当数据值发送改变时,及时更新数据; 例子: <!DOCTYPE html> <html lang="en"> &l

angular之$broadcast、$emit、$on传值

文件层级 index.html <!DOCTYPE html> <html ng-app="nickApp"> <head> <meta charset="UTF-8"> <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width"