кодесурса
«Вью

Основы компонентов

script1adsense2code
script1adsense3code

Базовый пример

Пример компонента Vue приведен ниже:

// this defines a new component called button-counter
Vue.component('button-counter', {
  data: function () {
    return {
      count: 0
    }
  },
  template: '<button v-on:click="count++">I was clicked me {{ count }} times.</button>'
})

Компоненты - это повторно используемые компоненты Vue с именем: в приведенном выше случае <button-counter>. Мы можем компонент как пользовательский элемент внутри корневого экземпляра Vue, который был создан с новым Vue:

HTML

<div id="demo">
  <button-counter></button-counter>
</div>

JS

new Vue({ el: '#demo' })

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

Повторное использование компонентов

Компоненты могут использоваться столько раз, сколько мы хотим:

<div id="demo">
  <button-counter></button-counter>
  <button-counter></button-counter>
  <button-counter></button-counter>
</div>

Всякий раз, когда мы используем компонент, создается новый экземпляр компонента.

данные должны быть функцией

В приведенном выше определении компонента <button-counter> обратите внимание, что данные непосредственно не предоставили объект, например так:

data: {
  count: 0
}

Скорее, опция данных компонента должна быть функцией, чтобы каждый экземпляр поддерживал независимую копию возвращенного объекта данных:

data: function () {
  return {
    count: 0
  }
}

Если позднее у нас не было правила, мы запустим изменение данных всех других экземпляров.

Организация компонентов

Приложения обычно организованы в виде дерева вложенных компонентов:

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

Чтобы использовать эти компоненты, вы должны зарегистрировать их. Эта регистрация может быть либо глобально, либо локально. Для глобальной регистрации синтаксис:

Vue.component('my-component-name', {
  // ... options ...
})

Передача данных в дочерние компоненты с помощью реквизита

Компоненты бесполезны, если мы не можем передать им данные. Для передачи данных мы используем реквизит. Реквизиты - это пользовательские атрибуты, которые вы можете зарегистрировать в компоненте. Когда мы передаем значение в атрибут prop, оно становится свойством в экземпляре этого компонента:

Vue.component('blog-post', {
  props: ['title'],
  template: '<h3>{{ title }}</h3>'
})

Компонент может иметь более одной опоры, и любой может быть передан любой опоре.

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

<blog-post title="My journey with Vue"></blog-post>
<blog-post title="Blogging with Vue"></blog-post>
<blog-post title="Why Vue is so fun"></blog-post>

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

new Vue({
  el: '#blog-post-demo',
  data: {
    posts: [
      { id: 1, title: 'My journey with Vue' },
      { id: 2, title: 'Blogging with Vue' },
      { id: 3, title: 'Why Vue is so fun' }
    ]
  }
})

А затем отрендерить компонент для каждого сообщения:

<blog-post
  v-for="post in posts"
  v-bind:key="post.id"
  v-bind:title="post.title"
>>/blog-post>

Мы всегда можем использовать директиву v-bind для динамической передачи реквизита.

Единственный корневой элемент

Когда мы создаем компонент <blog-post>, наш шаблон будет не только содержать заголовок.

Он должен включать как минимум содержание сообщений. Но бегущий фрагмент ниже:

<h3>{{ title }}</h3>
<div v-html="content"></div>

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

Когда масштаб компонента увеличивается ниже, это хорошая практика:

<blog-post
  v-for="post in posts"
  v-bind:key="post.id"
  v-bind:post="post"
></blog-post>
Vue.component('blog-post', {
  props: ['post'],
  template: `
    <div class="blog-post">
      <h3>{{ post.title }}</h3>
      <div v-html="post.content"></div>
    </div>
})

Прослушивание событий дочерних компонентов

В компоненте есть некоторые функции, которые требуют обратной связи с родителем. Например, мы можем поддержать функцию, добавив свойство данных postFontSize в родительский объект:

new Vue({
  el: '#blog-posts-events-demo',
  data: {
    posts: [/* ... */],
    postFontSize: 1
  }
})

Затем это можно использовать в шаблоне для управления размером шрифта в блоге:

<div id="blog-posts-events-demo">
  <div :style="{ fontSize: postFontSize + 'em' }">
   <blog-post
      v-for="post in posts"
      v-bind:key="post.id"
      v-bind:post="post"
    ></blog-post>
  </div>
</div>

Затем мы можем добавить кнопку, чтобы увеличить текст перед содержанием каждого сообщения:

Vue.component('blog-post', {
  props: ['post'],
  template: `
    <div class="blog-post">
      <h3>{{ post.title }}</h3>
      <button>
        Enlarge text
      </button>
      <div v-html="post.content"></div>
    </div>
})

Кнопка в настоящее время ничего не делает, если мы хотим получить что-то для родителя, мы используем директиву v-on:

<blog-post
  ...
  v-on:enlarge-text="postFontSize += 0.1"
></blog-post>

Чтобы дочерний компонент отправлял событие, мы используем встроенный метод $ emit и передаем имя элемента:

<button v-on:click="$emit('enlarge-text')">
  Enlarge text
</button>

Создание значения с событием

Иногда полезно выдавать определенное значение вместе с событием: мы можем передать значение как 2-й параметр в $ emit.

<button v-on:click="$emit('enlarge-text', 0.1)">
  Enlarge text
</button>

И затем всякий раз, когда мы слушаем события в родительском объекте, мы можем получить доступ к значению излучаемых событий, используя $ event

<blog-post
  ...  v-on:enlarge-text="postFontSize += $event"
></blog-post>

Использование v-модели на компонентах

Всякий раз, когда мы используем v-модель на компонентах, она делает это:

<custom-input
  v-bind:value="searchText"
  v-on:input="searchText = $event"
></custom-input>

Для этого необходимо, чтобы <input> внутри компонента:

  • Привязать к значению опору атрибута значения
  • При вводе он генерирует свое собственное событие ввода с новым значением

Случай сценария:

Vue.component('custom-input', {
  props: ['value'],
  template: 
    <input
      v-bind:value="value"
      v-on:input="$emit('input', $event.target.value)"
    >
})

v-модель теперь должна отлично работать с этим компонентом:

<custom-input v-model="searchText"></custom-input>

Распределение контента через слоты

<slot> позволяет очень просто передавать контент компоненту:

Vue.component('alert-box', {
  template: 
    <div class="demo-alert-box">
      <strong>Error!</strong>
      <slot></slot>
    </div>
})

Динамические Компоненты

Vue <component> предоставляет атрибут is, который позволяет нам динамически переключаться между компонентами:

<component v-bind:is="currentTabComponent"></component>

Предостережения в разборе шаблонов DOM

Элементы HTML, такие как <ol>, <ul>, <table> и <select>, имеют ограничения на элементы, которые могут появляться внутри.

Но специальный атрибут is помогает преодолеть эти ограничения следующим образом:

<table>
  <tr is="blog-post-row"></tr>
</table>

Новый контент: Composer: менеджер зависимостей для PHP , R программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code