Глубокое понимание слота и области действия слота в vue

JavaScript Vue.js
Глубокое понимание слота и области действия слота в vue

Автор/Yunhuang Cup dump

написать впереди

Документация по слотам в vue очень короткая, а язык очень лаконичный.Кроме того, частота и порядок использования общих опций, таких как методы, данные и вычисляемые, отличаются, что может привести к первому контакту со слотами. Разработчики многих людей склонны к идее «Забудьте об этом, вернитесь и изучите, в любом случае, вы уже можете писать базовые компоненты», поэтому они закрыли документацию по Vue.

Фактически, концепция слота очень проста, следующее разделено на три части. Эти три части также написаны в порядке документации Vue.

Прежде чем вводить эти три части, одноклассники, которые не подвергались воздействию слота, будут сделаны простая концепция для слота:Слот, то есть слот, это кусок HTML-шаблона для компонента.Отображается этот шаблон или нет, и как он отображается, определяется родительским компонентом.Фактически, здесь указаны две основные проблемы слота.показать не показатьа такжекак отображать.

Так как слот является шаблоном, то для любого компонента, с точки зрения типа шаблона, его фактически можно разделить нашаблон без слотаа такжеШаблон слотаДве категории. Шаблон без слота относится кHTML-шаблон, такие как 'div, span, ul, table', отображение и скрытие шаблонов, не являющихся слотами, и способ отображения управляются самим компонентом; шаблон слота - это слот, который представляет собой пустую оболочку, потому что его отображение и скрытие и окончательный вариант того, какой HTML-шаблон используется для отображения, контролируется родительским компонентом.Однако позиция отображения слота определяется самим дочерним компонентом, где слот прописан в шаблоне компонента, а где в дальнейшем будет отображаться шаблон, переданный от родительского компонента.

один слот | слот по умолчанию | анонимный слот

Сначала один слот,один слотЭто официальное название vue, но его также можно назвать слотом по умолчанию или, в отличие от именованного слота, мы можем назвать его анонимным слотом. Потому что ему не нужно устанавливать атрибут имени.

Один слот может быть размещен в любом месте компонента, но, как и его имя, в компоненте может быть только один слот этого типа. Соответственно, именованных слотов может быть много, лишь бы имена (атрибуты имен) были разными.

Пример показан ниже.

Родительский компонент:

<template>
    <div class="father">
        <h3>这里是父组件</h3>
        <child>
            <div class="tmpl">
              <span>菜单1</span>
              <span>菜单2</span>
              <span>菜单3</span>
              <span>菜单4</span>
              <span>菜单5</span>
              <span>菜单6</span>
            </div>
        </child>
    </div>
</template>

Сборка:

<template>
    <div class="child">
        <h3>这里是子组件</h3>
        <slot></slot>
    </div>
</template>

В этом примере, поскольку родительский компонент записывает в него HTML-шаблон, дочерний компонентанонимный слотШаблон выглядит следующим образом. То есть используется анонимный слот подкомпонента, который используется следующим шаблоном.

<div class="tmpl">
  <span>菜单1</span>
  <span>菜单2</span>
  <span>菜单3</span>
  <span>菜单4</span>
  <span>菜单5</span>
  <span>菜单6</span>
</div>

Окончательный результат рендеринга показан на рисунке:


注:所有demo都加了样式,以方便观察。其中,父组件以灰色背景填充,子组件都以浅蓝色填充。

именованный слот

Анонимный слот не имеет атрибута имени, поэтому это анонимный слот.Тогда, если слот добавляется с атрибутом имени, он становится именованным слотом. Именованные слоты могут появляться в компоненте N раз в разных позициях. В следующем примере один с двумяименованный слота такжеодин слоткомпонент, эти три слота отображаются родительским компонентом с тем же набором стилей css, разница в том, что содержимое немного отличается.

Родительский компонент:

<template>
  <div class="father">
    <h3>这里是父组件</h3>
    <child>
      <div class="tmpl" slot="up">
        <span>菜单1</span>
        <span>菜单2</span>
        <span>菜单3</span>
        <span>菜单4</span>
        <span>菜单5</span>
        <span>菜单6</span>
      </div>
      <div class="tmpl" slot="down">
        <span>菜单-1</span>
        <span>菜单-2</span>
        <span>菜单-3</span>
        <span>菜单-4</span>
        <span>菜单-5</span>
        <span>菜单-6</span>
      </div>
      <div class="tmpl">
        <span>菜单->1</span>
        <span>菜单->2</span>
        <span>菜单->3</span>
        <span>菜单->4</span>
        <span>菜单->5</span>
        <span>菜单->6</span>
      </div>
    </child>
  </div>
</template>

Сборка:

<template>
  <div class="child">
    // 具名插槽
    <slot name="up"></slot>
    <h3>这里是子组件</h3>
    // 具名插槽
    <slot name="down"></slot>
    // 匿名插槽
    <slot></slot>
  </div>
</template>

Результаты ФИЖ показывают:

Как видите, родительский компонент связывает именованный слот с атрибутом слота в html-шаблоне. Шаблоны HTML без атрибута слота по умолчанию связывают анонимные слоты.

слот с заданной областью | слот с данными

Наконец, есть наши слоты с ограниченной областью действия. Это немного сложнее понять. Официально он называется слотом с прицелом, фактически, по сравнению с двумя предыдущими слотами, мы можем назвать его слотом с данными. Что значит, первые два прописаны в шаблоне компонента

匿名插槽
<slot></slot>
具名插槽
<slot name="up"></slot>

ноТребования к слоту Scope, привязка данных к слоту. То есть вы должны написать что-то вроде этого.

<slot name="up" :data="data"></slot>
 export default {
    data: function(){
      return {
        data: ['zhangsan','lisi','wanwu','zhaoliu','tianqi','xiaoba']
      }
    },
}

Как мы уже говорили ранее, будет ли слот окончательно отображен, зависит от того, написал ли родительский компонент шаблон под дочерним, как показано ниже.

<child>
   html模板
</child>

Если написано, то слот должен что-то отображать в браузере, дело в том, как должен выглядеть HTML, если не написано, то слот — это пустая оболочка без ничего. ОК,говорим что есть html шаблон,то есть родительский компонент будет вставлять шаблон в дочерний компонент.Какой стиль вставляется?Это определяется html+css родительского компонента,но стиль в этот набор Что насчет содержания?

Поскольку слот с заданной областью привязан к набору данных, родительский компонент может его использовать. Итак, ситуация становится такой: за стилем родительского компонента остается последнее слово, но контент может отображать привязку слота дочернего компонента.

Давайте сравним разницу между слотом с ограниченной областью действия, одиночным слотом и именованным слотом. Поскольку одиночный слот и именованный слот не привязаны к данным, шаблон, предоставляемый родительским компонентом, обычно включает в себя как стиль, так и содержимое. Вышеупомянутый пример , текст, который вы видите, «Меню 1» и «Меню 2» — это содержимое, предоставляемое самим родительским компонентом, а слот области — родительский компонент должен предоставить только набор стилей (если слот области используется для привязки учитывая данные).

В следующем примере вы можете видеть, что родительский компонент предоставляет три стиля (flex, ul и прямое отображение), но ни один из них не предоставляет данные.Данные используют массив, ограниченный самим слотом дочернего компонента (тот, который массив кучи имена).

Родительский компонент:

<template>
  <div class="father">
    <h3>这里是父组件</h3>
    <!--第一次使用:用flex展示数据-->
    <child>
      <template slot-scope="user">
        <div class="tmpl">
          <span v-for="item in user.data">{{item}}</span>
        </div>
      </template>

    </child>

    <!--第二次使用:用列表展示数据-->
    <child>
      <template slot-scope="user">
        <ul>
          <li v-for="item in user.data">{{item}}</li>
        </ul>
      </template>

    </child>

    <!--第三次使用:直接显示数据-->
    <child>
      <template slot-scope="user">
       {{user.data}}
      </template>

    </child>

    <!--第四次使用:不使用其提供的数据, 作用域插槽退变成匿名插槽-->
    <child>
      我就是模板
    </child>
  </div>
</template>

Сборка:

<template>
  <div class="child">

    <h3>这里是子组件</h3>
    // 作用域插槽
    <slot  :data="data"></slot>
  </div>
</template>

 export default {
    data: function(){
      return {
        data: ['zhangsan','lisi','wanwu','zhaoliu','tianqi','xiaoba']
      }
    }
}

Результат показан на рисунке:

github

Вышеупомянутые три демонстрации размещены на GitHub, и вы можете получить их, если они вам нужны. Он очень удобен в использовании и представляет собой проект, основанный на vue-cli.

адрес нажмите здесь

наконец

Если эта статья поможет вам понять, что такое слот и прицел-слот, пожалуйста, не скупитесь на поднятые вверх большие пальцы. Программирование важнее на практике, торопитесь и действуйте!

Об авторе

технический блог || GitHub || Домашняя страница Наггетс