• Vue $emit()不触发方法的原因


    大概的原因总结:

    1. 事件名称不全是小写。事件名称要求全小写。
    2. 不是父子关系。这里的父子关系是严格的父子关系,祖孙关系也不行。只能一层一层触发,这在写树形组件时,很容易掉坑里。
    3. update后面不能有空格;
    4. 父组件没有用 .sync修饰符
    this.$emit('update:show', true)  // 有效,update后面不能加空格
    this.$emit('update: show', true)  // 无效的举例

     

    .sync是vue中用于实现简单的“双向绑定”的语法糖,在平时的开发中是非常使用的。

    vue的prop是单向下行绑定:父级的prop的更新会向下流动到子组件中,但是反过来不行。可是有些情况,我们需要对prop进行“双向绑定”。这个时候,就可以用.sync来解决。

    .sync用法

    <text-document :title.sync="doc.title"></text-document>
    
    当子组件需要更新 title 的值时,它需要显式地触发一个更新事件:
    this.$emit('update:title', newValue)

    这样title的属性在子组件内部更新,父组件也能感知的到,实现了“双向绑定”。

    .sync应运实例

    <template>
        <div class="details">
            <myComponent :show.sync='valueChild' style="padding: 30px 20px 30px 5px;border:1px solid #ddd;margin-bottom: 10px;"></myComponent>
            <button @click="changeValue">toggle</button>
        </div>
    </template>
    <script>
    import Vue from 'vue'
    Vue.component('myComponent', {
          template: `<div v-if="show">
                        <p>默认初始值是{{show}},所以是显示的</p>
                        <button @click.stop="closeDiv">关闭</button>
                     </div>`,
          props:['show'],
          methods: {
            closeDiv() {
              this.$emit('update:show', false); //触发 input 事件,并传入新值
            }
          }
    })
    export default{
        data(){
            return{
                valueChild:true,
            }
        },
        methods:{
            changeValue(){
                this.valueChild = !this.valueChild
            }
        }
    }
    </script>

    注意:如果未触发事件 this.$emit('update:show', false); 则外部感知不到子组件内部对show的改变,依然认为此事的值是true,导致弹框点击打开一次之后,后面再不会打开。

  • 相关阅读:
    软件开发环境-开发环境、测试环境、生产环境的区别
    软件开发环境-开发环境、测试环境、生产环境的区别
    软件开发环境-开发环境、测试环境、生产环境的区别
    Proof of Stake FAQ
    【转】Ouroboros:一个可证明安全的PoS区块链协议 (共识介绍)
    可验证随机函数VRF
    Randao 可证公平随机数(VRF)白皮书
    VRF介绍
    随机数概论——VRF,Commit Reveal,BLS的原理及应用
    『分片技术分析』从分片开始了解区块链扩容方式
  • 原文地址:https://www.cnblogs.com/listen9436/p/13678967.html
Copyright © 2020-2023  润新知