Vue 2.0 入门系列(7)组件实例之模态框

演示

本节要实现的是一个模态框组件,效果如下:

clipboard.png

主要功能如下:

  • 用户点击按钮,激活模态框

  • 模态框可以自定义消息

  • 提供关闭模态框的按钮

参考的 bulma 样式如下:

<div class="modal is-active">
  <div class="modal-background"></div>
  <div class="modal-content">
    <!-- 自定义模态框内容 -->
  </div>
  <button class="modal-close"></button>
</div>

实现

首先,是用户点击按钮,显示模态框:

<div id="root" class="container">
    <button type="button" class="button is-primary" @click="show()">显示</button>
    <zen-modal v-if="showModal"></zen-modal>
</div>

<script type="text/javascript">
    Vue.component('zen-modal',{
        template: `
            <div class="modal is-active">
              <div class="modal-background"></div>
              <div class="modal-content">
                  <div class="box">
                      <slot>默认模态框内容</slot>
                  </div>     
              </div>
              <button class="modal-close"></button>
            </div>
        `
    });
    var vm = new Vue({
        el:"#root",
        data: {
            showModal:false
        },
        methods:{
            show(){
                this.showModal = true;
            }
        }

    });

</script>

到这一步,用到的都是前几讲学过的知识:

  • 使用 slot 占位;

  • 通过 v-if 来决定模态框是否显示;

难点就在于模态框的关闭,这个过程涉及到了「组件与实例之间的交互」:用户点击关闭按钮(组件)后,要向父实例传递一个信号,令其不显示组件。

这个与上一节学过的相反:上一节是实例通过属性方式传递数据给组件(使用 props),这一节则是组件传递数据给实例。Vue 提供了解决方案:

  • 组件中使用 $emit 来触发事件;

  • 实例中使用 v-on 来监听该事件

完整实例如下:

<body>
    <div id="root" class="container">
        <button type="button" class="button is-primary" @click="show()">显示</button>
        <zen-modal v-if="showModal" @fireclose="showModal = false"></zen-modal>
    </div>

    <script type="text/javascript">
        Vue.component('zen-modal',{
            template: `
                <div class="modal is-active">
                  <div class="modal-background"></div>
                  <div class="modal-content">
                      <div class="box">
                          <slot>默认模态框内容</slot>
                      </div>     
                  </div>
                  <button class="modal-close" @click="$emit('fireclose')"></button>
                </div>
            `
        });
        var vm = new Vue({
            el:"#root",
            data: {
                showModal:false
            },
            methods:{
                show(){
                    this.showModal = true;
                }
            }

        });

    </script>

说明:

  • 用户点击关闭模态框时候,触发「fireclose」事件;

  • 父实例监听该事件,设置 showModal 的值为 false

总结一下组件的内部通信(即组件与它的实例):

  • 实例传递数据给组件:用 props 声明

  • 组件传递数据给实例:用 $emitv-on


附录:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值