14.占位区间命名

未匹配的标注
  • 本系列文章为laracasts.com 的系列视频教程——Learn Vue 2: Step By Step 的学习笔记。若喜欢该系列视频,可去该网站订阅后下载该系列视频,支持正版
  • 视频源码地址:github.com/laracasts/Vue-Forms
  • 项目初始版本为Vue 2.1.3,教程还在更新中。

本节说明

  • 对应第 14 小节:Named Slots in Nutshell

本节内容

在之前的小节中,我们曾经利用Vue<slot>元素来显示组件中的插值。但是我们并没有将插值细分成例如titlecontent等更细粒度的元素,本节我们来做这样的事。我们的例子从 Bulma 网站选取,引入样式跟组件:

index.html

<!DOCTYPE html>

<html>
    <head>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.2.3/css/bulma.css">
    </head>

    <body>
        <div id="root" class="container">
            <modal></modal>
        </div>

        <script src="https://unpkg.com/vue@2.1.3/dist/vue.js"></script>

        <script src="main.js"></script>
    </body>
</html>

编写组件:

  Vue.component('modal',{
    template:`
    <div class="modal is-active">
        <div class="modal-background"></div>
        <div class="modal-card">
            <header class="modal-card-head">
                <p class="modal-card-title">Modal title</p>
                <button class="delete" aria-label="close"></button>
            </header>
            <section class="modal-card-body">
                Temparary content for now
            </section>
            <footer class="modal-card-foot">
                <button class="button is-success">Save changes</button>
                <button class="button">Cancel</button>
            </footer>
        </div>
    </div>
    `
});

new Vue({
    el:'#root'
});

注:需要添加is-active样式类

打开浏览器查看效果:
file
现在我们来动态加载不同的<slot>内容:

main.js

  Vue.component('modal',{
    template:`
    <div class="modal is-active">
        <div class="modal-background"></div>
        <div class="modal-card">
            <header class="modal-card-head">
                <p class="modal-card-title">
                    <slot name="title">
                        Default Title
                    </slot>
                </p>
                <button class="delete" aria-label="close"></button>
            </header>
            <section class="modal-card-body">
                <slot>
                    Default Content.
                </slot>
            </section>
            <footer class="modal-card-foot">
                <slot name="footer">
                    <button class="button is-success">Okay</button>
                </solt>
            </footer>
        </div>
    </div>
    `
});

new Vue({
    el:'#root'
});

我们给每个<slot>都给定了默认值,直接刷新页面:
file
下面我们来进行赋值:

index.html

<!DOCTYPE html>

<html>
    <head>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.2.3/css/bulma.css">
    </head>

    <body>
        <div id="root" class="container">
            <modal>
                <template slot="title">My Title</template>

                something is here.

                <div slot="footer">
                    <button class="button is-success">Save changes</button>
                    <button class="button">Cancel</button>
                </div>
            </modal>
        </div>

        <script src="https://unpkg.com/vue@2.1.3/dist/vue.js"></script>

        <script src="main.js"></script>
    </body>
</html>

刷新页面:
file

值得注意的一点是,我们使用了<template>标签包裹title<div>标签包裹footer,所以在渲染出来的页面是不同的:
file
<template>标签包裹会直接渲染内容,用<div>标签包裹会渲染出<div>标签。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~