首页 > 其他 > 详细

vue插槽

时间:2019-06-06 00:49:29      阅读:118      评论:0      收藏:0      [点我收藏+]
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div id="app">
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    Vue.component(modal, {
      template: `
        <div>
          <p>first line</p>
          <p>last line</p>
        </div>
      `
    })

    var vm = new Vue({
      el: #app,
    })
  </script>
</body>
</html>

我们先创建了一个vue的实例,并且注册了一个名为modal的全局组件。此时打开浏览器的话页面时没有内容的,我们注册的组件还没放进根实例中。

  <div id="app">
    <modal></modal>
  </div>

   这时,我们把组件放进根实例中打开浏览器便有了效果。如下图所示:

 技术分享图片

 

 

一:单个插槽/匿名插槽

<body>
  <div id="app">
    <modal>哈哈</modal>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    Vue.component(modal, {
      template: `
        <div>
          <p>first line</p>
          <div><slot></slot></div>
          <p>last line</p>
        </div>
      `
    })

    var vm = new Vue({
      el: #app,
    })
  </script>
</body>

我们在first line和last line之间写上一个slot,并在modal填上内容,此时内容就可以通过slot显示出来,我们写的<slot></slot>就叫做单个插槽。如下图所示:

 技术分享图片

我们也可以在modal之前写上标签并且编辑样式

<modal>
  <span style="color: red">哈哈</span>
  <span>呵呵</span>
  <h1>1234</h1>
</modal>

如下图所示 

 技术分享图片

二:但是,我们现在要想在我们的组件中再写一个插槽的话,将另外的内容放进第二个插槽里,我们还能这样写吗?

Vue.component(‘modal‘, {
     template: `
        <div>
          <p>first line</p>
          <div><slot></slot></div>
          <p>last line</p>
          <slot></slot>
        </div>
      `
})

技术分享图片

很显然,我们modal中的内容都显示在了我们的两个匿名插槽中。

这时,我们可以给我们的插槽取个名字,并且将我们modal中自定义的内容加上我们刚才的名字。

技术分享图片
 1 <div id="app">
 2     <modal>
 3       <span style="color: red" slot="s1">哈哈</span>
 4       <span slot="s1">呵呵</span>
 5       <h1 slot="s2">1234</h1>
 6     </modal>
 7   </div>
 8   <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
 9   <script>
10     Vue.component(modal, {
11       template: `
12         <div>
13           <p>first line</p>
14           <div><slot name="s1"></slot></div>
15           <p>last line</p>
16           <slot name="s2"></slot>
17         </div>
18       `
19     })
20 
21     var vm = new Vue({
22       el: #app,
23     })
24 </script>
View Code

这个时候,我们自定义内容就分别显示在我们不同的插槽中啦。

 

三:作用域插槽

假设我们现在想要在插槽中显示动态数据,那么就要用到了作用域插槽。如下图,想在first line和last line中动态显示数据:

 技术分享图片

<body>
  <div id="app">
    <modal>
      <template slot-scope="scope">
        {{scope.msg}}
      </template>
    </modal>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    Vue.component(modal, {
      template: `
        <div>
          <p>first line</p>
          <div><slot :msg="msg"></slot></div>
          <p>last line</p>
        </div>
      `,
      data () {
        return {
          msg: 111
        }
      }
    })

    var vm = new Vue({
      el: #app,
    })
  </script>
</body>

在modal组件中我们需要返回动态数据给插槽,在slot中我们要绑定data中的数据,并在父级modal中添加template,加上slot-scope指令,template中我们可以使用插值表达式显示内容。

 

vue插槽

原文:https://www.cnblogs.com/buqianqian/p/10982412.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!