zoukankan      html  css  js  c++  java
  • 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- 600px;
      font-family: Source Sans Pro, Helvetica, sans-serif;
      text-align: center;
    }
    
    #app a {
      color: #42b983;
      text-decoration: none;
    }
    
    .logo {
       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
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
     
  • 相关阅读:
    编译Openmv固件&增加串口
    边缘 AI 平台的比较
    CVPR2021 | 重新思考BatchNorm中的Batch
    ICCV2021 |重新思考人群中的计数和定位:一个纯粹基于点的框架
    ICCV2021 | 重新思考视觉transformers的空间维度
    CVPR2021 | Transformer用于End-to-End视频实例分割
    漫谈CUDA优化
    AAAI 2021 最佳论文公布
    综述专栏 | 姿态估计综述
    为什么GEMM是深度学习的核心
  • 原文地址:https://www.cnblogs.com/cina33blogs/p/7324348.html
Copyright © 2011-2022 走看看