(20)深入理解 Vue 组件——⑦ 作用域插槽 | Vue 基础理论实操

3,857 阅读1分钟
本文版权归 “公众号 | 前端一万小时” 所有,欢迎转载!

转载请注明出处,未经同意,不可修改文章内容。

🔥🔥🔥本系列文章已在“公众号 | 前端一万小时”更新完毕,有需要的小伙伴可按需前往查看。

🔥🔥🔥“前端一万小时”两大明星专栏——“从零基础到轻松就业”、“前端面试刷题”,已于本月大改版,合二为一,干货满满,欢迎点击公众号菜单栏各模块了解。


🔗本阶段对应的“官方文档”阅读 (❗️本知识点 Vue 2.6.0 有更新,本篇先熟悉什么是“作用域插槽”!)

1 为什么需要“作用域插槽”

先看以下代码:

<body>
  <div id="root">
    <child></child>
  </div>
  <script>
    Vue.component("child", {
      data: function() {
        return {
          list: [1, 2, 3, 4]
        }
      },
      template: `<div>
                   <ul>
                     <li v-for="item of list">{{item}}</li>
                   </ul>
                 </div>`
    })

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

20-01.png

❓以上代码可以正常的显示列表,但现在我有一个需求:

这个 child 组件有可能在很多的地方被调用,而我希望:在不同的地方调用 child 时,这个“列表的循环”的样式是怎样的,不是由子组件 child 控制,而是外部告诉我们子组件的每一项应该怎么渲染!

<body>
  <div id="root">
    <child> <!-- 1️⃣首先,父组件调用子组件的时候,给子组件传了一个“插槽”,
						这个“插槽”叫做“作用域插槽”。 -->
      <template slot-scope="props"> <!-- 2️⃣“作用域插槽”必须是一个用占位标签 template 
																		包裹的内容!
                                    3️⃣同时,这个插槽要声明,我要从子组件接收的数据
																		都放在 props 里边; -->
        
        <h1>{{props.item}}</h1> <!-- 4️⃣然后,还要告诉子组件一个模板的信息,我们接收到的数据
        												应该以“h1 标签包裹数据 props.item ”的方式展示; -->
      </template>
    </child>
  </div>
  <script>
    Vue.component("child", {
      data: function() {
        return {
          list: [1, 2, 3, 4]
        }
      },

      template: `<div>
                   <ul>
                     <slot 
                       v-for="item of list"
                       :item=item  
                     ></slot>
                   </ul>
                 </div>`  
    }) /*
    	 🚀这段代码的意思:这个 child 组件去做一个列表的循环,但列表项中的每一项怎么“显示”,我并不关心;
       ❗️具体要怎么显示,由外部来告诉我怎么显示。
        */

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

20-02.png

祝好,qdywxs ♥ you!