zoukankan      html  css  js  c++  java
  • vue 之 插槽

    昨天写代码有这么一行:

    <van-field name="checkbox" label="复选框">
      <template #input>
        <van-checkbox v-model="checkbox" shape="square" />
      </template>
    </van-field>

    我是直接从vant文档示例上拷贝下来的,今天review时候,被问到这个template上加一个#input是什么意思?问的我一脸懵逼,没见过呀,哎呀!

      我什么时候也变成自己写的代码自己不知道咋回事的人了!

    网上查也没有查到,然后以为是vant写法?就把vant源码clone下来开始看,看到这里:

    感觉和slot有关吧,然后demo里有这样的代码:

    <template>
      <demo-block :title="t('insertButton')">
        <van-field
          v-model="sms"
          center
          clearable
          :label="t('sms')"
          :placeholder="t('smsPlaceholder')"
        >
          <template #button>
            <van-button size="small" type="primary">
              {{ t('sendSMS') }}---
            </van-button>
          </template>
        </van-field>
      </demo-block>
    </template>

    然后看组件里:

    // render 里边 
      return (
          <Cell
            icon={this.leftIcon}
            size={this.size}
            center={this.center}
            border={this.border}
            isLink={this.isLink}
            required={this.required}
            clickable={this.clickable}
            titleStyle={this.labelStyle}
            valueClass={bem('value')}
            titleClass={[bem('label', labelAlign), this.labelClass]}
            scopedSlots={scopedSlots}
            arrowDirection={this.arrowDirection}
            class={bem({
              error: this.showError,
              disabled: this.disabled,
              [`label-${labelAlign}`]: labelAlign,
              'min-height': this.type === 'textarea' && !this.autosize,
            })}
            onClick={this.onClick}
          >
            <div class={bem('body')}>
              {this.genInput()}
              {this.showClear && (
                <Icon
                  name="clear"
                  class={bem('clear')}
                  onTouchstart={this.onClear}
                />
              )}
              {this.genRightIcon()}
              {slots('button') && (
                <div class={bem('button')}>{slots('button')}</div>
              )}
            </div>
            {this.genWordLimit()}
            {this.genMessage()}
          </Cell>
        );

    意思就是你给你留个名字叫button的插槽;

    但不自信的我还是在群里问了一下,人家立马就回答了说:

      插槽,不知道?

      插槽的简写

    卧槽,被嘲讽了,但也证实了我的猜想。

    写个demo操练一下吧,

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>插槽</title>
      <style>
        .first{
          background-color: #fff008;
        }
        .second{
          background-color: #7a6ee2;
        }
        .san{
          background-color: #776673;
        }
        .si{
          background-color: #b62846;
        }
        .fifth{
          background-color: #352e28;
        }
      </style>
    </head>
    <body>
      <div id="app">
        <header><h2>插槽用法</h2></header>
        <hello>
          <template> // 进入默认插槽
            <div>wo shi lao si</div>
          </template>
          <template v-slot:laoer> // 进入插槽名字交laoer的插槽,
            <div>wo shi lao er</div>
          </template>
          <template #laosan> // 进入名字叫laosan的插槽
            <div>wo shi lao san</div>
          </template>
          <div v-slot:laowu>wo shi lao wu</div>// 这种写法报错,因为插槽只能写在template上或者组件上
        </hello>
      </div>
      <script src="../../js/vue.js"></script>
      <script>
        Vue.component('hello',{
          data() {
            return {
              msg:'hello'
            }
          },
          template:`
            <div class="parent">
              <p class="first">{{msg}}</p>
              <p class="second"><slot name="laoer"></slot></p>// 插槽
              <p class="san"><slot name="laosan"></slot></p>// 插槽
              <p class="si"><slot></slot></p>// 默认插槽
              <p class="fifth"><slot name="laowu"></slot></p>//插槽
            </div>
          `
        });
        const vm = new Vue({
          el:'#app',
          data:{
            msg:"world"
          }
        })
      </script>
    </body>
    </html>

    vue官网有更详细说明

    over

  • 相关阅读:
    BZOJ1218:[HNOI2003]激光炸弹
    洛谷【P3407】散步
    洛谷【P1142】轰炸
    洛谷【P1358】扑克牌
    洛谷【P1236】算24点
    洛谷【P2003】平板
    TVYJ1266:费解的开关
    POJ1958:Strange Towers of Hanoi
    孤独地、凄惨地AK
    ios---scrollview用法总结
  • 原文地址:https://www.cnblogs.com/rainbowLover/p/13606629.html
Copyright © 2011-2022 走看看