1.解释

将父组件的内容插到子组件的对应位置,在子组件中使用slot,父组件使用子组件时,中间的内容部分会替换子组件slot所占位的部分

2.基本使用

  1. <div id="app">
  2. <login>
  3. <h2>我是一个插槽</h2>
  4. </login>
  5. </div>
  6. <template id="login">
  7. <div>
  8. <h1>一切情语皆景语</h1>
  9. <slot></slot>
  10. </div>
  11. </template>
  12. <script src="./js/vue.js"></script>
  13. <script>
  14. const login={
  15. template:"#login",
  16. data(){
  17. return {
  18. }
  19. },
  20. methods:{
  21. }
  22. }
  23. const vm=new Vue({
  24. el:"#app",
  25. data:{
  26. },
  27. components:{
  28. login
  29. }
  30. })

插槽的内容可以是一段文字,也可以是dom节点,除此之外还可以是一个组件

  1. <div id="app">
  2. <login>
  3. <!-- 这里是插槽的位置,但是此时他是一个组件 -->
  4. <txt></txt>
  5. </login>
  6. </div>
  7. <template id="login">
  8. <div>
  9. <h1>一切情语皆景语</h1>
  10. <slot></slot>
  11. </div>
  12. </template>
  13. <template id="txt">
  14. <div>
  15. <p>我是一个txt组件</p>
  16. </div>
  17. </template>
  18. <script src="./js/vue.js"></script>
  19. <script>
  20. const txt={
  21. template:"#txt"
  22. }
  23. const login={
  24. template:"#login",
  25. }
  26. const vm=new Vue({
  27. el:"#app",
  28. components:{
  29. login,
  30. txt
  31. }
  32. })

3.具名插槽

如果需要使用多个插槽,这是就需要用到具名插槽,slot的name与使用插槽slot时的属性值一致,这里的插槽可以使用data里的数据,这里可以将slot换成#

  1. <div id="app">
  2. <h1>这是一个父组件</h1>
  3. <page >
  4. <header slot="header">我是头部内容</header>
  5. </page>
  6. <section>
  7. <page >
  8. <section slot="body">我是主体内容{{book}}</section>
  9. </page>
  10. </section>
  11. <!-- 使用插槽,slot后面的属性值与插槽名相对应 -->
  12. <page >
  13. <footer slot="footer">我是底部内容</footer>
  14. </page>
  15. </div>
  16. <template id="page">
  17. <div>
  18. <!-- 这里用了三个插槽,分别对应三块内容,给插槽起对应的名字 -->
  19. <slot name="header"></slot>
  20. <slot name="body"></slot>
  21. <slot name="footer"></slot>
  22. </div>
  23. </template>
  24. <script src="./js/vue.js"></script>
  25. <script>
  26. const page={
  27. template:"#page",
  28. // data(){
  29. // return{
  30. // book:"wansgu"
  31. // }
  32. // }
  33. }
  34. const vm=new Vue({
  35. el:"#app",
  36. data:{
  37. book:"围城"
  38. },
  39. components:{
  40. page
  41. }
  42. })

4.子组件的数据在父组件插槽中使用

1.首先在组件的slot中需要动态绑定一个属性,将要传入到父组件的插槽位置的数据绑定上去
2.父组件中默认插槽的位置可以使用这个数据,需要在组件上定义一个v-slot=”slotProps”,在slotProps中可以获取到子组件传递过来的数据

  1. <div id="app">
  2. <login v-slot="slotProps">
  3. <div>{{slotProps.user.lastName}}</div>
  4. </login>
  5. </div>
  6. <template id="login">
  7. <span>
  8. <slot :user="user"></slot>
  9. </span>
  10. </template>
  11. <script src="./js/vue.js"></script>
  12. <script>
  13. const login={
  14. template:"#login",
  15. data(){
  16. return{
  17. user:{
  18. firstName:"wang",
  19. lastName:"su"
  20. }
  21. }
  22. }
  23. }
  24. const vm=new Vue({
  25. el:"#app",
  26. components:{
  27. login
  28. }
  29. })